スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

当たり判定のおさらい

今年ももうすぐ終わりですね。

まだまだこのゲームで解説したいところはたくさんありますが、
最後の締めということで今回は当たり判定のおさらいをしたいと思います。

Screenshot_2014-12-29-15-55-21.png

(紹介しやすい様、グラフィックを戻しました。)

ラインにはそれぞれ違った判定を持っているのは以前の記事で解説しましたね。
今回は(前記事で解説済みという事もあり)コードの解説に関しては行いませんが、
ラインが触れたときの挙動を、画像つきでどういう風な流れで処理しているのかを見ていきたいと思います。

1.赤いライン…ジャンプ時にマリオの頭とブロックが接触したかを判定

Screenshot_2014-12-29-20-36-10.png

↓↓↓↓↓

Screenshot_2014-12-29-20-37-09.png

~接触時の主な処理~
1.プレイヤーの上昇移動フラグを"false"にする。
2.プレイヤーのY軸移動座標をマイナスからプラスに変える。

主にやっていることはこの2つですが、
上図のようなハテナブロックやレンガブロックといった「叩いたときに何かしらアクションを起こすオブジェクト」に関しては
追記で処理を行っています。
ちなみにY座標はマイナスの値でプレイヤーが上昇するので、プラスの値に切り替えプレイヤーを落下させています。

詳しくは「当たり判定"上"の実装」をご覧くださいませ。

2.青いライン…マリオがブロックの上を走っているかを判定

Screenshot_2014-12-29-20-49-06.png

↓↓↓↓↓

Screenshot_2014-12-29-20-49-10.png

~接触時の主な処理~
1.プレイヤーの落下時の判定フラグを"false"にし、ダッシュ時の判定フラグを"true"にする
2.プレイヤーのY座標を"32、64、96…"といった一ブロック分の高さである"32"ずつのY幅で固定する

青いラインは主にマリオがブロックの上を走っているか否かを判断するスプライト。
このスプライトが無いとマリオがブロックに乗っかっていても着地処理とみなされないため、マリオが地面にめり込んでしまいます。(笑)
2番のY座標の固定は(他のゲームで使用されているのか分かりませんが)俺の書いたプログラムでは必須コードで、これはマリオが微妙な位置にストップするのを防いでくれると同時に"すり抜け床"が簡単に実装できるのでとても便利です。

詳しくは「当たり判定"下"の実装」及び、「すり抜け床の実装」をご覧ください。

3.黄色4.緑色のライン…マリオが横からブロックに接触しているかを判定

Screenshot_2014-12-29-20-44-14.png

↓↓↓↓↓

Screenshot_2014-12-29-20-44-39.png

~接触時の主な処理~
1.右移動フラグを"true"にする
2.プレイヤーを画面右側へ押し出す
3.ブロックから離れた場合、マリオを徐々に画面中央へ戻す

ブロックとこのラインが接触した場合、画面のスクロールスピードと同じ値でマリオを右側へ移動させることで、マリオがタイルにめり込まなくなります。

…一見するとブロックとラインが触れた場合に直接マリオを右側へ押し出してるように見えると思いますが、
実はそうではなく「ラインとブロックが触れた場合、右側移動フラグを"true"」にし、
次に「右側移動フラグが"true"になった場合、マリオを右側へ押し出す」といった二重処理から構成されています。

以前解説した「当たり判定"右"の実装」ではブロックとラインが触れた場合、「直接マリオを右側へ押し出してる」内容でしたが、
その場合、ブロックが二つ同時に触れるとスクロールスピードの2倍の値でマリオが右側に押し出されてしまうことに気がつきその部分だけ修正しました。

最後は白いラインです。

Screenshot_2014-12-29-23-59-05.png

これはマリオと"ブロック以外のオブジェクト"(アイテムや敵キャラなど)が接触しているかを判定し、今回の実装で新たに追加したものです。

以前はラインではなく、マリオのグラフィック全体に当たり判定を設けておりましたが、
それだと"本家のマリオ"と比べて敵キャラとの接触判定がかなりシビアになり、プレイしてストレスを感じました。
接触判定をマリオのグラフィックよりも小さい白いラインで持たせることで、あえて接触判定をゆるくしているというわけです。
…さて、いろいろと判定を追加しましたが、多くしすぎると今度は1フレームあたりの処理が重くなってしまうのでこの辺にしておこうかと思います。

Screenshot_2014-12-30-00-01-09.png

今年一年はプログラム以外にも音楽やドット絵の打ち込みなどいろいろとやったので、時間が過ぎるのがとても早かったですね;
年末リリースを目指していましたが、一人で作るとなると思った以上に時間がかかります。
もうこのゲームを作り始めて1年半以上かかっており、いい加減来年こそはリリースできるようがんばりますので、どうかよろしくお願いしますね。

今年一年ありがとうございました!






~おまけ~
コピペして使ってみよう!


____________________▄▄▄▀▀▀▀▀▀▀▄
_______________▄▀▀____▀▀▀▀▄____█
___________▄▀▀__▀▀▀▀▀▀▄___▀▄___█
__________█▄▄▄▄▄▄_______▀▄__▀▄__█
_________█_________▀▄______█____█_█
______▄█_____________▀▄_____▐___▐_▌
______██_______________▀▄___▐_▄▀▀▀▄
______█________██_______▌__▐▄▀______█
______█_________█_______▌__▐▐________▐
_____▐__________▌_____▄▀▀▀__▌_______▐_____________▄▄▄▄▄▄
______▌__________▀▀▀▀________▀▀▄▄▄▀______▄▄████▓▓▓▓▓▓▓███▄
______▌____________________________▄▀__▄▄█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄
______▐__________________________▄▀_▄█▓▓▓▓▓▓▓▓▓▓_____▓▓____▓▓█▄
_______▌______________________▄▀_▄█▓▓▓▓▓▓▓▓▓▓▓____▓▓_▓▓_▓▓__▓▓█
_____▄▀▄_________________▄▀▀▌██▓▓▓▓▓▓▓▓▓▓▓▓▓__▓▓▓___▓▓_▓▓__▓▓█
____▌____▀▀▀▄▄▄▄▄▄▄▄▀▀___▌█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓__▓________▓▓___▓▓▓█
_____▀▄_________________▄▀▀▓▓▓▓▓▓▓▓█████████████▄▄_____▓▓__▓▓▓█
_______█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▓▓▓▓▓██▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓██▄▄___▓▓▓▓▓█
_______█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▓▓███▓▓▓▓████▓▓▓▓▓▓▓▓▓▓▓▓▓██▓▓▓▓▓▓█
________█▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▓█▓▓██░░███████░██▓▓▓▓▓▓▓▓▓▓██▓▓▓▓▓█
________█▓▓▓▓▓▓▓▓▓▓▓▓▓▓██▓░░░░░█░░░░░██░░░░██▓▓▓▓▓▓▓▓▓██▓▓▓▓▌
________█▓▓▓▓▓▓▓▓▓▓▓▓▓▓███░░░░░░░░____░██░░░░░░░██▓▓▓▓▓▓▓██▓▓▌
________▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓██░░░░░░░________░░░░░░░░░██████▓▓▓▓▓█▓▌
________▐▓▓▓▓▓▓▓▓▓▓▓▓▓▓██░░░░░░___▓▓▓▓▓░░░░░░░███░░███▓▓▓▓▓█▓▌
_________█▓▓▓▓▓▓▓▓▓▓▓▓▓██░░░░░___▓▓█▄▄▓░░░░░░░░___░░░░█▓▓▓▓▓█▓▌
_________█▓▓▓▓▓▓▓▓▓▓▓▓▓█░░█░░░___▓▓██░░░░░░░░▓▓▓▓__░░░░█▓▓▓▓██
_________█▓▓▓▓▓▓▓▓▓▓▓▓▓█░███░░____▓░░░░░░░░░░░█▄█▓__░░░░█▓▓█▓█
_________▐▓▓▓▓▓▓▓▓▓▓▓▓▓█░█████░░░░░░░░░░░░░░░░░█▓__░░░░███▓█
__________█▓▓▓▓▓▓▓▓▓▓▓▓█░░███████░░░░░░░░░░░░░░░▓_░░░░░██▓█
__________█▓▓▓▓▓▓▓▓▓▓▓▓█░░░███████░░░░░░░░░░░░░░_░░░░░██▓█
__________█▓▓▓▓▓▓▓▓▓▓▓▓█░░░███████░░░░░░░░░░░░░░░░░░░██▓█
___________█▓▓▓▓▓▓▓▓▓▓▓▓█░░░░███████░░░░░░░░░░░█████░██░░░
___________█▓▓▓▓▓▓▓▓▓▓▓▓█░░░░░░__███████░░░░░███████░░█░░░░
___________█▓▓▓▓▓▓▓▓▓▓▓▓▓█░░░░░░█▄▄▄▀▀▀▀████████████░░█░░░░
___________▐▓▓▓▓▓▓▓▓▓▓▓▓█░░░░░░██████▄__▀▀░░░███░░░░░█░░░
___________▐▓▓▓▓▓▓▓▓▓▓▓█▒█░░░░░░▓▓▓▓▓███▄░░░░░░░░░░░░░░░______▄▄▄
___________█▓▓▓▓▓▓▓▓▓█▒▒▒▒█░░░░░░▓▓▓▓▓█░░░░░░░░░░░░░░░▄▄▄_▄▀▀____▀▄
__________█▓▓▓▓▓▓▓▓▓█▒▒▒▒█▓▓░░░░░░░░░░░░░░░░░░░░░____▄▀____▀▄_________▀▄
________█▓▓▓▓▓▓▓▓▓█▒▒▒▒█▓▓▓▓░░░░░░░░░░░░░░░░░______▐▄________█▄▄▀▀▀▄
________█▓▓▓▓▓▓▓▓█▒▒▒▒▒▒█▓▓▓▓▓▓▓░░░░░░░░░____________█_█______▐_________▀▄▌
_______█▓▓▓▓▓▓▓▓█▒▒▒▒▒▒███▓▓▓▓▓▓▓▓▓▓▓█▒▒▄___________█__▀▄____█____▄▄▄____▐
______█▓▓▓▓▓▓▓█_______▒▒█▒▒██▓▓▓▓▓▓▓▓▓▓█▒▒▒▄_________█____▀▀█▀▄▀▀▀___▀▀▄▄▐
_____█▓▓▓▓▓██▒_________▒█▒▒▒▒▒███▓▓▓▓▓▓█▒▒▒██________▐_______▀█_____________█
____█▓▓████▒█▒_________▒█▒▒▒▒▒▒▒▒███████▒▒▒▒██_______█_______▐______▄▄▄_____█
__█▒██▒▒▒▒▒▒█▒▒____▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒▒█▒____▒█▓█__▄█__█______▀▄▄▀▀____▀▀▄▄█
__█▒▒▒▒▒▒▒▒▒▒█▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█_______█▓▓█▓▓▌_▐________▐____________▐
__█▒▒▒▒▒▒▒▒▒▒▒███▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█▒_______█▓▓▓█▓▌__▌_______▐_____▄▄____▐
_█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒_____█▓▓▓█▓▓▌__▌_______▀▄▄▀______▐
_█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒███████▓▓█▓▓▓▌__▀▄_______________▄▀
_█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒███▒▒▒▒▒▒▒██▓▓▓▓▓▌___▀▄_________▄▀▀
█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒▒▒▒▒▒▒▒█▓▓▓▓▓▀▄__▀▄▄█▀▀▀
█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██▓▓▓▓██▄▄▄▀
█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████
█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█
_█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█▄▄▄▄▄
_█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒███▒▒▒▒▒▒██▄▄
__█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒███▒▒▒▒▒▒▒▒▒▒▒▒▒█▄
__█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█
__█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒█▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█
___█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒█▒▒▒▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░▒▒▒▒▒▒▌
____█▒▒▒▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒▒█▒▒▒▒█▒▒▒▒▒▒█▒▒▒▒▒▒▒▒▒░░░░░░░░░░░░░▒▒▌
____█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█████████████▒▒▒▒▒█▒▒▒▒▒▒▒▒░░░░▒▒▒▒▒▒▒▒▒▒▒░▒▌
_____█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█_______▐▒▒▒▒█▒▒▒▒▒▒▒░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░▌
______█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█________█▒▒█▒▒▒▒▒▒░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▌
_______█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█________█▒█▒▒▒▒▒▒░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▌
________█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█________█▒▒▒▒▒▒░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█
_________█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█________█▒▒▒▒░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█
_________█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█________█▒▒▒░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒█▀
__________█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█_______█▒░░░▒▒▒▒▒░░░░░░░░▒▒▒█▀▀▀
___________█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█_______█░▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░█▀
____________█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█_______█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█▀
_____________█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█_______█▒▒▒▒▒▒▒▒▒▒▒▒█▀
_____________█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█_______▀▀▀███████▀▀
______________█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█
_______________█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█
________________█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█
_________________█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█
__________________█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██▒█
___________________█▒▒▒▒▒▒▒▒▒▒▒▒▒██▒▒▒▒█
___________________█▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒█
___________________█████████▒▒▒▒▒▒▒▒▒▒▒█
____________________█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█
____________________█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█
_____________________█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░▌
_____________________█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░▌
______________________█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░▌
_______________________█▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░█
________________________█▒▒▒▒▒▒▒▒▒▒▒░░░█
__________________________██▒▒▒▒▒▒░░░█▀
_____________________________█░░░░░█▀
スポンサーサイト

レイヤーの設定

画面上にオブジェクトが増えてくるとレイヤーを設定したくなりますよね。
今回はAndengineがもつレイヤー機能(setZIndexメソッド)について解説致します。

Screenshot_2014-12-14-22-48-20.png

まずレイヤーとは"日本語で階層"という意味で、ゲームでは"オブジェクト同士の重なり順"を意味します。
2Dのゲームでは3Dと違い一点の視点からしかオブジェクトを見ることができないので、
オブジェクトには必ず優先順位を設定してあげないといけません。

構文だけじゃ分かりづらいと思うので画像を用意しました。ご覧ください。

Screenshot_2014-12-14-22-38-25 (2)

マリオと草が重なっているのが分かりますよね。
これは「マリオは草よりも手前に表示させなさい。」とsetZIndexメソッドを使って命令しているからです。
もし、この命令を忘れてしまうと、(コードにもよりますが…)スタート地点にある草はマリオより奥に表示されても
画面スクロールによって新たに生成された草ではマリオよりも手前にきてしまいます。(理由は後述。)

もちろんマリオと草だけではなく、ゲーム中に登場するオブジェクトには
みんなみ~んなレイヤーを設定してあげないといけないということもお忘れなく!

…ちょっとめんどくせーっと思ったかもしれませんが、
変数と組み合わせてやれば簡単に実装できるので是非やってみましょう!

まずは変数の宣言からです。

private int レイヤー01タイル用		= 1;
private int レイヤー02アイテム用 = 2;
private int レイヤー03敵キャラ用 = 3;
private int レイヤー04プレイヤー用 = 4;
private int レイヤー05アイコン用 = 5;
private int レイヤー06テキスト用 = 6;
private int レイヤー07デバッグ用 = 7;

(懲りずに日本語変数ですね^^;ハイ…)
これを見てもう分かったと思いますが、一つ一つのオブジェクトに優先順位を設定するのではなく、
タイルセットのレイヤーや敵キャラセットのレイヤーなど複数のジャンルに絞込むとかなり楽チンです。

setZIndexメソッドは中の設定値が高いほど手前に表示される仕組みで、この設定値で行くと…、
「(設定無し)<タイル<アイテム<敵キャラ<マリオ<…」の優先順位でオブジェクトが表示されるようになります。

「(設定無し)」というのはオブジェクトの生成時に"setZIndexメソッド"を付けなかったときの場合です。
この場合は自動的に一番最下層のレイヤーとして表示されます。
ちなみに、大体の2Dゲームではこの順番で成り立っているので、
オブジェクトの優先順位に迷ったらとりあえずはこちらの値を指定してみてくださいね。

ではいよいよsetZIndexメソッドの登場です。

playerMario = getBaseActivity().getResourceUtil()
.getAnimatedSprite("player_01_mario_set_1.png", 1, 30);
playerMario.setPosition(64, 480);
attachChild(playerMario);
// ここでレイヤーの設定をする
playerMario.setZIndex(レイヤー04プレイヤー用);
sortChildren();

コードの6行目にやっとsetZIndexメソッドが登場しましたね。
特に解説することはありませんが、setZIndexメソッドは必ずオブジェクトの画像を読み込んでから設定してくださいね。
それとsetZIndexメソッドを使う場合は7行目のsortChildrenメソッドも必要になるみたいなので、
この2つをセットで宣言するのをお忘れなく!

ちなみに、この"setZIndexメソッド"を使ってレイヤーを設定してやらないと、
いったいどのように表示されるのかというと…。
Andengineでは自動的に"一番最後に生成したオブジェクトが手前にくるよう"設定されているので、
新たにオブジェクトが生み出されるたびに手前に来るなどやりたい放題になります。
(「画面スクロールによって新たに生成された草ではマリオよりも手前される」というのはその為。)
よって、一つの画面内で遊ぶ簡単なゲームではいちいちレイヤーを設定する必要はありませんので、
時と場合によって使い分けてみてください。

解説は以上です!多忙な時期なので年内最後の更新かもしれませんが、またちょくちょくと見に来てくださいね。
それでは、来年もよろしくお願いします。

Screenshot_2014-12-14-22-50-59.png

プロフィール

岡本 賢治

Author:岡本 賢治
 
☆☆☆☆☆☆☆☆☆☆☆☆
 
Android専用アクションゲーム
「スーパーけんじラン」好評配信中!
 
↓↓↓↓↓↓↓↓↓↓↓↓

 
・公式サイトはこちらから
http://okamotodo.jimdo.com/

最新トラックバック

アクセスカウンター

オンラインカウンター

現在の閲覧者数:

検索フォーム

ブロとも申請フォーム

QRコード

QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。