2012-01-27 24 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

一个简单而有效的方法,无需明确使用任何物理引擎,就是在更新循环中以欧拉风格手动步进球体的速度和位置。

在典型的情况下(与向下重力),则必须在y方向上不恒定的速度和恒定的速度在x方向上,因此,下面的代码:

-(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; 
} 

然后,当检测滑动事件,

  1. 捕获的滑动速度(你将不得不计算在当前和最后一帧中的手指触摸的位置的变化)
  2. 乘以缩放因子如果需要的速度。
  3. 将* velocity_x *和* velocity_y *设置为这些初始值。