4

以恒定速度移动球

我试图制作一盒球,其中球以恒定速度移动。当它们相互碰撞时,它们不应减速。我想我已经正确设置了所有属性,但它没有用,30 秒后所有的球都停止移动。

盒子是这样设置的:

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

球是这样设置的:

在此处输入图像描述

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

4

2 回答 2

4

如果您希望它们始终具有恒定的速度,完全没有变化,您将不得不在 SKScene 更新中将它们的速度设置为固定长度的向量。物理引擎的设计并非严格遵守能量守恒定律……或者有人可能会争辩说,一些能量会通过加热设备而消散。;)

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

CGPoint velocity = somePhysicsBody.velocity;
velocity = normalized(velocity);
velocity = multiply(velocity, desiredSpeed);
somePhysicsBody.velocity = velocity;
于 2014-06-17T08:25:16.717 回答
2

除了 Steffen (LearnCocos2D) 的回答,伪代码中提到的方法都可以在这个非常好的 Ray Wenderlich教程中找到。

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.

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

于 2014-06-17T09:43:36.147 回答