【问题标题】:Adding physics body to Sprite in SpriteKit alters its position fractionally在 SpriteKit 中将物理体添加到 Sprite 会略微改变其位置
【发布时间】:2015-12-12 05:44:34
【问题描述】:

我有一个 Swift / SpriteKit 游戏,其中一大堆精灵具有物理体来检测与玩家的碰撞 - 但否则它们不应该移动。

我的问题是,只要我添加了一个物理实体,精灵就会出现少量移动。更具体地说,它的位置变化很小(如 0.0003)。最初这么小的变化无关紧要,但它会一直这样变化,直到精灵真正在屏幕上移动并弄乱游戏。

为了缩小范围,我创建了一个只有一个精灵的简单项目,我注意到只要我将一个物理体附加到我的精灵,它的位置就会发生微小的变化。

我已经尝试过的事情:

  1. 检查重力是否关闭
  2. 将物理体的 resting 属性设置为 true
  3. 将物理体的受重力影响属性设置为 false

我在 OS X 上使用 Xcode 编码

但没有运气。

这是一个在测试项目中显示的代码片段:

import SpriteKit


class TestScene: SKScene, SKPhysicsContactDelegate {

  let sprite1 = SKSpriteNode(color: SKColor.redColor(), size: CGSizeMake(50, 50))

override func didMoveToView(view: SKView) {

    physicsWorld.gravity = CGVectorMake(0.0, 0.0)
    physicsWorld.contactDelegate = self

    sprite1.position = CGPointMake(200, 200)
    sprite1.physicsBody = SKPhysicsBody(rectangleOfSize: sprite1.size)
    sprite1.physicsBody?.affectedByGravity = false
    sprite1.physicsBody?.resting = true

    self.addChild(sprite1)
    sprite1.position = CGPointMake(200, 200)

  }


  override func update(currentTime: NSTimeInterval) {
    print(sprite1.position)

    // position is not 200,200 as expected
    // it becomes 199.999938964844, 199.999938964844 after a few updates
    // In my real project the position will keep drifting like this until it moves on screen

  }

}

【问题讨论】:

  • 尝试打印物理体的速度,看看它是否在变化
  • 刚刚检查,速度始终为零。

标签: macos sprite-kit position physics


【解决方案1】:

我认为它是默认设置为 yes 的动态属性。将其设置为 false 并且精灵不应再移动

sprite1.physicsBody?.dynamic = false

我刚刚在一个项目中测试了这个,它仍然说 199.9.... 但它似乎没有增加或减少

【讨论】:

  • 谢谢。是的,我试过了,不幸的是不起作用。你是对的,在这个示例项目中它改变了几次然后停在 199.999。在我的实际项目中,它一直在变化——即使我不再接触这个精灵。所以我希望能找到它发生变化的根本原因。
  • 是的,听起来很奇怪。您周围是否有一些物理物体可以推动它或在某处意外移动它?。
  • 不是真的,只是一堆这些精灵本身。我最终在更新功能中每 5 秒将精灵重新定位到原始位置 - 但在我弄清楚发生了什么之前,这似乎是一个不必要的黑客攻击。
  • 是的,听起来很奇怪。发布您的进度
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多