二次元マップを作ろう! (5/5)
作成:2012-10-21 10:44
更新:2012-10-21 10:44
更新:2012-10-21 10:44
■ミニ迷路を作ろう
では、collisionDataの利用例として、ごく簡単な迷路を作ってみましょう。といっても、迷路の中をただキャラクタが動きまわるだけの単純なものです。スタートもなければゴールもない、どうすればクリアかといったこともありません。ただ動きまわるだけです。
下のリスト欄にスクリプトを掲載しておきました。先に作った10×10のマップのサンプルを手直ししただけのものです。キャラクタは、「minicharacter.png」というファイル名で用意しています。これは、50×50のイメージを2つ横に並べた形のものにしておきます。この2枚を交互に表示してアニメーションさせておきます。上下左右の矢印キーを押すと、マップ内をキャラクタが移動していきます。
ここでは、キャラクタのフレーム切替時の処理をcharMoveという関数として用意してあります。この中で、上下左右の矢印キーを押したら移動するようにしています。キャラクタの移動は以下のようにして行なっています。
1. 現在の表示位置は、変数hereとして保管しておきます。この中にxとyという値を用意し、そこに現在位置が収められます。
2. まず、hereから現在位置をnx、nyに取り出します。これが次に移動する位置の値になります。
3. game.inputの上下左右の矢印の値をチェックし、それに応じてnx、nyの値に加算減算をして次に移動する場所の位置を設定します。
4. !map.hitTest(nx, ny)をチェックします。これが成立すれば(つまりhitTest(nx, yn)がfalseなら)、通過できるので、nx、nyの値をhereに設定し、moveToでキャラクタを移動します。成立しなければ、移動できないので何もしないで終わります。
「キーの入力などをもとに移動先の位置を計算する」「その位置に移動できるかどうかhitTestでチェックする」「チェックの結果を元に移動の処理をする」――この流れが頭に入れば、マップの移動は作れるようになります。
下のリスト欄にスクリプトを掲載しておきました。先に作った10×10のマップのサンプルを手直ししただけのものです。キャラクタは、「minicharacter.png」というファイル名で用意しています。これは、50×50のイメージを2つ横に並べた形のものにしておきます。この2枚を交互に表示してアニメーションさせておきます。上下左右の矢印キーを押すと、マップ内をキャラクタが移動していきます。
ここでは、キャラクタのフレーム切替時の処理をcharMoveという関数として用意してあります。この中で、上下左右の矢印キーを押したら移動するようにしています。キャラクタの移動は以下のようにして行なっています。
1. 現在の表示位置は、変数hereとして保管しておきます。この中にxとyという値を用意し、そこに現在位置が収められます。
2. まず、hereから現在位置をnx、nyに取り出します。これが次に移動する位置の値になります。
3. game.inputの上下左右の矢印の値をチェックし、それに応じてnx、nyの値に加算減算をして次に移動する場所の位置を設定します。
4. !map.hitTest(nx, ny)をチェックします。これが成立すれば(つまりhitTest(nx, yn)がfalseなら)、通過できるので、nx、nyの値をhereに設定し、moveToでキャラクタを移動します。成立しなければ、移動できないので何もしないで終わります。
「キーの入力などをもとに移動先の位置を計算する」「その位置に移動できるかどうかhitTestでチェックする」「チェックの結果を元に移動の処理をする」――この流れが頭に入れば、マップの移動は作れるようになります。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
var game = null;
var char1 = null;
var map = null;
var here = {x:50, y:50};
enchant();
window.onload = function(){
game = new Game(500, 500);
game.fps = 10;
game.preload("minicharacter.png","mapdata.png");
game.onload = function(){
map = new Map(50, 50);
map.image = game.assets['mapdata.png'];
var data = [
[0,0,0,0,0,0,0,0,0,0],
[0,2,2,2,2,2,2,2,2,0],
[0,2,3,3,3,2,3,3,2,0],
[0,2,3,2,2,2,2,3,2,0],
[0,2,2,2,0,0,2,3,2,0],
[0,2,3,2,0,0,2,2,2,0],
[0,2,3,2,2,2,2,3,2,0],
[0,2,3,3,2,3,3,3,2,0],
[0,2,2,2,2,2,2,2,2,0],
[0,0,0,0,0,0,0,0,0,0]
];
var cdata = [
[1,1,1,1,1,1,1,1,1,1],
[1,0,0,0,0,0,0,0,0,1],
[1,0,1,1,1,0,1,1,0,1],
[1,0,1,0,0,0,0,1,0,1],
[1,0,0,0,1,1,0,1,0,1],
[1,0,1,0,1,1,0,0,0,1],
[1,0,1,0,0,0,0,1,0,1],
[1,0,1,1,0,1,1,1,0,1],
[1,0,0,0,0,0,0,0,0,1],
[1,1,1,1,1,1,1,1,1,1]
];
map.loadData(data);
map.collisionData = cdata;
game.rootScene.addChild(map);
char1 = new Sprite(50, 50);
char1.image = game.assets["minicharacter.png"];
char1.x = 50;
char1.y = 50;
char1.frame = 0;
char1.addEventListener(enchant.Event.ENTER_FRAME, charMove);
game.rootScene.addChild(char1);
};
game.start();
};
function charMove(){
this.frame = this.age % 2;
var nx = here.x;
var ny = here.y;
if (game.input.right) { nx += 50; }
if (game.input.left) { nx -= 50; }
if (game.input.up) { ny -= 50; }
if (game.input.down) { ny += 50; }
if (!map.hitTest(nx, ny)){
here.x = nx;
here.y = ny;
char1.moveTo(here.x, here.y);
}
}
※関連コンテンツ
「初心者のためのenchant.jsゲームプログラミング入門」に戻る