Math 如何在没有物理引擎的情况下在cocos2d中模拟一个精灵的重力?

Math 如何在没有物理引擎的情况下在cocos2d中模拟一个精灵的重力?,math,cocos2d-iphone,smooth,gravity,Math,Cocos2d Iphone,Smooth,Gravity,我想为一个精灵模拟“重力” 我定义了一个保存重力值的点。我有滴答法 //in my init I defined this: gravity = ccp(0.0f, -1.0f); -(void)tick:(ccTime) dt { if (enableGravity_) { //simulate gravity velocity_.x += gravity_.x; velocity_.y += gravity_.y; self.position = CGPoin

我想为一个精灵模拟“重力”

我定义了一个保存重力值的点。我有滴答法

//in my init I defined this: gravity = ccp(0.0f, -1.0f);
-(void)tick:(ccTime) dt {
if (enableGravity_) {
    //simulate gravity
    velocity_.x += gravity_.x;
    velocity_.y += gravity_.y;
    self.position = CGPointMake(position_.x + velocity_.x, position_.y + velocity_.y);
}    
if (isAcceleratingEnabled_) { //I move my sprite here
    float angle = self.rotation;
    float vx = cos(angle * M_PI / 180) * acceleratingSpeed_;
    float vy = sin(angle * M_PI / 180) * -acceleratingSpeed_;
    CGPoint direction = ccp(vx, vy);

    [self setPosition:ccpAdd(self.position, direction)];
}
}

编辑: 现在的问题是..如果“isAccelerationEnabled”为是,我将移动我的精灵。当我像那样移动雪碧时,它是不平滑的。 如果我向上移动精灵,然后禁用“isAcceleration”,它将不再向上移动,但重力会立即将精灵拉下来。我不知道如何在代码中使用速度:

[self setPosition:ccpAdd(self.position, direction)];

现在,这不是一个真正平滑的解决方案来模拟重力

这会立即将重力应用于精灵

但我想要雪碧平稳下落的效果。就像真实的物体落到地球上一样


顺便说一句:我也对精灵施加了一些向上的力。

问题是你把重力作为速度而不是加速度来施加。你需要给你的精灵一个速度,然后做一些像

sprite.velocity = ccp(self.velocity.x+gravity.x, self.velocity.y+gravity.y);
sprite.position = ccp(sprite.position.x+sprite.velocity.x, sprite.position.y+sprite.velocity.y);

此外,如果你只想做重力向下拉动,它不需要是2D,它可以是一个始终在负Y方向上应用的标量。

问题是,你将重力作为速度而不是加速度应用。你需要给你的精灵一个速度,然后做一些像

sprite.velocity = ccp(self.velocity.x+gravity.x, self.velocity.y+gravity.y);
sprite.position = ccp(sprite.position.x+sprite.velocity.x, sprite.position.y+sprite.velocity.y);

另外,如果你只想做重力向下拉动,它不需要是2D,它可以是一个始终在负Y方向上应用的标量。

既然你引入了速度变量,那么控件
vx
vy
也应该应用于速度而不是位置。这相当于对对象应用恒定的力,这非常现实,但可能不是您想要的控制类型


另一种方法是在
isAccelerationEnabled
分支中将
vx
分配给
velocity\ux
,将
vy
分配给
velocity\uy
。这相当于在主动控制对象时,根据需要施加尽可能大的力。如果看起来太不切实际,您可能希望将速度变化限制在某个最大值。

既然您已经引入了速度变量,那么控制
vx
vy
也应该应用于速度而不是位置。这相当于对对象应用恒定的力,这非常现实,但可能不是您想要的控制类型

另一种方法是在
isAccelerationEnabled
分支中将
vx
分配给
velocity\ux
,将
vy
分配给
velocity\uy
。这相当于在主动控制对象时,根据需要施加尽可能大的力。如果看起来太不现实,您可能希望将速度更改限制为某个最大值