スポンサーサイト

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

壊れるブロックの実装

今回はマリオシリーズに登場するレンガブロック「tile_33_brick_block_small.png」を実装してみました。

このゲームには通常のレンガブロックと、一回りサイズの大きいデカレンガブロックの2種類が登場します。

Screenshot_2014-07-03-20-33-40.png

コードを解説する前に本家マリオに登場するレンガブロックの性質をおさらいすると…。

1.ブロック全体に接触判定があり、マリオが上に乗っかることができる。
2.スーパーマリオ、もしくはファイアマリオの状態で下から触れると割ることができる。
3.中には割れない"当たりのブロック"もあり、その場合はコインなどのアイテムが隠されている。

大まかにこの3つがマリオシリーズ共通のレンガブロックの性質ですが、
3番の「中には割れない"当たりのブロック"もあり、その場合はコインなどのアイテムが隠されている。」は"諸事情"により今回はスルーします。
(最も本家とは少し違う方法でアイテムを隠すようにはしたいですが…。)

ですので、今回の実装は1番の「ブロックの接触判定」と、2番の「下から触れた際の割れる挙動」ですね。

まず、レンガブロックの下…つまりマリオの頭部分の赤いラインにレンガブロックが触れたときの処理を見てみましょう!

public void tileAndPlayerAboveContact() {
if (((Sprite) getChildByIndex(タイル)).collidesWith(
contactLines.playerContactLineAbove)) {
float 判定遊び = 0;
float 接触距離 = Math.abs((getChildByIndex(タイル)
.getY() + ((Sprite) getChildByIndex(タイル))
.getHeight() / 2) - (contactLines.playerContactLineAbove
.getY() + (contactLines.playerContactLineAbove
.getHeight() / 2)));
// 15.地面ブロック(短い)
if (getChildByIndex(タイル).getTag() ==
GroundBlocks.TAG_TILE_15_GROUND_BLOCK_SHORT
// ※ブロックはジャンプ時のみ判定
&& プレイヤーのダッシュフラグ == false && プレイヤーのジャンプフラグ == true
&& プレイヤーの上昇移動フラグ == true) {
判定遊び = 0;
if (接触距離 < contactLines.playerContactLineAbove.getHeight()
/ 2 + ((Sprite) getChildByIndex(タイル)).getHeight()
/ 2 - 判定遊び) {
tileAndContactLineAboveDecision();
}

// 省略…

// 33.レンガブロック(小さい)
} else if (getChildByIndex(タイル).getTag() ==
BrickBlocks.TAG_TILE_33_BRICK_BLOCK_SMALL
// ※ブロックはジャンプ時のみ判定
&& プレイヤーのダッシュフラグ == false && プレイヤーのジャンプフラグ == true
&& プレイヤーの上昇移動フラグ == true) {
// ライフが2以上のとき、ブロックを破壊できる
if (現在のライフ >= 2) {
SoundPlay.seBrickBlock.stop();
SoundPlay.seBrickBlock.play();
収納用タイル.add((Sprite) getChildByIndex(タイル));
}
判定遊び = 0;
if (接触距離 < contactLines.playerContactLineAbove.getHeight()
/ 2 + ((Sprite) getChildByIndex(タイル)).getHeight()
/ 2 - 判定遊び &&
// ライフが1のときは落下判定
現在のライフ == 1) {
tileAndContactLineAboveDecision();
}

// 省略…

// 68.はり(下)
} else if (getChildByIndex(タイル).getTag() ==
Needles.TAG_TILE_68_NEEDLE_BELOW
// ※ブロックはジャンプ時のみ判定
&& プレイヤーのダッシュフラグ == false && プレイヤーのジャンプフラグ == true
&& プレイヤーの上昇移動フラグ == true) {
判定遊び = 0;
if (接触距離 < contactLines.playerContactLineAbove.getHeight()
/ 2 + ((Sprite) getChildByIndex(タイル)).getHeight()
/ 2 - 判定遊び) {
tileAndContactLineAboveDecision();
if (状態フラグ点滅 == false) {
// はりに触れた場合、敵キャラのこうげきと同じ処理
enemyAndPlayerNormalDecision();
}
}
}
}
}

tileAndPlayerAboveContact()メソッドはマリオの頭上判定…つまり、マリオの上に付いている赤いラインとメソッド内のオブジェクトが触れたとき、指定された処理内容が実行されます。

では、「// 33.レンガブロック(小さい)」に注目してください。
ここで注意しなければいけないことは、スーパーマリオ(と、ファイアマリオ)の状態で触れるとレンガブロックを割れることですよね。
「現在のライフ」という変数は以前解説しましたが、マリオの状態を管理している変数です。

1 == ならマリオ(チビ)
2 == ならスーパーマリオ
3 == ならファイアマリオ

ここでは「現在のライフ >= 2」つまり、スーパーマリオの状態でレンガブロックに触れた場合はレンガブロックが割れるようにしていますが、ここでも本家のマリオとは少し違う点があります。
本家のマリオはレンガブロックをジャンプで割った後、即座に地面へ落下しますが、このゲームはレンガブロックをジャンプで割っても画面から指を離すまで(もしくは、ジャンプ力が限界値に達するまで)マリオは落下しません。

Screenshot_2014-07-05-15-23-15.png

↓↓↓↓↓↓↓↓↓↓

Screenshot_2014-07-05-15-23-53.png

自動スクロールゲームではプレイヤーは停止できませんよね。
ですからこの場合一つ一つ割っていくより一気に破壊できた方が効率が良いのです。
無理に本家マリオを再現するより、遊びやすさを優先的に作っていった方が良いですもの。

…以上でレンガブロックの解説を終わります…っえ?マリオが横から触れた時の解説がまだだって?

それは以前解説した当たり判定"右"の実装で解説済みですよ!
この処理をメソッド化し、当たり判定のある全てのブロックは共通でこのメソッドを呼び出しているというわけです。
スポンサーサイト

コメント

非公開コメント

プロフィール

岡本 賢治

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

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

最新トラックバック

アクセスカウンター

オンラインカウンター

現在の閲覧者数:

検索フォーム

ブロとも申請フォーム

QRコード

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