本日、引き続き、敵及び攻撃パターンを作っていました。その中で、「Player」の位置に応じて、敵が近づいてくる攻撃パターンを考えて、コードを触っていたのですがなかなかうまくいかずに、Twitterにツィートして所、shi3zさんが「こうすればうまくいくよ」と返信をいただいたので早速cocos2dでやってみました。
Twitterでのやりとり
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が動かなければ、同じベクトルで移動します。
もしPlayerが動けば、新しいベクトルで移動量と移動方向を計算して移動します。
こうすれば、敵機が自機にと重なり合うまで移動します。
実際に攻撃パターンに実装する
今回私は、竜巻が自機(プレイヤー)に近づいてくる処理を実装しました。 ただ自機を追いかけるのではなくて、「当たり判定」や「自機の攻撃を受けると消える」などの処理も同時につくっています。
「動画」
自機の位置で移動場所を変える
この行動パターンはupdate内でなくCCActionクラスを使っています。そのため、「ccpNormalize」は使わずに、自機と敵機の差分を計算して移動の場所を変えています。
CCJumpByのy座標の移動位置を、自機と比較して変更することによって、ただ飛ぶのではなく、自機を狙った動きになります。
「動画」
最後に
今回色々調べてみて、数学の知識が全然足りないと感じました。この辺は何か本なりで勉強しないと、ゲーム開発で色々制限がでてきそうだ。
cocos2dには、今回利用した「ccpNormalize」以外にも便利な関数がたくさんあると思うのですが、どんな処理になるかをしっかり調べないと使えないので、一度cocos2dで利用されているCGPointExtensionクラスを調べてみようかと思います。
最後になりますが、今回色々教えていただきまして「shi3zさん」ありがとうございました。