【问题标题】:How to simulate a gravity for one sprite in cocos2d without a physics engine?如何在没有物理引擎的情况下模拟 cocos2d 中一个精灵的重力?
【发布时间】:2011-08-23 14:30:52
【问题描述】:

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

我定义了一个 CGPoint 来保存重力值。而且我有tick方法。

//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)];

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

这会将重力立即应用到精灵。

但我想要精灵平稳下落的效果。就像真实的物体掉到地上一样。

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

【问题讨论】:

    标签: math cocos2d-iphone smooth gravity


    【解决方案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 方向的标量。

    【讨论】:

      【解决方案2】:

      既然您已经引入了速度变量,那么控件vxvy 也应该应用于速度而不是位置。这对应于对对象施加恒定的力,这很现实,但可能不是您想要的那种控制。

      另一种方法是在isAccelerationEnabled_ 分支中简单地将vx 分配给velocity_.x 并将vy 分配给velocity_.y。这对应于每当您主动控制对象时施加尽可能大的力。如果看起来太不切实际,您可能希望将速度变化限制在某个最大值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 2017-04-30
        • 1970-01-01
        • 2011-11-11
        • 2021-09-07
        • 1970-01-01
        • 2019-09-18
        相关资源
        最近更新 更多