我想为一个精灵模拟“重力”。
我定义了一个保存重力值的CGPoint。我有勾选方法。
//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”为YES,我正在移动我的精灵。当我像这样移动精灵时,它并不顺畅。 如果我向上移动我的精灵而不是禁用“isAcceleration”它将不再向上移动,但重力将立即拉下我的精灵。我不知道如何使用此代码使用速度:
[self setPosition:ccpAdd(self.position, direction)];
现在这不是模拟重力的真正平滑的解决方案。
这会立即将重力施加到精灵上。
但我想要精灵顺利落下的效果。就像真实物体落地一样。
顺便说一句:我也对精灵施加了一些向上的力量。
答案 0 :(得分:1)
问题在于你将重力作为速度而不是加速度。你需要给你的精灵一个速度,然后做一些像......
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方向的标量。
答案 1 :(得分:0)
现在您已经引入了速度变量,控件vx
和vy
也应该应用于速度而不是位置。这对应于对物体施加恒定力,这是非常逼真的,但可能不是你想要的那种控制。
另一种方法是在vx
分支中简单地将velocity_.x
分配给vy
和velocity_.y
到isAccelerationEnabled_
。这相当于在您主动控制对象时根据需要施加尽可能大的力。如果看起来太不现实,您可能希望将速度变化限制在某个最大值。