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

Posted

技术标签:

【中文标题】精灵出现在模拟器中,而不是在设备上【英文标题】:Sprites show up in simulator, not on device 【发布时间】:2016-01-09 01:06:15 【问题描述】:

当您按下按钮时,这个简单的项目会在字段的中心插入一个方形精灵,它会调用下面的 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 上获得我想要的行为?

【问题讨论】:

你需要使用圆形物理体吗?这适用于SKPhysicsBody(rectangleOfSize: sprite.size) 哇,你说的没错;但不幸的是,是的,我想要一个圆形物理体,因为每个精灵的图形都是圆形的,它就像一个不断增长的圆形细胞群。事实上,最初我使用圆形 SKShapeNodes 得到相同的结果;我切换到 SKSpriteNodes 只是为了看看它是否能解决问题。 【参考方案1】:

我不确定哪一个是期望的行为,但是如果您将它们从字面上堆叠在一起,它们不会滑动是有道理的。话虽如此,有办法解决这个问题。

请记住,节点使用浮点定位,但当然它们实际上只能以像素可见的方式定位。

1 像素在 2x 屏幕上为 0.5 点,在 3x 屏幕上为 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
    

切换偏移量是重要的部分。如果您不这样做,您将遇到相同的问题,即完全堆叠在一起。我使用的偏移量非常接近模拟器的行为,但是轻按几下你会发现它有点不同。希望您不关心匹配您在模拟器中获得的完全相同的模式。它与此代码非常相似。如果你在乎的话,你会注意到改变偏移量会改变模式。

【讨论】:

是的,这很漂亮!我非常感谢您和本网站上所有抽出时间提供帮助的人。

以上是关于精灵出现在模拟器中,而不是在设备上的主要内容,如果未能解决你的问题,请参考以下文章

保存数据 - 在模拟器上工作,而不是在设备上工作

UITextView:链接检测在模拟器中工作,而不是在设备上

facebook在模拟器上工作而不是在设备上

React Native 0.44 PushNotifcationIOS.scheduleLocalNotification 在模拟器中处理 JavaScript Date 对象,而不是在设备上

在模拟器上工作,而不是在设备或其他模拟器上工作。设定的目标是正确的[关闭]

iPad应用程序仅在设备上而不是在模拟器中加载笔尖时崩溃