ゲーム開発日誌part12  自機の位置を利用した敵機の行動パターン

本日、引き続き、敵及び攻撃パターンを作っていました。その中で、「Player」の位置に応じて、敵が近づいてくる攻撃パターンを考えて、コードを触っていたのですがなかなかうまくいかずに、Twitterにツィートして所、shi3zさんが「こうすればうまくいくよ」と返信をいただいたので早速cocos2dでやってみました。

Twitterでのやりとり

スクリーンショット 2012 05 11 22 49 26 ↓↓↓ スクリーンショット 2012 05 11 22 49 09

2つある方法中のの後者については外積をネットで調べても全然わからなかったので、前者の差分ベクトルを使って考えました。

敵を自機(プレイヤー)に接近させる処理

色々調べてみたところ、cocos2dで、差分ベクトルを計算する方法は以下のようになります。

[c] CGPoint v = ccpNormalize(ccpSub(player.position, self.position)); self.position = ccpAdd(v , self.position); [/c] このコードをupdate内に設置すれば、現在の「自機の位置」と「敵機の位置」の差分を計算して,「敵機の位置」に足しています。

ここでの重要な点は「ccpNormalize」です。 これを調べてみるとCGPointExtensionクラスに内にこのように定義されています。 [c] ccpNormalize(const CGPoint v) { return ccpMult(v, 1.0f/ccpLength(v)); }

//2点間のベクトルの長さを計算 ccpLength(const CGPoint v) { return sqrtf(ccpLengthSQ(v)); }

ccpLengthSQ(const CGPoint v) { return ccpDot(v, v); }

ccpDot(const CGPoint v1, const CGPoint v2) { return v1.xv2.x + v1.yv2.y; }

[/c]

2点間のPointの差に、1を2点間のベクトルの差で割ったモノをかけています。詳しいことはよくわからないのですが、「2点間ベクトルの移動量」と考えてください。 Playerが動かなければ、同じベクトルで移動します。

赤い矢印が一回における移動量と移動方向です。 Testd2012 5 11 dd

もしPlayerが動けば、新しいベクトルで移動量と移動方向を計算して移動します。 Testd2012 5 11 d

こうすれば、敵機が自機にと重なり合うまで移動します。

実際に攻撃パターンに実装する

今回私は、竜巻が自機(プレイヤー)に近づいてくる処理を実装しました。 ただ自機を追いかけるのではなくて、「当たり判定」「自機の攻撃を受けると消える」などの処理も同時につくっています。

「動画」

自機の位置で移動場所を変える

この行動パターンはupdate内でなくCCActionクラスを使っています。そのため、「ccpNormalize」は使わずに、自機と敵機の差分を計算して移動の場所を変えています。

CCJumpByのy座標の移動位置を、自機と比較して変更することによって、ただ飛ぶのではなく、自機を狙った動きになります。 スクリーンショット 2012 05 11 22 24 09

「動画」

最後に

今回色々調べてみて、数学の知識が全然足りないと感じました。この辺は何か本なりで勉強しないと、ゲーム開発で色々制限がでてきそうだ。

cocos2dには、今回利用した「ccpNormalize」以外にも便利な関数がたくさんあると思うのですが、どんな処理になるかをしっかり調べないと使えないので、一度cocos2dで利用されているCGPointExtensionクラスを調べてみようかと思います。

最後になりますが、今回色々教えていただきまして「shi3zさん」ありがとうございました。