在SpriteKit中将物理体添加到Sprite会略微改变它的位置

时间:2015-12-12 05:44:34

标签: macos sprite-kit position physics

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

我的问题是,只要我添加一个物理主体,精灵似乎会逐渐移动。更具体地说,它的位置变化一小部分(如0.0003)。最初这么小的变化并不重要,但是它会一直在变化,直到精灵实际上在屏幕上移动并弄乱了游戏。

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

我已经尝试过的事情:

  1. 检查以确保关闭重力
  2. 将物理主体的rest属性设置为true
  3. 将物理体的重力属性设置为false
  4. 我在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
    
      }
    
    }
    

1 个答案:

答案 0 :(得分:0)

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

sprite1.physicsBody?.dynamic = false

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