2016-01-09 121 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

乐意帮忙:) –

相关问题