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

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

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

Twitterでのやりとり

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

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

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

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

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

ここでの重要な点は「ccpNormalize」です。
これを調べてみるとCGPointExtensionクラスに内にこのように定義されています。
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.x*v2.x + v1.y*v2.y;
}



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さん」ありがとうございました。

Related Posts Plugin for WordPress, Blogger...