アクションRPGの定番であるブーメランをcococs2dを使って表現できるかどうかを考えていました。
考え方
ブーメランを表す専用のクラスを作り、Playerが攻撃のボタンを押した際にブーメランをインスタンス化して動かします。ブーメランを表すクラス
このクラス内で、ブーメランの回転と移動を設定します。
ブーメランの回転
ブーメランの回転には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]
デモ動画
以前から少しづつ考えて作っていたのですが、結構うまくできたと個人的に思っています。 いかがでしょうか?