我试着制作一个球,球以恒定的速度移动。当它们相互碰撞时,它们不应该减速。我认为我已经设置了所有属性,但它没有工作,30秒后所有球都停止移动。
这个框设置如下:
self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
self.physicsBody.dynamic = false
self.physicsBody.restitution = 1
self.physicsBody.friction = 0
球的设置如下:
这是物理引擎的错误还是我错过了什么?
答案 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
。
这些方法对于物理计算非常有用,您可以在很多方面找到它们。最好将这些方法保存在单独的头文件中,并在整个项目的代码中使用它们。