ゲーム開発日誌part14 ブーメランの実装

アクションRPGの定番であるブーメランをcococs2dを使って表現できるかどうかを考えていました。

考え方

ブーメランを表す専用のクラスを作り、Playerが攻撃のボタンを押した際にブーメランをインスタンス化して動かします。

スクリーンショット 2012 05 18 21 17 34

ブーメランを表すクラス

このクラス内で、ブーメランの回転と移動を設定します。

ブーメランの回転

ブーメランの回転にはCCActionのCCRepeatForeeverを使います。 私は初期化の段階で設定をしています。こんな感じです。 [c] - (id)init { self = [super init]; if (self) {

    sprite = [CCZSprite spriteWithFile:@"bumeran.png"];
    [self addChild:sprite];

    //回転させる
    [sprite runAction:[CCRepeatForever actionWithAction:[CCRotateBy actionWithDuration:0.4f angle:360]]];


}
return self;

} [/c]

移動

移動に関してはどうするか非常に苦労をしました。 私の考えるブーメランとはこんな感じです。

基本的なブーメランの移動について 一定の距離まで行って帰ってくる動きは、時間によって管理することにしました。 コードで表すとこんな感じです。 [c] -(void)update:(ccTime)delta{ time = time + delta;

if (time < 0.75f) {

     //行きの動き>

    }else{

           //帰りの動き

    }

[/c] update内で一庭の時間が過ぎれば、移動の量や方向を変化させます。 壁やオブジェクトに当たったときには、timeを調整しすぐにPlayer方向に帰ってくるようにします。

自機(Player)クラスでのブーメラン処理

これに関しては共にCCActionクラスを組み合わせてタイミングなどを調節します。 特にどの方向にブーメランを生成するかが肝になるのですが、私は自機の方向かたブーメランの移動方向を決めています。 こんな感じです。 [c] -(CGPoint)attackPosition{

CGPoint vecter;
//currentDirectionがキャラクターの方向
if (currentDirection == 0) vecter = ccp(0,-32);
if (currentDirection == 1) vecter = ccp(-32,0);
if (currentDirection == 2) vecter = ccp(-32,0);
if (currentDirection == 3) vecter = ccp(-32,0);
if (currentDirection == 4) vecter = ccp(0,32);
if (currentDirection == 5) vecter = ccp(32,0);
if (currentDirection == 6) vecter = ccp(32,0);
if (currentDirection == 7) vecter = ccp(32,0);

return vector;

} [/c]

デモ動画

以前から少しづつ考えて作っていたのですが、結構うまくできたと個人的に思っています。 いかがでしょうか?