2017-06-19 60 views
1

我有一些非常簡單的Swift代碼,它將SKSpriteNode放置在屏幕上位置x:214,y:200處。在更新方法中,我打印出SKSpriteNode的當前位置。如果我省略了所有SKPhysicsBody代碼,那麼我的SKSpriteNode的位置在調試窗口中顯示爲(214.0,200.0),正如我所期望的那樣。但是,如果我使用SKPhysicsBody代碼運行程序,則第一次打印返回正確(214.0,200.0),但後續調用返回(214.000015258789,200.0)。SKSpriteNode在指定SKPhysicsBody時顯示非整數位置

在我看來,像物理世界中的某些東西正在影響(儘管以非常小的方式)SKSpriteNode的位置。我無法理解我的生活是什麼,可能是。我的代碼完全如下所示,僅此而已。我想我已經禁用了可能對這個職位有任何影響的一切。我只是希望我可能錯過了一些愚蠢的東西。

這個問題可能看起來微不足道,因爲這些值只是微小的關閉,但是當我嘗試在屏幕上平滑地移動精靈(在每次更新時增加它的x位置+1),它偶爾會錯過整個位置,從289.0到289.99,然後是291.0。

任何幫助將不勝感激。這對我來說就像是一個bug,但是因爲我對SpriteKit的物理方面相當陌生,所以我想確定一下。

import SpriteKit 

class GameScene: SKScene { 

private var playerSprite : SKSpriteNode! 

override func didMoveToView(view: SKView) { 
    self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)//borderBody 
    self.physicsWorld.gravity = CGVector(dx: 0, dy: 0) 

    playerSprite = SKSpriteNode(color: UIColor.yellowColor(), size: CGSize(width: 100, height: 100)) 
    playerSprite.position = CGPoint(x: 214, y: 200) 

    playerSprite.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 100, height: 100)) 

    if let playerSpritePhysicsObject = playerSprite.physicsBody { 
     playerSpritePhysicsObject.usesPreciseCollisionDetection = true 
     playerSpritePhysicsObject.affectedByGravity = false 
     playerSpritePhysicsObject.allowsRotation = false 
     playerSpritePhysicsObject.dynamic = false 
     playerSpritePhysicsObject.angularVelocity = 0.0 
     playerSpritePhysicsObject.friction = 0.0 
     playerSpritePhysicsObject.linearDamping = 0.0 
     playerSpritePhysicsObject.angularDamping = 0.0 
     playerSpritePhysicsObject.velocity = CGVectorMake(0, 0) 
     playerSpritePhysicsObject.restitution = 0.0 
    } 
    self.addChild(playerSprite) 
} 

override func update(currentTime: NSTimeInterval) { 
    print("playerSprite Position = \(playerSprite.position)") 
} 
} 

下面是調試窗口輸出:

playerSprite Position = (214.0, 200.0) 
2017-06-19 20:39:47.682 PhysicsTest[9193:2340365] <SKMetalLayer: 0x14fe6e760>: calling -display has no effect. 
playerSprite Position = (214.000015258789, 200.0) 
playerSprite Position = (214.000030517578, 200.0) 
playerSprite Position = (214.000030517578, 200.0) 
playerSprite Position = (214.000030517578, 200.0) 
playerSprite Position = (214.000030517578, 200.0) 
+0

後搜索的日子裏,我終於發現有人有類似的問題。不幸的是,他們似乎也沒有找到解決辦法。 https://stackoverflow.com/questions/34236737/adding-physics-body-to-sprite-in-spritekit-alters-its-position-fractionally – PikXells

+0

我也發現這個https://forums.developer.apple.com/thread/27057雖然與我的問題不完全一樣,因爲我的SKSpriteNode不在SKNode對象內。似乎表明這可能是2年前的一個持續性錯誤。 – PikXells

+0

我已經爲我的代碼添加了一項解決方案,確實看起來可以解決問題。這很討厭但很有效。由於我們可以假定問題出在物理引擎和它的SKSpriteNode的位置,你可以通過在didFinishUpdate()函數中再次設置它的位置來強制它到達正確的位置。 – PikXells

回答

0

一段時間苦苦思索這個問題後,我想我可能已經發現身邊工作。這是討厭的,但伎倆。只需在didSimulatePhysics()函數完成後發生的didFinishUpdate()函數中重置SKSpriteNode的位置即可。

override func didFinishUpdate() { 
    playerSprite.position.x = 214 
} 

經過進一步測試,我發現這不適用於iOS 7.1。爲了在老型號設備上工作,你必須把在didSimulatePhysics代碼()函數來代替:

override func didSimulatePhysics() { 
    playerSprite.position.x = 214 
}