Twitterをやめるまで

Twitterやめたい人の毎日の話

15日目

こんばんは
今日もあちぃなぁ
本格的に夏になってる

久々にコーディングの話でもしようと思います。
今、横スクロールアクションのゲーム作ってるんですけど、マップの障害物との当たり判定の話でもします。
横スクロールアクションはマリオみたいなものだと思ってください。
自分が今一番悩んでいるところなので。

というかまずマップにどう障害物を出すのかの話した方がいいですね。

var map = new Sprite(16,16); //ここで障害物の縦横の大きさを決める
map.iamge =game.assets["map.png"]; //画像の埋込
map.loadData([-1,-1,-1,-1],
             [-1,-1,-1,-1],
             [0,0,0,0],
             [1,1,1,1]); //-1は何も表示させない。0とか1はスプライトシートの何番目の画像を表示させるか
//この配列で高さ16*3と16*4のところに横16*4分の障害物を表示させることになります。

マップに障害物を表示させたら、マップの障害物の当たり判定を付けます。
付けるためにはmap.collisionDataってのを使うんですね。

map.collisionData([0,0,0,0],
                  [0,0,0,0],
                  [1,1,1,1],
                  [1,1,1,1]); 
//0判定なし、1は判定あり
var stage = new Group();
stage.addChild(map);
game.rootScene.addChild(stage);
//これで適応されます

でもこれだけでは、判定があるだけで、キャラクターは通り抜けるし、上に乗ることもできません。
なので次のようなイベントシーンを追加して、当たり判定を付けてあげます。

if(map.hitTest(player.x, player.y + player.height)
//マップの当たり判定がキャラの左下はしに当たっているとき
|| map.hitTest(player.x + player.width, player.y + player.height)))
//もしくはマップの当たり判定がキャラの右下はしに当たっているとき{
  player.y = Math.floor((player.y + player.height) / 16) * 16 -player.height;
 //キャラのy座標に判定が出ている高さを代入するようにしてる
  player.vy = 0;
 //キャラの重力加速度を0にして止まるようにしている
}

これで障害物に乗れるようにしました。
ただこの当たり判定は実際のキャラの大きさではなく、スプライト画像の大きさに依存しているので微調整は必要です。
上記のコードのifの条件を変えれば障害物をすり抜けなくなったりします。
こんなところですかね。

また何か作ったら報告します。
飯食お~