2012-01-27 5 views

答えて

0

私はココスアクションと一緒に、http://en.wikipedia.org/wiki/Projectile_motion、これを行うために発射モーション式を使用しています。ここでは、可能なアプローチがあります。

  • まず

発射式のパラメータを受け取り、発射位置を更新CCActionIntervalサブクラスを実装します。この場合、ProjectileAction。これらは、あなたに必要な重要なメソッドですオーバーライド:

-(void) startWithTarget:(id)target 
{ 
    self.initialPosition = [target position]; 
    self.elapsedTime = 0; 
    [super startWithTarget:target]; 
} 


-(void) update: (ccTime) tt 
{ 
    self.elapsedTime += tt; 
    float t = self.elapsedTime; 
    float theta = CC_DEGREES_TO_RADIANS(self.angle); 
    float v0 = self.velocity; 
    float g = self.gravitationalAcceleration; 
    double x = v0 * cos(theta) * t; 
    double y = v0 * sin(theta) * t - 0.5 * g * t * t ; 
    [self.target setPosition: ccp(self.initialPosition.x + (float)x, self.initialPosition.y + (float)y)]; 

} 
  • セカンド

上記の式では、ボールの初速に変換します速度を、認識するために、あなたのスワイプジェスチャーを使用し、パラメータはtheVelocityです。私はあなたにその部分を残します。

  • サード

アクションを実行します。すなわち

ProjectileLaunch* action = [ProjectileLaunch actionWithDuration:10 
                   angle:45 
                initialVelocity:theVelocity 
                    g:9.8]; 
    [sprite runAction:action]; 

私はこれがあなたを助けてくれることを願っています。

よろしくお願いいたします。

2

物理エンジンを明示的に使用することなく、シンプルで効果的なアプローチでは、ボールのスプライトの速度と位置をオイラースタイルの更新ループに手動で設定する必要があります。そして

-(void) update: (ccTime) dt 
{ 
    // Step only the y-velocity 
    velocity_y += GRAVITY * dt; 
    // Step the position values and update the ball sprite position accordingly 
    ball.position.x += velocity_x * dt; 
    ball.position.y += velocity_y * dt; 
} 

場合:(下向きの重力を有する)は、典型的な場合

、あなたはx方向、y方向及び一定速度での非一定の速度を有するであろうことは、したがって、次のコードスワイプイベントが検出され、必要に応じて、

  1. は、スワイプ速度(あなたが現在と最後のフレームでの指のタッチの位置の変化を計算する必要があります)
  2. 乗にスケーリング係数と速度をキャプチャします。
  3. * velocity_x *と* velocity_y *をこれらの初期値に設定します。
関連する問題