2015-07-18 4 views
-3

Фон на игре: В основном вы управляете персонажем, который движется вправо и влево и пытается уклониться от падающих блоков. Появляются три игрока. Один посередине экрана и два точно размера. От среднего игрока с обеих сторон.Swift Физическая фатальная ошибка: неожиданно обнаружена нуль при развертывании Необязательное значение при столкновении двух символов

Эта ошибка возникает только раз в 10 столкновений с playerRight или playerLeft или Player и падающими блоками. Как вы можете видеть на скриншоте ниже, игрок, похоже, не прикасается к падающему блоку, когда он падает.

Код ошибки и скриншоты:

fatal error: unexpectedly found nil while unwrapping an Optional value 
(lldb) 

enter image description here

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_l386_INVOP, subcode=0x0) 

enter image description here

Как игра сцена остановилась

enter image description here

Я думаю, что это имеет какое-то отношение к тому, как я построил «бесконечно» горизонтальный прокручивающий плеер. В основном у меня есть три отдельных символа, и как только средний символ проходит мимо size.width или ниже 0, его позиция на экране изменяется на противоположную сторону экрана, по существу делая его бесконечным. Возможно, игрок телепортирован внутри блока, и он дает нулевую ошибку. Не совсем уверен, но похоже, что это как-то связано с этим. Во всяком случае, имеет соответствующий код от GameScene.

import SpriteKit 
import Foundation 
import UIKit 

//Collisions 
struct PhysicsCategory { 
static let Enemy : UInt32 = 1 
static let Player : UInt32 = 2 
static let PlayerRight : UInt32 = 3 
static let PlayerLeft : UInt32 = 4 
static let EnemyRight : UInt32 = 5 

} 

var transition:SKTransition = SKTransition.fadeWithDuration(0.5) 



class GameScene: SKScene, SKPhysicsContactDelegate { 


//Highscore Variable 
var Highscore = Int() 

//Score 
var Score : Int = 0 
var ScoreLabel = UILabel() 


//Main Character 
var Player = SKSpriteNode(imageNamed: "mainPlayer.png") 

//Right-far character 
var PlayerRight = SKSpriteNode(imageNamed: "mainPlayer.png") 

//Left-far character 
var PlayerLeft = SKSpriteNode(imageNamed: "mainPlayer.png") 


//Holding vs Tapping Movement of Player 
var isTouching = false 

var touchXPosition:CGFloat = 0 


override func didMoveToView(view: SKView) { 
    /* Setup your scene here */ 

    //Highscore 
    var HighscoreDefault = NSUserDefaults.standardUserDefaults() 

    if (HighscoreDefault.valueForKey("Highscore") != nil) { 
     Highscore = HighscoreDefault.valueForKey("Highscore") as! NSInteger 
    } 
    else { 
     Highscore = 0 
    } 




    //Collisions/Physics 
    physicsWorld.contactDelegate = self 

    //Background Color 
    scene?.backgroundColor = UIColor.blackColor() 

    //Spawn timer for enemy blocks 
    var timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: Selector("spawnEnemies"), userInfo: nil, repeats: true) 

    //Timer for keeping score 
    var scoretimer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("scoreCounter"), userInfo: nil, repeats: true) 

    //Player coordinates 
    Player.position.x = size.width * 0.5 
    Player.position.y = size.width * 0.11/2 


    //Setting Player Sizes 
    Player.size.width = size.width * 0.11 
    Player.size.height = size.width * 0.11 
    PlayerRight.size.width = size.width * 0.11 
    PlayerRight.size.height = size.width * 0.11 
    PlayerLeft.size.width = size.width * 0.11 
    PlayerLeft.size.height = size.width * 0.11 


    //Initial position of player 
    Player.position = CGPoint(x: Player.position.x, y: Player.position.y) 
    //Initial position of far-right player 
    PlayerRight.position = CGPoint(x: Player.position.x + size.width, y: Player.position.y) 
    //Initial position of far-left player 
    PlayerLeft.position = CGPoint(x: Player.position.x - size.width, y: Player.position.y) 


    //Adding Physics/Collisions to Player 
    Player.physicsBody = SKPhysicsBody (rectangleOfSize: Player.size) 
    Player.physicsBody?.affectedByGravity = false 
    Player.physicsBody?.categoryBitMask = PhysicsCategory.Player 
    Player.physicsBody?.contactTestBitMask = PhysicsCategory.Enemy 
    Player.physicsBody?.dynamic = false 

    //Adding Physics/Collisions to PlayerRight 
    PlayerRight.physicsBody = SKPhysicsBody (rectangleOfSize: PlayerRight.size) 
    PlayerRight.physicsBody?.affectedByGravity = false 
    PlayerRight.physicsBody?.categoryBitMask = PhysicsCategory.PlayerRight 
    PlayerRight.physicsBody?.contactTestBitMask = PhysicsCategory.Enemy 
    PlayerRight.physicsBody?.dynamic = false 

    //Adding Physics/Collisions to PlayerLeft 
    PlayerLeft.physicsBody = SKPhysicsBody (rectangleOfSize: PlayerRight.size) 
    PlayerLeft.physicsBody?.affectedByGravity = false 
    PlayerLeft.physicsBody?.categoryBitMask = PhysicsCategory.PlayerLeft 
    PlayerLeft.physicsBody?.contactTestBitMask = PhysicsCategory.Enemy 
    PlayerLeft.physicsBody?.dynamic = false 

    //Making Players visible 
    self.addChild(Player) 
    self.addChild(PlayerRight) 
    self.addChild(PlayerLeft) 

    //Making Score Visible 
    ScoreLabel.text = "\(Score)" 
    ScoreLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 20)) 
    ScoreLabel.font = UIFont(name: ScoreLabel.font.fontName, size:20) 
    ScoreLabel.textColor = UIColor.whiteColor() 
    self.view?.addSubview(ScoreLabel) 
} 

func scoreCounter() { 
    //Setting score 
    Score += 1 
    ScoreLabel.text = "\(Score)" 
} 


func didBeginContact(contact: SKPhysicsContact) { 
    var firstBody : SKPhysicsBody = contact.bodyA 
    var secondBody : SKPhysicsBody = contact.bodyB 

    //Checking for Player to enemy collisions 
    if ((firstBody.categoryBitMask == PhysicsCategory.Enemy) && (secondBody.categoryBitMask == PhysicsCategory.Player)){ 
     CollisionWithEnemy(firstBody.node as! SKShapeNode, Player: secondBody.node as! SKSpriteNode) 

    } 
    else if (firstBody.categoryBitMask == PhysicsCategory.Player) && (secondBody.categoryBitMask == PhysicsCategory.Enemy) { 
     CollisionWithEnemy2(firstBody.node as! SKSpriteNode, Enemy: secondBody.node as! SKShapeNode) 
    } 
    //Checking for PlayerRight to enemy collisions 
    if ((firstBody.categoryBitMask == PhysicsCategory.Enemy) && (secondBody.categoryBitMask == PhysicsCategory.PlayerRight)){ 
     CollisionWithEnemy(firstBody.node as! SKShapeNode, Player: secondBody.node as! SKSpriteNode) 

    } 
    else if (firstBody.categoryBitMask == PhysicsCategory.PlayerRight) && (secondBody.categoryBitMask == PhysicsCategory.Enemy) { 
     CollisionWithEnemy2(firstBody.node as! SKSpriteNode, Enemy: secondBody.node as! SKShapeNode) 
    } 
    //Checking for PlayerLeft to enemy collisions 
    if ((firstBody.categoryBitMask == PhysicsCategory.Enemy) && (secondBody.categoryBitMask == PhysicsCategory.PlayerLeft)){ 
     CollisionWithEnemy(firstBody.node as! SKShapeNode, Player: secondBody.node as! SKSpriteNode) 

    } 
    else if (firstBody.categoryBitMask == PhysicsCategory.PlayerLeft) && (secondBody.categoryBitMask == PhysicsCategory.Enemy) { 
     CollisionWithEnemy2(firstBody.node as! SKSpriteNode, Enemy: secondBody.node as! SKShapeNode) 
    } 

} 

func CollisionWithEnemy(Enemy: SKShapeNode, Player: SKSpriteNode) { 

    //Highscore 
    var ScoreDefault = NSUserDefaults.standardUserDefaults() 
    ScoreDefault.setValue(Score, forKey: "Score") 
    ScoreDefault.synchronize() 


    if (Score > Highscore) { 
     var HighscoreDefault = NSUserDefaults.standardUserDefaults() 
     HighscoreDefault.setValue(Score, forKey: "Highscore") 
    } 

    //var gameOver:SKScene = GameOverScene(size: self.size) 
    //ScoreLabel.removeFromSuperview() 
    Enemy.removeFromParent() 
    //Player.removeFromParent() 
    //self.view?.presentScene(gameOver, transition: transition) 


} 

func CollisionWithEnemy2(Player: SKSpriteNode, Enemy: SKShapeNode) { 

    //Highscore 
    var ScoreDefault = NSUserDefaults.standardUserDefaults() 
    ScoreDefault.setValue(Score, forKey: "Score") 
    ScoreDefault.synchronize() 

    if (Score > Highscore) { 
     var HighscoreDefault = NSUserDefaults.standardUserDefaults() 
     HighscoreDefault.setValue(Score, forKey: "Highscore") 
    } 

    //var gameOver:SKScene = GameOverScene(size: self.size) 
    //ScoreLabel.removeFromSuperview() 
    Enemy.removeFromParent() 
    //Player.removeFromParent() 
    //self.view?.presentScene(gameOver, transition: transition) 
} 


override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 
    /* Called when a touch begins */ 

    isTouching = true 

    for touch in (touches as! Set<UITouch>) { 
     let location = touch.locationInNode(self) 

     touchXPosition = location.x 

    } 

} 

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) { 
    isTouching = false 
} 


func spawnEnemies() { 
    //Randomizing width of blocks 
    var blockWidth = Int(arc4random_uniform(UInt32(size.width/3)) + UInt32(size.width/5)) 

    //Min and Max position of blocks 
    var minPosition : UInt32 = UInt32(blockWidth/2) 
    var maxPosition : UInt32 = UInt32(size.width - CGFloat(blockWidth/2)) 

    //Randomizing Block Position 
    var blockXPosition = arc4random_uniform(maxPosition - minPosition) + minPosition 

    //Making Blocks 
    var Enemy = SKShapeNode(rectOfSize: CGSize(width: blockWidth, height: 5)) 
    Enemy.position = CGPointMake (CGFloat(blockXPosition), CGFloat(size.height+50)) 

    //Coloring Blocks 
    Enemy.fillColor = SKColor.whiteColor() 

    //Moving Blocks 
    let action = SKAction.moveToY(-50, duration: 2.5) 

    //Removing blocks once off screen 
    let actionDone = SKAction.removeFromParent() 

    //Running the above actions 
    Enemy.runAction(SKAction.sequence([action, actionDone])) 


    //Physics/Collisions 
    Enemy.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize (width: blockWidth, height: 1)) 
    Enemy.physicsBody?.categoryBitMask = PhysicsCategory.Enemy 
    Enemy.physicsBody?.affectedByGravity = false 
    Enemy.physicsBody?.dynamic = true 

    //Adding enemy to scene 
    self.addChild(Enemy) 

} 

override func update(currentTime: CFTimeInterval) { 
    /* Called before each frame is rendered */ 

    var offsetLeft = 0 - (Player.position.x - 25) 


    Player.position = CGPoint(x: Player.position.x, y: Player.position.y) 

    PlayerRight.position = CGPoint(x: Player.position.x + size.width, y: Player.position.y) 

    PlayerLeft.position = CGPoint(x: Player.position.x - size.width, y: Player.position.y) 

    if isTouching { 
     if touchXPosition > self.size.width/2 { 
      // move character to the right. 
      Player.position.x += 10 

     } 
     if touchXPosition < self.size.width/2 { 
      // move character to the left. 
      Player.position.x -= 10 

     } 
    } 


    if Player.position.x < 0 { 
     Player.position.x = size.width 
    } 
    if Player.position.x > size.width { 
     Player.position.x = 0 
    } 
} 
} 

Все прокомментировано достаточно хорошо, но если у вас есть какие-либо вопросы о том, что мне известно. Любая помощь с этим будет принята с благодарностью!

+0

Не вставляйте скриншоты кода, сообщения об ошибках и т. Д. Вставьте _code_. Вставить _error messages_. Объясните проблему. Не заставляйте людей заниматься изображениями кода. – matt

+0

Мой плохой человек, я обновлю его соответствующим образом. – Darkstar

+0

Пожалуйста, не «удаляйте» свой вопрос - если вы найдете решение, которое вы можете ответить на свой вопрос – Paulw11

ответ

2
static let PlayerRight : UInt32 = 3 //00000000000000000000000000000100 
static let PlayerLeft : UInt32 = 4 //00000000000000000000000000001000 
static let EnemyRight : UInt32 = 5 //00000000000000000000000000010000 

ли вы действительно считают, что 3 является двоичным 100 и 4 является двоичным 1000 (и так далее)? Потому что, если вы это сделаете, и если вам нужно, чтобы это было правдой, вы столкнулись бы с большими проблемами позже, если попытаетесь использовать эти значения в качестве реальных битмасков.

+0

Я понятия не имею, честно, но это не имеет значения для моего кода, который я не думаю. Я смотрел учебник, и это то, что парень сказал, что им очень жаль, если нет. Я исправлю код, хотя это не имеет большого значения, потому что это комментарии. Спасибо, что указали на это. – Darkstar

+3

@ Darkstar Я думаю, вы пропустили '1 << 3'' 1 << 4' и т. Д. Тогда было бы (почти) правильно – Kametrixom

+0

Да, понимание кода, который вы копируете вместе, не имеет значения. Просто переставьте его вокруг, пока не будет «вид работ», когда мы сделаем все остальное. А если нет, просто опубликуйте его в магазине. :) – Eiko

Смежные вопросы

 Смежные вопросы