精灵出现在模拟器中,而不是设备上
Sprites show up in simulator, not on device
这个简单的项目会在您按下按钮时在场地中央插入一个方形精灵,这会调用下面的 add() 函数。在模拟器中,当你添加多个精灵时,它会将其他精灵推开,所以当你多次按下它时,你会得到......
screen shot from simulator, iphone 6, iOS 9.2,这就是我想要的行为。
但是在我的 iphone 上使用相同的代码 运行,在添加相同数量的 sprite 后会产生这个... 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 像素在 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
}
}
切换偏移量是重要的部分。如果您不这样做,您将遇到完全堆叠在彼此之上的相同问题。我使用的偏移量非常接近模拟器的行为,但轻点几下你会发现它有点不同。希望您不关心匹配您在模拟器中获得的完全相同的模式。它与这段代码非常相似。如果您注意的话,您会注意到更改偏移量会改变模式。
这个简单的项目会在您按下按钮时在场地中央插入一个方形精灵,这会调用下面的 add() 函数。在模拟器中,当你添加多个精灵时,它会将其他精灵推开,所以当你多次按下它时,你会得到...... screen shot from simulator, iphone 6, iOS 9.2,这就是我想要的行为。
但是在我的 iphone 上使用相同的代码 运行,在添加相同数量的 sprite 后会产生这个... 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 像素在 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
}
}
切换偏移量是重要的部分。如果您不这样做,您将遇到完全堆叠在彼此之上的相同问题。我使用的偏移量非常接近模拟器的行为,但轻点几下你会发现它有点不同。希望您不关心匹配您在模拟器中获得的完全相同的模式。它与这段代码非常相似。如果您注意的话,您会注意到更改偏移量会改变模式。