【问题标题】:App crashes on iPhone 4s but no other device: possible issue with SKPhysicsContactDelegate?应用程序在 iPhone 4s 上崩溃,但在其他设备上没有:SKPhysicsContactDelegate 可能存在问题?
【发布时间】:2015-01-27 18:11:46
【问题描述】:

我在以下设备上运行我的 spritekit 游戏:iPhone 5s、iPhone 4s、iPad air 和 iPad mini。该应用程序运行和除 4s 之外的所有设备。在 4s 上,当应用转换到包含 SKPhysicsContactDelegate 的场景时,应用会崩溃,例如:

class PlayScene: SKScene, SKPhysicsContactDelegate, ADBannerViewDelegate {


 enum ColliderType: UInt32 {

    case  narrowCategory = 1
    case  bigCategory = 2
    case  smallCategory = 4
    case  roundCategory = 8

}

var narrow = SKSpriteNode(imageNamed: "Narrow")
var big = SKSpriteNode(imageNamed: "Big")

override func didMoveToView(view: SKView) {
   ........ }

应用崩溃时出现的错误信息是:thread 1 exc_breakpoint (code=exc_arm_breakpoint, subcode = 0xe7ffdefe)

最初,错误在我添加背景音乐的这一行停止了应用程序(这对我来说没有任何意义,因为该行也在没有 SKPhysicsContactDelegate 的其他场景之一中,但它运行顺利):

   var backgroundMusicURL: NSURL = NSBundle.mainBundle().URLForResource("LevelOne", withExtension: "wav")!

当我注释掉背景音乐时,应用程序在这一行崩溃了

   NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("addPlay"), name: "AddPlay", object: nil)

我再次注释掉后,错误跳转到这一行

    narrow.physicsBody?.mass = 0.0001

然后这个

     narrow.physicsBody?.allowsRotation = true

当我注释掉它之前崩溃的任何行时,错误一直在移动。一旦我删除背景音乐和我调用到我的 didMoveToView(view: SKView) 中添加或修改新的或现有的 spritenodes 的所有函数,应用程序就会停止崩溃,下面是这些函数之一的示例:

func addDiamond() {



    var diamond = SKSpriteNode(texture: diamondTexture)




    diamond.name = "diamond"
    diamond.physicsBody = SKPhysicsBody(circleOfRadius: diamond.size.width/2)
    diamond.zPosition = 1
    diamond.physicsBody?.mass = 0.01
    diamond.physicsBody?.allowsRotation = true
    diamond.physicsBody?.dynamic = true
    diamond.physicsBody?.affectedByGravity = false

    diamond.setScale(0.75)

    diamond.physicsBody?.categoryBitMask = diamondCategory
    diamond.physicsBody?.contactTestBitMask = laserCategory
    diamond.physicsBody?.collisionBitMask = laserCategory






    // setting the position 

    let minX = diamond.size.width/2
    let maxX = self.frame.size.width - diamond.size.width/2
    let rangeX = maxX - minX
    let positionX: CGFloat = round(CGFloat(arc4random()) % CGFloat(rangeX) + CGFloat(minX))

    let minY = self.frame.size.height/5
    let maxY = self.frame.size.height * 0.4
    let rangeY = maxY - minY
    let positionY: CGFloat = round(CGFloat(arc4random()) % CGFloat(rangeY) + CGFloat(minY))

    diamond.position = CGPointMake(positionX, positionY)

    // setting the rotation 

    let minR = 0
    let maxR = 6
    let rangeR = maxR - minR
    let positionR: CGFloat = round(CGFloat(arc4random()) % CGFloat(rangeR) + CGFloat(minR))
    diamond.zRotation = positionR
    // set animation

    let hold = SKAction.waitForDuration(4)
    let remove = SKAction.removeFromParent()

    diamond.runAction(SKAction.sequence([hold,remove]))



    // animation of bubble

    let minDur = 6
    let maxDur = 8
    let rangeDur = maxDur - minDur
    let durationOne = Int(arc4random()) % Int(rangeDur) + Int(minDur)
    let durOne = NSTimeInterval((Double(durationOne)/25))


    var animateArray:NSMutableArray = NSMutableArray()
    for i in 1...1500 {

        animateArray.addObject(SKAction.rotateByAngle(0.2, duration: 0.01))
      //animateArray.addObject(SKAction.rotateByAngle(-0.2, duration: 0.5))


    }


    diamond.runAction(SKAction.sequence(animateArray))
    animateArray.addObject(SKAction.removeFromParent())

     addChild(diamond)

}

这是在 viewdidload 中使用下面的行添加的

    diamondTimer = NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: Selector("addDiamond"), userInfo: nil, repeats: true) 

不使用 SKPhysicsContactDelegate 的场景在 4s 上运行良好。我还在模拟器上测试了 4s,当您使用 SKPhysicsContactDelegate 进入场景时,它似乎崩溃了,但与设备不同的是,不会出现错误,设备只是黑屏并崩溃,而 xcode 上没有任何调试会话......有人有吗关于这里发生了什么的最微弱的想法?

【问题讨论】:

  • 检查narrow.physicsBody 不为零。除此之外,尝试通过注释掉更多代码来缩小范围。如果错误似乎不断移动到不同的地方,您可能已经偶然发现了 Swift 的崩溃错误之一。
  • 是的,在我注释掉之前崩溃的行(或在某些情况下涉及该行的整个部分)之后,错误似乎只是继续移动到不同的地方......所以如果这是swift 的崩溃错误之一,你知道我能做些什么吗?
  • 如果它是其中一个错误,您唯一能做的就是报告它,并尝试每个新的(甚至是 beta)xcode 版本。就我个人而言,我不希望 Swift 在 Xcode 6.3 之前处于生产就绪状态(主要是因为调试 swift 代码会导致 xcode 持续崩溃,尤其是在使用非 Apple 框架时)。

标签: iphone crash sprite-kit skphysicscontact


【解决方案1】:

问题是我使用这条线将节点放置在随机位置。

 let durationOne = Int(arc4random()) % Int(rangeDur) + Int(minDur)

我想这行的问题在于它在 32 位设备(如 4s)中无法处理随机数的大小并导致崩溃。当我将该行替换为:

 let durationOne = UInt32(arc4random()) % UInt32(rangeDur) + UInt32(minDur)

问题停止,设备运行平稳。虽然我不知道为什么错误消息没有针对这一行并且一直移动到不相关的行......无论如何我希望这可以帮助任何有类似问题的人!

【讨论】:

  • 谢谢!在看似完全不相关的行上出现错误,但这解决了它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 2015-11-25
相关资源
最近更新 更多