スポンサーサイト

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

当たり判定"上"の実装

当たり判定の"右"と"下"が実装できたら残るは"上"だけですね。ちゃっちゃと実装しちゃいましょう!

Screenshot_2014-03-31-06-06-36.png

上の赤いラインにブロックが触れるとブロックの種類によってさまざまなアクションを起こします。
ラインの設置場所はヨコからの接触を判定する緑色のラインよりも少し高めに設置しないとマリオがブロックをたたいた際に、若干右にずれてしまうので注意しないといけません。

ハテナブロックの中にはいろいろなアイテムが隠されており、ブロックごとにどのアイテムが出てくるのかあらかじめ決めておく必要があるのですが…めんどくさいことにアイテムの数だけスプライトを生成する必要があります。
これは"ハテナブロックの中身の数と同じ分だけスプライトも用意する"ということで、
たとえばコインが入っているハテナブロックとスーパーキノコが入っているハテナブロックを用意したい場合、
見た目が同じハテナブロックのスプライトデータを2つ分用意しないといけないことになります。

Screenshot_2014-03-31-06-08-25.png

ちなみに…見た目が同じ画像は使いまわせるので、画像は使いまわしたほうが容量的にも親切でしょう。
自分はデバッグ時にどのアイテムが入っているか分かったほうが作業が捗るので、画像もブロックの数だけ用意しています。容量的にあまりよくないと思うけど…。

実際にどんなアイテムが隠されているかは、このゲームをやって確かめてみてくださいね。

そして忘れてはいけないのがマリオの移動処理です。

IMG_20140331_062306.jpg

赤いラインとブロックがぶつかった場合、上図のように「上昇移動フラグをfalse」にします。
ここは何度も解説してるので説明はもう不要ですよね。ジャンプの処理を中断しています。

このゲームは左にはスクロールしないので、左側の判定は作る必要ありません。
よって今回の実装でプレイヤーの判定部分は完了したことになります。お疲れ様でした。
スポンサーサイト

当たり判定"下"の実装

以前行った当たり判定"右"の実装に加えて、今回はマリオが地面に触れると走るようにしたいと思います。

system_03_title_back (2)

前回の実装段階ではマリオが地面を走るY座標が352(下からブロック2つ分の高さ)で固定だったため、下が地面だろうが落とし穴だろうが関係なく走っていましたが、それだとまずいので今回も当たり判定を加えていきたいと思います。

Screenshot_2014-03-29-16-31-38.png

今回加えたのは青い色のライン。
これをマリオの足元部分にくっ付け、ハンドラーで動かしてやります。
※当たり判定の基礎概念は当たり判定"右"の実装で解説してますので軽くだけ解説します。

~コード1~
IMG_20140306_141435.jpg

これは以前ジャンプの実装で紹介したコードです。今回の実装もふまえて正確にはジャンプのコードではなくマリオが上下に移動するコードといったほうが正しいでしょう。

~コード2~
IMG_20140329_170755.jpg

今回の実装で加えた青いラインと地面のブロックが触れている間は"tileAndContactLineBelowDecision()"という長ったらしいメソッドを呼び出します。
メソッドの中身で「ダッシュフラグをtrue」にしていますね。すなわち上図(~コード1~)のelse if (ダッシュフラグ == false)の中身が呼び出されないため、マリオのY軸移動がストップ!よってマリオが下へスクロールしないことになります。

最後に・・・

~コード3~
IMG_20140329_172328.jpg

上図はハンドラー(実際にゲームを動かす部分)の先頭部分なんですが、ここで必ずフラグを初期化しておきます。
ここを怠るとマリオがジャンプした際にダッシュフラグがtrueのままになるのでふたたびマリオが落下しなくなります。

重いゲームを軽くしてみる

先日購入した端末(N-04C)でゲームを起動したところ、動作がカクカクだったのでいろいろと調べてみたら、どうやら画面上にスプライトを配置しすぎていたのが原因だったみたいです;

tile_01_grass_part_1.png  tile_02_grass_part_2.png  tile_03_grass_part_3.png

AndEngineではアタッチすることで画面上にスプライトを描画することができるのですが、どうやらアタッチをしすぎると(古い端末では特に)処理スピードが遅くなってしまいます。これは本来のゲームでも同じですよね。

このゲームでは2次元配列で管理しているもの(草や山、ブロックなど)や、画面上にアタッチされているものはすべてスプライトデータで構成されております。※以下の画像をご覧ください

system_03_title_back (3)

画像を見ていただくとお分かりかと思いますが、タテ15マス、ヨコ25マスの計375マスの中のどれかに一つ一つブロックや草の一部をはめ込んでいき、スプライトデータとしてアタッチしています。
ちなみにマス単位で描画しているのは本家のマリオでも同じです。(というか、大体の2次元ヨコスクロールゲームはこの方法で作られていると思います。)

改めて、これをN-04Cでスクロールさせるとかなり重く動作がカクカクだったのですが、アタッチするスプライトの画像を減らすことでだいぶマシにはなりました。

軽くする方法として、一つ一つアタッチしていたものをまとめてアタッチする、ことです。

tile_17_ground_block_short.png



tile_18_ground_block_long.png

これは上にマリオが乗っかる地面のブロック。
これを従来一個ずつアタッチしていましたが、今回の変更で10個まとめてアタッチしてみたところだいぶサクサク動くようになりました!
まとめて出すとその分画像は大きくなってしまうのですが、動作はこっちのほうがはるかに軽いみたいですね。
もちろん草や山もパーツで出さずまとめて出したほうが動作が軽くなるのは分かっています。
ただその場合長さ(特にドカン)や形などのパターンを変更できなくなるので、すべての形の分画像を用意しないといけないため非常に面倒です。
こればかりは難しいですよね;

でも、できるだけたくさんの人に遊んでもらいたいので、今後も多くの端末で快適に操作できるよう作っていくつもりです。

新しい端末を購入

以前まで使ってたネクサス7(2013年モデル)のタッチパネルが破損したため、オタロードのとあるPCショップで中古のドコモのスマートフォン(N-04C)を購入しました。

medias1.jpg

ただのデバッグ用に使う端末なのでできるだけ安い端末を購入したわけですが、実際にゲームを起動してみると・・・動作がもんの凄く重い^^;
でも、ネクサスだけを基準に作ってしまうと古い端末ではまともに動作しないことが分かりました。
前職のデバッグでもいろんな端末を使って不具合等の確認を行ってたのを思い出したので、近いうちにネットショッピングで他社の端末(今度はもう少し性能がいいやつ・・・)も買ってみようかと思います。

~余談~
趣味でYouTubeのkenjik3チャンネルで気に入った音楽を耳コピーしたりもしています。
当ブログからYouTubeのリンクを張ってなかったのでここで少し紹介しますね。

https://www.youtube.com/user/kenjik3

当たり判定"右"の実装

ついにマリオがタイルにあたるようになりました!
今回はマリオが横からドカンに触れると画面外へとスクロールします。

Screenshot_2014-03-07-06-17-22.png

↓↓↓↓↓↓↓↓↓↓

Screenshot_2014-03-07-06-17-34.png

方法はいたってシンプルで、マリオがタイルに触れた場合タイルのスクロール値と同じ値を指定してやるだけです。
コードはこんな感じ…。
marios.playerMarioNormal.setX(marios.playerMarioNormal.getX() - タイルのスクロール値);

marios.playerMarioNormal変数はマリオを描画する「スプライト系」の変数。
AndEngineには変数の型にSpriteというものがあり、attachChildで画像を表示させたり、
setPositionで簡単に画像を指定の位置にセットすることができ実に便利です。

※ちなみにマリオは正確にはアニメスプライト(AnimatedSprite)で、これはスプライトにコマ送りでアニメーションをつけたいときに使う。普通のスプライトにはできないアニメーションでキャラクターを描画することができるので、動かしたいスプライトがある場合はこちらを使おう!画面表示や指定座標へのセットなど基本的な使い方は普通のスプライトと同じです。

上記のコード(marios.playerMarioNormal.setX(marios.playerMarioNormal.getX() - タイルのスクロール値);をハンドラーの中に記述し、マリオがタイルに触れた場合、setXメソッドで左に少しずつずらしていきます。

…が、ここで気をつけなければ行けないことがあり、実際に当たったかの判定を感知するのはマリオではなく、
接触したか否かを判断するだけのスプライトが必要になってきます。

Screenshot_2014-03-07-07-53-15.png

赤い矢印の先にマリオと重なって緑色の四角が見えましたでしょうか?
これこそが横からの接触判定を専門としたスプライトです。
この接触判定のスプライトをマリオの座標と重なるようにセットすることで、マリオが画面外へ移動しても永遠と追いかけ続けます。

その他、地面の接触判定スプライト(下)と、マリオの頭部分が触れたかを判断するスプライト(上)も追加しないといけないわけなんですが、こうやって考えると結構めんどくさいですよね;
でも、もしも手を抜いて接触判定をマリオ単体で持たせてしまうと、
横からあたった場合はよいのですがドカンの上に飛び乗った場合、ベルトコンベアーのように左へと流されていってしまうのです;

ジャンプの実装

スーパーマリオといえば、やはりジャンプですよね。
画面をタッチするとマリオが「ぷう~ん」っとジャンプします!

前回まで画面左下にあったジャンプボタンを取り除き、こうげきボタン以外の好きな箇所でジャンプ操作をできるようにします。
こうすることで両手での操作はもちろん、片手でも操作できるように配慮しました。

Screenshot_2014-03-06-13-15-34.png

さて、マリオがジャンプするか否かは、主にTouchEventとboolean型の変数で判断しています。
まず最初にboolean型の変数を2つ("ダッシュフラグ"と"上昇移動フラグ")用意し、TouchEventの中にそれぞれ記述していきます。
※ダッシュフラグはtrueならマリオが地面に触れている、falseならマリオが浮いているかを判断し、
上昇移動フラグはtrueマリオが上へ上昇、falseなら下へ下降を判断する。

AndEngineのTouchEventにはACTION_DOWNというものがあり、こちらの引数は主に端末の画面をタッチしている間戻り値の値を返します。
この場合、先ほど宣言した上昇移動フラグをtrueにする。
もう一つはACTION_DOWNとは逆で画面のタッチを解除した場合に呼ばれる引数で、ACTION_UPというものがあります。
こちらの引数が呼ばれた場合は、上昇移動フラグfalseにします。

それでは、この2つの仕組みがわかったところでジャンプ処理のコードを見てみましょう!

IMG_20140306_141435.jpg

画面をタッチし、上昇移動フラグがtrueになると一番上の"if (上昇移動フラグ == true)"の中身が実行されます。
ここでマリオ(marios.playerMarioNormal)のY軸をマイナス(-)にセットすることで上へと移動するわけですが、単にデクリメントするのではなくアスタリスクイコール(*=)を指定し、移動の幅を徐々に緩めていくことでマリオがちょーきれいな放物線を描いて跳んでくれるようになります。

タッチを解除すると今度は真ん中辺りにある"else if (ダッシュフラグ == false)"が呼び出されます。
こちらは逆にマリオのY軸をプラス(+)にセットしているので、下のほうへと落下するわけですね。

これで終わりではありませんよ!最後に一番下のif分に注目してください。
ここではタッチを解除しなくても一定の高さ(ブロック5つ分の高さ)を満たしたら強制的に落下するようにもなっています。
これを書き忘れるとマリオがずーーーっと浮いたままになってしまうので、このようにACTION_DOWNが呼ばれなくてもマリオが落下するようなコードも忘れずに記述しないといけないということですね。

ファイアボールの実相~その2~

以前紹介した「ファイアボールの実相~その1~」の続きです。

Screenshot_2014-03-01-07-57-39.png

画面右のフラワーマークのボタンをタップすることでマリオがファイアボールを放ちます。
一見以前と何も変わってないようですが、今回は"1フレームごとに敵に当たったかを判断する"ため、ハンドラーの中に判定処理を記述しました。
(以前の段階ではファイアボールと敵キャラの接触判定をハンドラーの外に記述していたため、ぶっちゃけマリオがファイアボールを放った瞬間しか当たり判定はありませんでした;)

ゲームではよく使われるハンドラーですが、もちろんAndEngineにも入っています。
命令方法は以下のとおり。

1. public TimerHandler フレームレート = new TimerHandler(
2.     1f / 60f, true, new ITimerCallback() {
3.         public void onTimePassed(TimerHandler pTimerHandler) {
4.             // ここに1フレームごとの処理内容を書く
5.         }
6.     });

このハンドラー場合「1f / 60f」としているので、1秒間に60回もの動作をコマ送りしているということになります。(たぶん…)
言い換えれば60fpsですね。非常にぬるぬる動きます。

Screenshot_2014-03-01-08-00-41.png

ファイアボールは本家のマリオと同じ2発動時に放つことができますが、その分もち玉数もすぐになくなってしまうので乱射は禁物です。できるだけ踏むようにしましょう。

Screenshot_2014-03-01-07-56-02.png

敵キャラの中にはファイアボールが効かない種もいます。
キラーなんかがそうでしたよね。ほかにもメットとか…。

…とまあ、こんな感じです。
ハンドラーの中にコードを記述すれば、より高度な当たり判定を実装できるということが分かってきたので、ブロックなどの接触判定も近いうちに実装できそうです。

プロフィール

岡本 賢治

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

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

最新トラックバック

アクセスカウンター

オンラインカウンター

現在の閲覧者数:

検索フォーム

ブロとも申請フォーム

QRコード

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