2016-01-09 40 views
3

當您按下下面調用add()函數的按鈕時,這個簡單的項目將在該字段的中心插入一個方形Sprite。在模擬器中,當你添加多個精靈時,它會將其他人推開,所以當你按下它一堆時,你會得到... screen shot from simulator, iphone 6, iOS 9.2,這是我想要的行爲。Sprite在模擬器中顯示,不在設備上

但在我的iPhone上運行相同的代碼,之後加入相同數量的精靈得到這個... screen show from physical iphone 6, iOS 9.2

下面是從GameScene.swift代碼:

import SpriteKit 

class GameScene: SKScene { 

override init(size: CGSize) { 
    super.init(size:size) 
    self.physicsWorld.gravity = CGVectorMake(0, -1.0) 
    let worldBorder = SKPhysicsBody(edgeLoopFromRect: self.frame) 
    self.physicsBody = worldBorder 
    self.physicsBody?.friction = 0.5 
} 

func add() 
{ 

    let sprite = SKSpriteNode(color: UIColor.blueColor(), size: CGSize(width: 10, height: 10)) 
    sprite.position = CGPointMake(self.frame.size.width/2, self.frame.size.height/2)   
     sprite.physicsBody = SKPhysicsBody(circleOfRadius: 8) 
     sprite.physicsBody?.friction = 0.0 
     sprite.physicsBody?.affectedByGravity = false 
     sprite.physicsBody?.restitution = 0.5 
     sprite.physicsBody?.linearDamping = 0.5 
    addChild(sprite) 

} 

required init?(coder aDecoder: NSCoder) 
    { 
    super.init(coder: aDecoder) 
    } 
} 

我要去哪裏錯誤?如何在真正的iPhone上獲得我想要的行爲?

+0

你需要使用圓形物理實體嗎?這適用於'SKPhysicsBody(rectangleOfSize:sprite.size)'。 –

+0

哇你是對的,但不幸的是我想要一個圓形物理體,因爲每個精靈的圖形都是圓形的,它就像一個正在成長的圓形細胞羣。事實上,最初我使用的圓形SKShapeNodes具有相同的結果;我切換到SKSpriteNodes只是爲了看看它是否能解決問題。 – Christopher

回答

4

我不確定哪一個是所需的行爲,但它確實有意義,如果您將它們直接堆疊在一起,它們就不會滑動。這就是說,有一種方法可以解決這個問題。

請記住,節點使用浮點定位,但它們當然只能實際上被像素定位。

1像素在2x屏幕上是0.5點,在3x屏幕上是0.33點。考慮到這一點,您可以使用< 0.33的偏移量來獲得物理體的偏移量,而不會讓用戶看到它。這裏有一個小例子:

class GameScene: SKScene { 
    var xOffset: CGFloat = 0.05 
    var yOffset: CGFloat = 0.3 

    required init?(coder aDecoder: NSCoder) 
    { 
     super.init(coder: aDecoder) 
    } 

    override init(size: CGSize) { 
     super.init(size:size) 
     self.physicsWorld.gravity = CGVectorMake(0, -1.0) 
     let worldBorder = SKPhysicsBody(edgeLoopFromRect: self.frame) 
     self.physicsBody = worldBorder 
     self.physicsBody?.friction = 0.5 
    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     add() 
     updateOffsets() 
    } 

    func add() 
    { 
     let sprite = SKSpriteNode(color: UIColor.blueColor(), size: CGSize(width: 10, height: 10)) 
     sprite.position = CGPointMake((self.frame.size.width/2) + xOffset, (self.frame.size.height/2) + yOffset) 
     sprite.physicsBody = SKPhysicsBody(circleOfRadius: 8) 
     sprite.physicsBody?.friction = 0.0 
     sprite.physicsBody?.affectedByGravity = false 
     sprite.physicsBody?.restitution = 0.5 
     sprite.physicsBody?.linearDamping = 0.5 
     addChild(sprite) 
    } 

    private func updateOffsets() { 
     xOffset = -xOffset 
     yOffset = -yOffset 
    } 
} 

切換偏移是重要的部分。如果你不這樣做,你會有相同的堆疊問題。我使用的偏移量與模擬器的行爲非常接近,但是您點擊幾次就會發現它有點不同。希望你不關心在模擬器中匹配完全相同的模式。這與這段代碼非常相似。如果你很在意,你會注意到改變偏移量會改變模式。

+2

是的,這是美麗的!我非常感謝你和本網站上所有給予他們時間幫助的人。 – Christopher

+0

樂意幫忙:) –

相關問題