当你按下按钮时,这个简单的项目在字段的中心插入一个方形精灵,调用下面的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上获得我想要的行为?
答案 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
}
}
切换偏移是重要的部分。如果你不这样做,你会遇到相同的堆叠问题。我使用的偏移非常接近模拟器的行为,但是你会注意到它有点不同。希望你不关心匹配你在模拟器中得到的完全相同的模式。这个代码非常类似。如果您关心,您会注意到更改偏移将改变模式。