# CharacterFactoryクラス

CharacterFactoryは、Characterの作成を助けるクラスです。 これが、Characterの概要で解説した、大きなキャラクターチップ画像を使った場合に利用するスクリプトです。

    window.onload = function() {
    	var game = new Game(480, 480);
    	game.preload({eye: "eye-multi.png"});
    	game.loaded.handle(function() {
    		var charaLeft = new Character(32, 32, game.r("eye"));
    		charaLeft.charaCol = 2;
    		charaLeft.charaSeq = 0;
    		charaLeft.angle(Angle.left);
    		charaLeft.moveTo(0, 100);
    		var charaRight = new Character(32, 32, game.r("eye"));
    		charaRight.charaCol = 2;
    		charaRight.charaSeq = 1;
    		charaRight.angle(Angle.right);
    		charaRight.moveTo(32, 100);
    		var charaUp = new Character(32, 32, game.r("eye"));
    		charaUp.charaCol = 2;
    		charaUp.charaSeq = 2;
    		charaUp.angle(Angle.up);
    		charaUp.moveTo(64, 100);
    		var charaDown = new Character(32, 32, game.r("eye"));
    		charaDown.charaCol = 2;
    		charaDown.charaSeq = 3;
    		charaDown.angle(Angle.down);
    		charaDown.moveTo(96, 100);
    		game.currentScene.append(charaLeft);
    		game.currentScene.append(charaRight);
    		game.currentScene.append(charaUp);
    		game.currentScene.append(charaDown);
    	});
    }

CharacterFactoryを利用すると、このように単純化出来ます。

    window.onload = function() {
    	var game = new Game(480, 480);
    	game.preload({eye: "eye-multi.png"});
    	game.loaded.handle(function() {
    		var f = new CharacterFactory(32, 32, game.r("eye"));
    		f.charaCol = 2;
    		game.currentScene.append(f.create(0, {x:0,y:100}, Angle.left));
    		game.currentScene.append(f.create(1, {x:32,y:100}, Angle.right));
    		game.currentScene.append(f.create(2, {x:64,y:100}, Angle.up));
    		game.currentScene.append(f.create(3, {x:96,y:100}, Angle.down));
    	});
    }

CharacterFactoryは、Character作成に必要なパラメータを事前にセットしておく事で、そのパラメータを使い回してCharacterクラスを生成します。 同様のコードを何度も記述する開発者の手間を省く事をサポートしてくれるでしょう。
var factory = new CharacterFactory(32, 32, game.r("chara")); 横幅、縦幅、画像を指定してインスタンスを生成します。 一般的に、CharacterFactoryには複数のキャラクター画像がセットになった大きめの画像を渡します。
charaCol: number;//キャラクターチップに利用される画像が、横一列でいくつのキャラを保持しているかを示す animeCnt: number;//キャラクターチップに利用される画像が、何フレームのアニメーションを持っているかを示す movePixel: number;//一度の移動で移動するピクセル数 moveFrame: number;//一度の移動に要するフレーム数 image: HTMLImageElement;//キャラクターの作成に利用する画像 width: number;//キャラクターの横幅 height: number;//キャラクターの縦幅 wait: number;//キャラクターのアニメーション間隔 angle: Angle;//キャラクターの向き createClass: any;//生成するキャラクターのクラス。例えば、Characterを継承したEnemyCharacterクラスがある場合、それを指定する angleSeq:any;//キャラチップの方向順。フィールド未定義の場合は下左右上。このフィールドの正確な型は{[key:Angle]: number; }です（TypeScriptで定義不可）。
create(charaSeq:number, offset?: CommonOffset, angle?:Angle) { charaSeq:number;//生成するキャラクターのキャラ番号 offset?: CommonOffset;//生成するキャラクターの位置。省略時はx:0, y:0となる angle?:Angle;//生成するキャラクターの向き。省略時はフィールドのangleが利用される これまでに与えたパラメータを基にキャラクターを生成します。 ---
CharacterFactorクラスは、定義されていないプロパティの値もCharacterクラスに設定する事が出来ます。 例えば、以下のようにhpフィールドをCharacterFactoryクラスに指定してからcreateでCharacterを生成すると、そのCharacterクラスのインスタンスもhpフィールドに100の値を持った状態で生成されます。

    f.hp = 100;

createClassフィールドでCharacterクラス以外のクラスを指定した場合などに活用出来るでしょう。