2016-07-07 80 views
1

我遇到了SKSpriteNode的問題。在我將它放置在某個位置的場景中後,它的位置開始變得非常緩慢。這隻發生在我將SKPhysicsBody附加到它上面時,但不是沒有它,所以它與此有關。SKSpriteNode的位置在放置後發生變化

這裏是放在我的瓷磚代碼:

import Foundation 
import SpriteKit 

class Tile : SKNode { 

    var sprite = SKSpriteNode(imageNamed: "grassMid") 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented"); 
    } 


    override init() { 
     super.init(); 
     self.sprite.physicsBody = SKPhysicsBody(texture: self.sprite.texture!, size: CGSize(width: 32.0, height: 32.0)) 
     self.sprite.physicsBody?.dynamic = false 
     self.sprite.physicsBody?.collisionBitMask = 0x0 
     self.addChild(sprite) 
    } 
} 

這裏是放置對象的代碼:

func addNewTile(position: CGPoint) { 
     let t = Tile() 
     t.sprite.position = getClosestPointInGrid(position) 
     t.sprite.size = CGSize(width: 32.0, height: 32.0) 
     if(!doesPositionContainTile(t.sprite.position)) { 
      self.addChild(t) 
     } 
     print(t.sprite.position) 
} 

例如:我把瓷磚的位置(256, 32),並且很快該位置變爲(255.990264892578,31.9987831115723),並且它變化緩慢?我不明白。爲什麼會發生這種行爲?

回答

0

好的。

我已經做了一些關於這個問題的研究,並得出了一個結論,如果一個SKSpriteNode是一個SKNode的父級,並且你將SKSpriteNode的SKPhysicsObject的動態屬性設置爲false,那麼該對象仍然會緩慢地向下漂移。它不應該動態設置爲false的動態屬性。如果SKSpriteNode的父級是SKScene,則不會發生此錯誤。

2015年11月27日蘋果開發者論壇thread報告了這個錯誤。據說它在12月20日仍然存在。我現在可以說它仍然存在於2016年7月10日。我有Xcode 7.0和OS X 10.11.5,我只熟悉Spritekit的OS X版本,我不知道這個bug是否也在iOS上。

本來我的地圖系統是這樣設計的,地圖是SKNode,而圖塊是SKSpriteNodes。由於這個錯誤,我改變了它,以便SKSpriteNodes(瓷磚)直接添加到SKScene。現在這個錯誤不會發生。

0

這種行爲發生是因爲你已經爲你的精靈增加了物理環境,所以這個參與者尊重你的physicsWorldphysicsBody已經設置的所有參數(重力,恢復,線性衰減,摩擦..)。

事實上,使用SKAction s是不正確的,因爲你可能有像你這樣的奇怪值。最好將addImpulsevelocity用於你的精靈。

希望它能幫助你理解你的項目發生了什麼。

+0

有什麼辦法可以完全阻止運動但保持碰撞?就像我不想從這個位置移動。 –

+0

在爆炸之後,您可以將速度設置爲0,physicBody.speed –

+0

問題是,即使我已將self.sprite.physicsbody.dynamic設置爲false,但在放置對象時仍會向下移動一些對象。動態錯誤時甚至不應受重力的影響。 –

相關問題