精灵出现在模拟器中,而不是在设备上

时间:2016-01-09 01:06:15

标签: ios swift sprite-kit skspritenode

当你按下按钮时,这个简单的项目在字段的中心插入一个方形精灵,调用下面的add()函数。在模拟器中,当你添加多个精灵时,它会将其他精灵推开,所以当你按下它时,你会得到很多...... screen shot from simulator, iphone 6, iOS 9.2,这就是我想要的行为。

但是在我的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上获得我想要的行为?

1 个答案:

答案 0 :(得分:4)

我不确定哪一个是理想的行为,但如果你将它们完全叠放在一起,它们就不会滑动。话虽如此,有办法解决这个问题。

请记住,节点使用浮点定位,但当然它们实际上只能由像素定位。

1x像素在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
    }
}

切换偏移是重要的部分。如果你不这样做,你会遇到相同的堆叠问题。我使用的偏移非常接近模拟器的行为,但是你会注意到它有点不同。希望你不关心匹配你在模拟器中得到的完全相同的模式。这个代码非常类似。如果您关心,您会注意到更改偏移将改变模式。