将物理体设置为恒定速度

时间:2014-06-17 08:19:41

标签: sprite-kit swift xcode6 skphysicsworld

以恒定速度移动球

我试着制作一个球,球以恒定的速度移动。当它们相互碰撞时,它们不应该减速。我认为我已经设置了所有属性,但它没有工作,30秒后所有球都停止移动。

这个框设置如下:

    self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
    self.physicsBody.dynamic = false
    self.physicsBody.restitution = 1
    self.physicsBody.friction = 0

球的设置如下:

enter image description here

这是物理引擎的错误还是我错过了什么?

2 个答案:

答案 0 :(得分:4)

如果你希望它们一直保持恒定的速度,根本没有变化,你必须在SKScene更新中将它们的速度设置为固定长度的矢量。物理引擎的设计并不严格遵守能量守恒定律......或者可以说某些能量是通过加热设备来消散的。 ;)

保持相同方向但将矢量长度/速度调整为固定值的一般原则(伪代码):

CGPoint velocity = somePhysicsBody.velocity;
velocity = normalized(velocity);
velocity = multiply(velocity, desiredSpeed);
somePhysicsBody.velocity = velocity;

答案 1 :(得分:1)

除了Steffen的(LearnCocos2D)答案之外,伪代码中提到的方法可以在这个非常好的Ray Wenderlich tutorial中找到。

static inline CGPoint rwAdd(CGPoint a, CGPoint b) {
    return CGPointMake(a.x + b.x, a.y + b.y);
}

static inline CGPoint rwSub(CGPoint a, CGPoint b) {
    return CGPointMake(a.x - b.x, a.y - b.y);
}

static inline CGPoint rwMult(CGPoint a, float b) {
    return CGPointMake(a.x * b, a.y * b);
}

static inline float rwLength(CGPoint a) {
    return sqrtf(a.x * a.x + a.y * a.y);
}

// Makes a vector have a length of 1
static inline CGPoint rwNormalize(CGPoint a) {
    float length = rwLength(a);
    return CGPointMake(a.x / length, a.y / length);
}

他们使用CGPoint作为参数和返回值,但这可以很容易地转换为使用CGVector

这些方法对于物理计算非常有用,您可以在很多方面找到它们。最好将这些方法保存在单独的头文件中,并在整个项目的代码中使用它们。