div1に上がりたいkeitanxkeitanの日記スマートフォン用の表示で見るdiv1に上がりたいkeitanxkeitanの日記この広告は、90日以上更新していないブログに表示しています。2011にiPhoneで2Dアクションゲームを出展予定。それの練習ということで2Dアクションゲームの当たり判定について学ぶなど。実はまだ審査中なのでこの努力は水泡に帰すかもしれないけれど、人生に無駄なことなどないと信じよう。何かに似てるけど他人の空似。配管工のおっさんがレンガや文字の書かれたブロックが配置されたステージで縦横無尽に飛び回る。開発予定のゲームはiPhoneの加速度センサーを利用した「重力の操作」が肝になっているのでその部分も実装。デバイスを反転させると重力も反転しておっさんが落下する。UIDeviceOrientationLandscapeRight(ホームボタンが右側に来る向き)の時はいつも通り地面に立っている。天井が地面に、地面が天井に。ビームも出るよ!ちなみに画面右下に表示されている半透明の円はジャンプボタン(赤色)とアタックボタン(黄色)です。ジャンプの実装なめらかなジャンプを実装することは2Dアクションゲームを作る上で必須。以前「iPhoneで横スクロールアクションゲームを作りたい」でジャンプゲームを実装した時は、キャラクターに垂直方向の速度と加速度を持たせて計算していました。これでも間違いではないのですが、ジャンプゲームの元祖「マリオ」のジャンプはVerlet積分という計算法で実装しているようなので、今回はこちらで実装してみました。こちらのブログを参考にさせて頂きました。当たり判定やっぱり2Dアクションゲームを作る上でまず苦労するのはフィールドにあるオブジェクトとの当たり判定です。フィールドに斜面などを作ってしまうとかなりの高等技術が必要になる(に違いない!)ので、まずはフィールドを16x16ピクセル単位で区切って、ブロック(レンガやハテナブロック)の有無を二次元配列で確保しました。gField[kFieldHeight][kFieldWidth];厳密にはブロックがない場所は0に、ブロックがある場所は1以上の数字にしてあり、ブロックの種類毎に数字を変えて描画するときに役立てています。おっさんを左に移動するメソッドmoveLeftの中では、おっさんの左側のブロックとの当たり判定を行います。おっさんの位置データはfloat型なので、これをフィールド情報を格納した二次元配列のインデックスに変換します。}おっさんを垂直方向に移動するメソッドmoveVertical(ずっとmoveVerticallyの方が良かった気がしている)の中では、上方向に速度がある時はおっさんの上側のブロックとの、下方向に速度がある時はおっさんの下側のブロックとの当たり判定を行います。はみ出している側に合わせて補正値|offset|を計算する。}大事なのはコードの最初の方で準備している「半身の当たり判定」です。そもそも仕様ではおっさんは半身でブロックに立つことができます。半身の当たり判定をしない、すなわち自分の真下(真上)のブロックとしか当たり判定をしないと、ちょっと足が掛かっているだけではすり抜けてしまいます。2ブロック分の当たり判定をしておくことですり抜けを防止することができます。当たらない判定もう1つ大事なのは「当たらない判定」です。ジャンプしていない時でも常に重力は受けているので、ブロックの上で足を踏み外したらおっさんは落下しなければなりません。しないとこんなファンタスティックスなことに・・・このような空中歩行をさせないために「当たらない判定」が必要なのです。moveVerticalの中ではジャンプ中でない時は当たらない判定をして足下にブロックがない場合は落下状態に移行します(実装の上では落下状態とジャンプ状態は区別していません)。}「当たってない判定」の方がいいかな、と思ったりした。iPhoneで2Dアクションゲームを開発中。月別アーカイブはてなブログをはじめよう!keitanxkeitanさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。