本日は、RPGやアクションゲームで定番の「落とし穴」をcocos2dとTiledを使って実装する方法を考えていました。以前に「落とし穴」のコードは書いていたのですが、実際にうまくできるように調整をしていました。
私が考える「落とし穴」とは、こんな感じです。
これを順番に作っていったら、「落とし穴」として機能するでしょう。
キャラクターが「落とし穴」の領域に入る
まずはTiledの画面で使い、「落とし穴」の黒い領域を作ります。
cocos2dでレイヤーを取り出すためのプロパティを設定します。
このレイヤーをCCTMXTiledMapクラス内で取り出して、キャラクターと重なったときの処理を考えいきます。 レイヤーとキャラクターの位置が重なった処理はCCTMXLayerクラスのtileGIDAtメソッドを使います。
キャラクターが小さくなって「落とし穴」の領域に落ちていく
ここが一番悩んでいて、まだ完璧な処理ができていないのですが、CCActionクラスを使ってキャラクターが穴におちているようにみせます。
例えばこんなコードを実装しています。私はキャラクターの進行方向によって、「落とし穴」が落ちていく場所を変えています。 [c] //pointはキャラクターの進行方向によって違う値が来ます。 id action1 = [CCMoveBy actionWithDuration:0.5f position:point]; id action2 = [CCScaleBy actionWithDuration:1.5f scale:0.1f]; id action3 = [CCCallFuncN actionWithTarget:self selector:@selector(movePlayer:)]; [self runAction:action];
//この中にキャラクターの移動処理を書きます。 -(void)movePlayer:(id)sender{
}
[/c]
ここで問題点が一つあります。 キャラクターがどこから「落とし穴」に接触するかで、キャラクターの動きが変になってしまいます。 例えば、落とし穴に対して垂直に侵入してくれた場合は、うまくいくのですが。
斜めから、外側に侵入したりすると、キャラクターが外にはみ出てします場合があります。
これに関して色々考えたのですが、今のところ解決策が見つかりません。 今現在、妥協点として、落とし穴に落ちたときに、早くキャラクターを移動させて、この部分を目立たなくしています。 これを実際にplayしてくれる人が気持ち悪く感じなければいいのですが。
キャラクターが移動する
これは落とし穴の種類によって、移動方法を変えてあげます。 例えば、タイルレイヤーのプロパティ(赤枠)に移動先を記入して、それを条件式を使って移動方法を変えてあげます。
移動の処理自体は、画面を移動する処理と全く同じです。 [c]
//私はGameSceneクラスにreloadGameというメソッドを作って、画面を移動させています。 //toNextMapは移動先 [(GameScene*)self.parent.parent.parent reloadGame:toNextMap];
[/c]
ただ移動するだけではなく、キャラクターにダメージを与える処理をしてあげれば、よりゲームらしくなりますね。
実際のできたもの
どうでしょうか? なんとなく落とし穴に見えませんか? 私としては、CCActionでのキャラクターの移動に関してはもう少しいじってみたいです。
最後に
一見難しそうなモノでも一つ一つの処理を細かく考えていけば、初心者でも思っているような動きを表現することができると思います。 敵を倒すだけではなく、ダンジョンに色々な仕掛けがあれば面白いと思います。 今回は「落とし穴」ですが、他にも自分が作れそうなモノを作っていきたいです。