DXScriptでゲーム作成 その1
リリースしてからすっかり放置してしまったので、ここらでチュートリアル的なものを書いてみることにします。
今回はキャラクターを表示して、アニメーションさせるところまで行ってみます。
1.準備
DXScript.zipを解凍し、sample1フォルダを作って↓のような階層にします。
DXScriptフォルダ直下のmain.jsをsample1フォルダにコピーします。
\DXScript
\sample1 ⇐作成
main.js ⇐作成
キャラクターの画像も用意しましょう。
今回は同人サークル「はちみつくまさん」の東方素材蒐をお借りします。
霊夢の歩行絵(霊夢歩行絵.png)をreimu_walk.pngと名前変更し、sample1フォルダの下に置きます。
\DXScript
\sample1
main.js
reimu_walk.png ⇐new
さらに、GIMPなどで画像背景の緑色の部分を透過色にしておきましょう。
2.コンフィグファイルの変更
DXScriptフォルダ直下にあるconfig.jsをテキストエディタで開きます。
一番下にあるdxs.scriptsの部分を修正します。
/** 読み込む外部スクリプト/プラグイン */ dxs.scripts = [ 'dxs.js', 'dxsf\\class.js', 'dxsf\\dxsf.js', 'sample1\\main.js' // sample1フォルダのmain.jsを読み込むように修正 ];
3.画像の表示
ここからはプログラミングをしていきます。
sample1フォルダの下のmain.jsに書きこんでいきます。
dxsf(DXScriptの補助フレームワーク)はenchant.jsのような感じで使うことができます。
完成品はこちら(sample1.zip)
dxs.onLoad = function() { var game = new Game(); // 1 game.loadImages('sample1\\reimu_walk.png'); // 2 var scene = new Scene(); // 3 var player = new Sprite(48, 64); // 4 player.x = 0; player.y = 480 - player.height; player.image = game.assets['sample1\\reimu_walk.png']; // 5 scene.addChild(player); // 6 game.pushScene(scene);
1-Gameクラスのインスタンスを生成します。
基本となるクラスです。
enchant.jsとは異なり引数がありません。
あと、game.start()が不要です。
2-画像を読み込みます。
ここで、
game.loadImages('sample1\\reimu_walk.png', 'sample1\\marisa_walk.png');
のように複数のファイルを読み込ますこともできます。(今回は1ファイルですが)
3-Sceneクラスのインスタンスを生成します。
4-Spriteクラスのインスタンスを生成します。
Spriteクラスは画像を扱うクラスです。
引数は表示領域のサイズです。
のちのちプレーヤーが操作できるようにするので、playerという名前にしておきます。
描画するX座標、Y座標をセットします。
※デフォルトでは画面サイズは640*480です。なのでplayer.y = 480 - player.heightとしています
5-playerが描画する画像をセットしています。
2で読み込んだ画像はgame.assetsに蓄えられています。
6-playerをsceneへ、sceneをgameへセットします。
game->scene->各アイテムと階層構造になっています。
これで、画面左下に霊夢が表示されるはずです。
4.歩行アニメーション
歩行アニメーションをさせましょう。
とりあえず右方向にひたすら歩くようにします。
(移動はしません)
// 歩くのに必要な情報 var walkImageNum = [0, 1, 2, 1]; // 向き変更関数 0:↑ 1:→ 2:↓ 3:← player.setDirection = function(direction) { // 1 player.direction = direction; player.walkImageNumIndex = 0; player.animationStep = 0; player.animationSpeed = 5; player.frame = 3 * player.direction; // 2 } // 初期方向をセット player.setDirection(1); player.addEventListener(ONFRAME, function() { // 3 player.animationStep = (player.animationStep + 1) % player.animationSpeed; if (player.animationStep != 0) { return; } var offset = walkImageNum[player.walkImageNumIndex]; player.frame = 3 * player.direction + offset; // 画像indexを増やす player.walkImageNumIndex = (player.walkImageNumIndex + 1) % walkImageNum.length; }); }
1-キャラクターの向きを変更する処理を関数化しておきます。
生成したインスタンスにあとから変数を追加できるのがjavascriptの強み。
playerに方向を表す変数やアニメーション制御用の変数を追加&初期化しています。
2-frame変数は画像全体のうち、どの部分を表示するかを制御します。
reimu_walk.pngは3×4の絵が描かれた画像なので、例えばframe = 3だと左から1つ目、上から2つ目の絵が表示されます。
3-イベントリスナを定義して、アニメーションの処理を記述します。
ONFRAMEイベントは各フレームごとに発生するイベントです。
(デフォルトでは30FPS)
他にはマウスやキーボードのイベントなどを定義してあります。
さすがに1秒間に30回絵が書き換わると速くて見えないので、5フレームに一度処理を行うようにしています。
player.directionなどから計算してplayer.frameの値を変更することで、表示される絵を変更します。