スポンサーサイト

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

無敵マリオの実装

さて、ゲーム作りもいよいよ終盤(マリオでいうと7-1くらい)に差し掛かってきましたよ。
今回はマリオシリーズでおなじみの"マリオが無敵になるプログラム"を組んでみました。

Screenshot_2014-07-12-02-24-07.png

↓↓↓↓↓↓↓↓↓↓

Screenshot_2014-07-12-02-25-22.png

このゲームでは(☆取得以外の)"とある条件"を満たすとプレイヤーが無敵になります。
無敵中は敵や針もなんのその!おまけに攻撃力がUPしたりで良いこと尽くめです!

でも無敵だからといって油断してると…。

Screenshot_2014-07-12-02-39-19.png

穴に落ちてしまうこともあるので気をつけて!
穴に落ちた場合は本家マリオ同様"ミス扱い"となります。

プログラムコードの内容は「無敵フラグがONのときに敵に触れるとやっつける」という処理を行うだけのシンプルな内容ですが、その前に一つやらなければいけないことがあります。

"プレイヤーの変化"ですね。

「いやっふー!今の僕は無敵状態だぞ!」とアピールするために現在のプレイヤーであるマリオのグラフィックを輝かせましょう!

player_01_mario_normal.png

これはマリオの全てのグラフィックが収録された画像データで、ここから走る動作やジャンプ時の動作など、使いたい画像だけを切り取って表示しています。
そうです。以前勉強したAnimatedSprite(Animatedスプライトについての解説を開く)ですね。

…それにしてもこの画像長すぎゃしやせんか^^;
縦だけじゃなく横にも同じ大きさの画像を並べて使いたい部分だけを抜き出すプログラム(それこそマップチップのように)が組めたらいいのに。今のコードでは無理みたいですね。

まあ「俺は長くても気にならないぜっ!」って方ならいいのですが…。
でも、困ったことにこれ以上長くしたい場合など、画像の長さが2000ピクセル(本当はもうちょいあるけど目安としてはこのくらい)を超えてしまうと、問答無用で"真っ黒な画像"に切り替わってしまうので注意が必要です。

Screenshot_2014-07-12-02-50-25.png

※長くしすぎると上図のようにプレイヤーが真っ黒になります。

これでも色々と画像の不要な部分(以前あったマリオの棒立ちのコマとか、無敵の点滅のコマの一つ目)を削り、何とか画像が表示されるまでに収まりました;

ちなみにこれ以上アニメーションを増やしたい場合は、無理せず複数のマリオ変数を作ると良いかもしれませんね。
無敵でないいわゆる"ノーマル状態"のマリオのAnimatedSprite変数と、無敵状態のマリオの輝く姿のみを描画した"無敵状態"のマリオのAnimatedSpriteの二つを管理するなど、探せば色々と方法はあるはずです。(ただ、この場合処理がめんどくさそうですが…。)
もっとも、プログラムは楽をしてなんぼなので出来るだけ簡単な方法でゲームを動かしたいですね。

…では気を取り直してプログラムコードの中身を見てみましょう!

// 敵キャラとプレイヤーの接触処理
public void enemyAndPlayerContact() {
// 点滅状態でない場合のみ接触
if (状態フラグ点滅 == false ||
プレイヤーの上昇移動フラグ == false && プレイヤーの下降移動フラグ == true) {
// マリオと敵キャラの衝突判定
if (((Sprite) getChildByIndex(敵キャラ)).collidesWith(
marios.playerMarioNormal)) {
float 判定遊び = 0;
float 接触距離 = Math.abs((getChildByIndex(敵キャラ)
.getY() + ((Sprite) getChildByIndex(敵キャラ))
.getHeight() / 2) - (marios.playerMarioNormal
.getY() + (marios.playerMarioNormal
.getHeight() / 2)));
// クリボー!
if (getChildByIndex(敵キャラ).getTag() ==
Goomba.TAG_ENEMY_01_GOOMBA) {
判定遊び = 0;
if (接触距離 < marios.playerMarioNormal.getHeight()
/ 2 + ((Sprite) getChildByIndex(敵キャラ)).getHeight()
/ 2 - 判定遊び) {
// 無敵の場合、問答無用でやっつけ
if (状態フラグ無敵 == true) {
SoundPlay.seDefeat.stop();
SoundPlay.seDefeat.play();
enemyAndPlayerJumpAttackDecision(getChildByIndex(敵キャラ).getTag());
// 無敵でない場合、フラグ分岐
} else {
// プレイヤーが何もしない場合、敵キャラのこうげき
if (プレイヤーのダッシュフラグ == true || プレイヤーの上昇移動フラグ == true) {
enemyAndPlayerNormalDecision();
// プレイヤーが落下中の場合、プレイヤーのジャンプこうげきが炸裂
} else if (プレイヤーのダッシュフラグ == false && プレイヤーの上昇移動フラグ == false) {
SoundPlay.seTap.stop();
SoundPlay.seTap.play();
// 敵キャラとかを踏んだことを証明する
連続で踏んだか否か = true;
// 画面を放すと小ジャンプ
if (タッチフラグジャンプ == false) {
踏み台ジャンプの上昇移動値 = 24;
踏み台ジャンプの下降移動値 = 4.8f;
// 画面を押すと大ジャンプ
} else {
踏み台ジャンプの上昇移動値 = 48;
踏み台ジャンプの下降移動値 = 9.6f;
}
enemyAndPlayerJumpAttackDecision(getChildByIndex(敵キャラ).getTag());
}
}
}

// 省略…

// プクプク!
} else if (getChildByIndex(敵キャラ).getTag() ==
CheepCheep.TAG_ENEMY_13_CHEEP_CHEEP) {
判定遊び = 0;
if (接触距離 < marios.playerMarioNormal.getHeight()
/ 2 + ((Sprite) getChildByIndex(敵キャラ)).getHeight()
/ 2 - 判定遊び) {
// 無敵の場合、問答無用でやっつけ
if (状態フラグ無敵 == true) {
SoundPlay.seDefeat.stop();
SoundPlay.seDefeat.play();
enemyAndPlayerJumpAttackDecision(getChildByIndex(敵キャラ).getTag());
// 無敵でない場合、フラグ分岐
} else {
// プレイヤーが何もしない場合、敵キャラのこうげき
if (プレイヤーのダッシュフラグ == true || プレイヤーの上昇移動フラグ == true) {
enemyAndPlayerNormalDecision();
// プレイヤーが落下中の場合、プレイヤーのジャンプこうげきが炸裂
} else if (プレイヤーのダッシュフラグ == false && プレイヤーの上昇移動フラグ == false) {
SoundPlay.seTap.stop();
SoundPlay.seTap.play();
// 敵キャラとかを踏んだことを証明する
連続で踏んだか否か = true;
// 画面を放すと小ジャンプ
if (タッチフラグジャンプ == false) {
踏み台ジャンプの上昇移動値 = 24;
踏み台ジャンプの下降移動値 = 4.8f;
// 画面を押すと大ジャンプ
} else {
踏み台ジャンプの上昇移動値 = 48;
踏み台ジャンプの下降移動値 = 9.6f;
}
enemyAndPlayerJumpAttackDecision(getChildByIndex(敵キャラ).getTag());
}
}
}
}
}
}
}


enemyAndPlayerContact()メソッドは全ての敵キャラとの接触判定を見るメソッド、つまりプレイヤーと敵キャラが接触したときに呼び出されるメソッドです。
ここではクリボーとプクプクしか紹介していませんが、「// 省略…」の中に他の敵キャラの処理も書いています。
全部載せると非常にコードが長くなってしまうので省略させていただきました。

それでは、まずクリボーの接触コードを見てみてください。
敵キャラに触れたときプレイヤーが無敵状態であるか否かを判断していますね。
ここで無敵状態だった場合は敵キャラをやっつける"enemyAndPlayerJumpAttackDecision(getChildByIndex(敵キャラ).getTag())"という長ったらしいメソッドが呼び出されます。
このメソッド内では触れた敵キャラを削除し、得点をプラスするなどの処理が行われております。

次にプレイヤーが無敵状態ではない場合、さらに分岐が行われるのですが、これは単にプレイヤーが落下中か否かを確かめてるだけです。
プレイヤーが落下中ではなく地面を走っている場合は敵キャラの攻撃が行われミスになりますが、落下中の場合は踏んだとみなされ無敵状態で使ったものと同じ"enemyAndPlayerJumpAttackDecision(getChildByIndex(敵キャラ).getTag())"メソッドが呼び出されるというわけです。

「でもこれだとプレイヤーがどこから触れても踏んだことになるじゃん!」って思った方もおられると思いますが、実はこれでいいのです。
初代マリオをやりこんでらっしゃる方ならお分かりだと思いますが、マリオ1と2はプレイヤーが落下中の場合、マリオの全ての部分に踏みつけ判定があるんですよ!
(このテクをいかせばにっくきハンマーブロスも頭突きでイチゲキコロリですがそれはまた別のお話…。)

…とまあ、一応無敵のプログラムはこんな感じです。
だんだんとゲームの雛形が完成に近づいてきたので、コースやBGMも作っていかないといけませんね。
これからはあまり更新出来ないかもしれませんが、また暇があったら見てやってください。では!



~おまけ~

Screenshot_2014-07-12-02-57-52.png

ドット絵を差し替えてみました。

ではでは^^;(本当の本当に終わり)
スポンサーサイト

コメント

No title

こんにちわ(^^

黒落ち笑ってしまいましたw
すごくクオリティ高くてびっくりです!
おまけ画像もとてもファンシーで公開されるのが待ち遠しいです♪

Re: No title

> こんにちわ(^^
>
> 黒落ち笑ってしまいましたw
> すごくクオリティ高くてびっくりです!
> おまけ画像もとてもファンシーで公開されるのが待ち遠しいです♪

いつもありがとうございます!

黒落ちのコースはマリオでいう地下のコースですね。
画面上部のテキストは1-1のままですが切り替わるように調整したいです。

リリースまでもうしばらくお待ちくださいね!
非公開コメント

プロフィール

岡本 賢治

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

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

最新トラックバック

アクセスカウンター

オンラインカウンター

現在の閲覧者数:

検索フォーム

ブロとも申請フォーム

QRコード

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