アイテムエディター

習作あるいはUIのサンプルとしてアイテムエディターを作成しました。
ふと思ったのですが、昔アイテムや魔法の実装としてストラテジーパターンで説明していましたが、エディターで各々の振る舞いを記述するならデータに埋め込んでおいてevalするのが良いんだろうなと思いました。
具体的な方法は、また次回。

カテゴリー: dq, JavaScript | コメントは受け付けていません。

Partyを実装する

特定の集団を管理するためのPartyオブジェクトについて説明します。 

  • DOWNLOAD 

概要

Partyは集団を管理したり、内包する集団に同一の作業を実施したりする機能を提供します。
例えばPartyの全員の死亡を確認したり、全員の状態を変更したりします。 

Partyは配列を継承し、Objectを要素として持つことにします。 

Partyクラス図

繰り返し

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;
}
カテゴリー: dq, JavaScript, ゲーム作成, プログラミング | コメントは受け付けていません。

レトロRPGを作る -イベント処理

ゲーム内部のイベント処理にはマクロやスクリプトを使用するのが一般的ではないでしょうか。
例えば、一度きりのよう会話を実現するなら以下の様な感じです。

 if flag[0]
    message "○○"
    flag[0] = false;
 endif

続きを読む

カテゴリー: dq, JavaScript, ゲーム作成, プログラミング | コメントは受け付けていません。

要素を最前面に移動する

DIV等の要素が重なっている場合に、特定の要素を動的に最前面に持ってくる方法についてです。
続きを読む

カテゴリー: JavaScript | コメントは受け付けていません。

オプションの指定

JavaScriptの関数やクラスではオプションオブジェクトを指定して、オプションを指定しているのをよく見かけます。
オプションですので省略可能なわけで、その場合デフォルト値を採用することになります。このオプションにデフォルト値を設定する汎用的な関数を作成してみました。

  1. DOWNLOAD

続きを読む

カテゴリー: JavaScript, プログラミング | タグ: | コメントは受け付けていません。

Imageコントロール

Imageコントロールを作成してみました。きっかけは画像の遅延読み込みを実現したいことと、ロード中はローディング中を示す画像を表示したかったからです。
いつの間にかimgタグのlowsrcは廃止になっているんですね

続きを読む

カテゴリー: dq, JavaScript, プログラミング | コメントは受け付けていません。

calleeの使い道

常に今更な内容ですが、色々コードを読んでいて見つけた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.js

FOO = {}
FOO.bar = function() {
    alert("Hellow");
}

JavaScriptの遅延ロード

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, tips, プログラミング | コメントは受け付けていません。

Webにおけるマジックナンバー

自分で勝手に認定したマジックナンバーを書き残しておきます。
続きを読む

カテゴリー: html/css, JavaScript | コメントは受け付けていません。

mailto: のスパム対策

ページにメールアドレスを書く必要に迫られてスパムメール対策について調べてみました。

調査結果

まあ一般的には下記の対策までのようです。というかサーバー側のフィルターが発達して、もう誰も気にしないのでしょうか・・・

  • 画像を使用する
  • アドレスをエンコードする
  • JavaScriptを使用する

続きを読む

カテゴリー: JavaScript, プログラミング | タグ: , | コメントは受け付けていません。

JavaScriptの多言語対応

Javascriptの多言語対応について考えてみます。基本的には語り尽くされている気はしますが、自分好みの実装を説明してみたいと思います。
ちなみにここで説明している方法は、自前のライブラリに実装している方法です。
続きを読む

カテゴリー: dq, JavaScript, プログラミング | コメントは受け付けていません。