またもバージョン変更……
ちょっとスマートになったJS Adventure バージョン2.0
先日バージョン変えたばかりですが、コード的に見てスマートさからかけ離れていることを理由にすぐさま
JS Adventureをバージョン2.0を作りました。
サンプルデモもあります。これまでのはゲームイベントの順序をscriptaculousのエフェクトキューで管理するなど、やり方に無駄というかおかしな点が多かったので、まずエフェクトキュー管理を廃止して作り直しています。例によって互換性がないのでバージョンとかいう表現があやしいですが……。
今回のバージョンは新しい機能が出たというわけではないものの、
Prototype.jsの
curryメソッドなど、いままで使途が分からず使ってこなかった機能を使っています。
curryメソッドは、関数をあらかじめ引数を渡した状態のものに変えるメソッド。つまり、いくつか引数が必要だった関数を
curryメソッドで
カリー化することで、引数なしで実行できる関数に作り変えられます。
使い道としては、JavaScriptのネイティブメソッド
setTimeoutを使う時などがあります。setTimeoutのコールバック関数に引数をつけようとすると文字列に直すといったスマートでないやり方が必要だったりしますが、ここでcurryメソッドを使うと、すでに引数を渡した状態の関数に変換でき、見た目もスマートになります。
Prototype.jsのcurryメソッド使用例(Prototype.jsが必要)
arg1 = 100, arg2 = 300;
//関数を文字列にして引数を渡すやり方。ちょっとカッコ悪い
timer1 = setTimeout("myFunction(" + arg1 + ", " + arg2")", 100);
//curryメソッドで関数をラップして無理なく表記した例
timer2 = setTimeout(myFunction.curry(arg1, arg2), 100);
JS Adventureのバージョン2.0では、テキストをタイプ表示するとき、文字列を数文字ずつタイプしては再帰的にメソッドを呼び出す方法を使っているので、curryメソッドが非常に役立ちました。バージョン2.0のデモページでは簡単な設置方法を載せてるので是非ご覧ください。
⇒
JS Adventure 2.0のデモ
早くもバージョン2.0に切り替えた古いサンプル群
JavaScriptでノベルゲーム
JavaScriptでクイズゲーム
:::追記:::
setTimeoutと
setIntervalに渡すことを前提にしたシンプルな関数を作ってみました。
curryTimerCallbackの第1引数にタイマーにかける関数を渡し、第2引数以降にその関数に渡す引数を並べていきます。もちろんライブラリ依存はありません。
curryTimerCallback
function curryTimerCallback() {
var userFunc = arguments[0],
args = Array.prototype.slice.call(arguments, 1);
return function() {
return userFunc.apply(this, args);
};
}
var x = 100, y = 300;
//3秒後に400とアラート
setTimeout( curryTimerCallback( alertAdd, x, y ), 3000 );
function alertAdd(x, y) {
alert(x + y);
}
-
JavaScript/Ajax, ゲーム JavaScript, Prototype, アドベンチャーゲーム