習作あるいはUIのサンプルとしてアイテムエディターを作成しました。
ふと思ったのですが、昔アイテムや魔法の実装としてストラテジーパターンで説明していましたが、エディターで各々の振る舞いを記述するならデータに埋め込んでおいてevalするのが良いんだろうなと思いました。
具体的な方法は、また次回。
アーカイブ
カテゴリー
-
最近の投稿
習作あるいはUIのサンプルとしてアイテムエディターを作成しました。
ふと思ったのですが、昔アイテムや魔法の実装としてストラテジーパターンで説明していましたが、エディターで各々の振る舞いを記述するならデータに埋め込んでおいてevalするのが良いんだろうなと思いました。
具体的な方法は、また次回。
特定の集団を管理するためのPartyオブジェクトについて説明します。
Partyは集団を管理したり、内包する集団に同一の作業を実施したりする機能を提供します。
例えばPartyの全員の死亡を確認したり、全員の状態を変更したりします。
Partyは配列を継承し、Objectを要素として持つことにします。
Partyのメンバーに対して実施したい作業を一つ一つ実装していっても良いのですが、同じような記述がいっぱい増えるだけなのでJavascriptらしい方法でまとめたいと思います。
Javascriptの場合、メソッドも連想配列の要素の一つなのでこれを利用して任意のメソッドを実行します。
Party.prototype.each = function (command, to) { /// <summary> /// 要素全てに commandを実行する /// </summary> /// <param name="command" type="string"> /// 実行するメソッド名を指定 /// </param> /// <param name="to" type="Array"> /// commandへ渡す引数を配列で指定 /// </param> if (!this.length) { return false; } var result = true; for (var i = 0; i < this.length; i++) { if (!this[i][command].apply(this[i], to)) { result = false; } } return result; }
var party = new Party(); party.push( new Player() ); party.each('isDead');
ついでにObjectが持つメソッドのみではなく任意の関数も実行できるように拡張しておきます。
Party.prototype.each = function (command, to) { /// <summary> /// 要素全てに commandを実行する /// </summary> /// <param name="command" type="string/function"> /// 実行するメソッド名を指定 /// </param> /// <param name="to" type="Array"> /// commandへ渡す引数を配列で指定 /// </param> if (!this.length) { return false; } var result = true;
if (typeof command is function) { for (var i = 0; i < this.length; i++) { if (!this[i][command].apply(this[i], to)) { result = false; } } } else { for (var i = 0; i < this.length; i++) { if (!this[i][command].apply(this[i], to)) { result = false; } } } return result; }
ゲーム内部のイベント処理にはマクロやスクリプトを使用するのが一般的ではないでしょうか。
例えば、一度きりのよう会話を実現するなら以下の様な感じです。
if flag[0] message "○○" flag[0] = false; endif
JavaScriptの関数やクラスではオプションオブジェクトを指定して、オプションを指定しているのをよく見かけます。
オプションですので省略可能なわけで、その場合デフォルト値を採用することになります。このオプションにデフォルト値を設定する汎用的な関数を作成してみました。
Imageコントロールを作成してみました。きっかけは画像の遅延読み込みを実現したいことと、ロード中はローディング中を示す画像を表示したかったからです。
いつの間にかimgタグのlowsrcは廃止になっているんですね
常に今更な内容ですが、色々コードを読んでいて見つけたarguments.calleeの使い方のパターンを書き留めておきます。
一定の条件が成立するまでタイマーで待機するパターンです。例えばJavascript等の遅延読み込みの完了待ち等です。
setTimeout(function() {
if (完了条件) {
完了時の処理
}
arguments.callee();
}, 15.625);
これなら汎用の関数がかけますね
function wait(condition, callback) {
var _condition = (typeof condition == "string") ?
function() { return eval(condition); } : condition;
if (_condition()) {
callback && callback();
}
setTimeout(function() {
if (_condtion()) {
callback && callback();
}
arguments.callee();
}, 15.625);
}
使い方はこんな感じ
FOO = {} FOO.bar = function() { alert("Hellow"); }
var s = document.createElement('script'); s.src = "foo.js"; s.type = 'text/javascript'; s.defer = 'defer'; document.getElementsByTagName('head').item(0).appendChild(s); wailt("FOO", function() { FOO.bar(); });
どうもこれが最も典型的な使い方みたいですね。
function Factorials(x) {
if (x <= 1) {
return 1;
}
return x * arguments.callee(x - 1);
}
ただし、もっと本質的には無名関数である必要がありますが・・・
ページにメールアドレスを書く必要に迫られてスパムメール対策について調べてみました。
まあ一般的には下記の対策までのようです。というかサーバー側のフィルターが発達して、もう誰も気にしないのでしょうか・・・
Javascriptの多言語対応について考えてみます。基本的には語り尽くされている気はしますが、自分好みの実装を説明してみたいと思います。
ちなみにここで説明している方法は、自前のライブラリに実装している方法です。
続きを読む