【问题标题】:Set a physicsbody to a constant velocity将物理体设置为恒定速度
【发布时间】:2023-03-08 02:47:01
【问题描述】:

匀速移动球

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

盒子是这样设置的:

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

球是这样设置的:

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

【问题讨论】:

  • 我用update: 方法解决了这个问题来设置速度,但是对于每个球的每一帧都这样做是非常昂贵的。有更好的解决方案吗?

标签: sprite-kit swift xcode6 skphysicsworld


【解决方案1】:

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

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

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

【讨论】:

  • 在这种情况下,我的update: 方法是最快的解决方案。当我创建一个自己的 updateVelocities: 并将其称为 100 毫秒或任何提供持续移动印象的东西时,可能会有所改进。
  • 这会是什么?我在转换它并让它工作时度过了一段地狱般的时光。
【解决方案2】:

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

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

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

【讨论】:

  • 这些非常有用。我会将它们转换为 Swift。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多