2016-06-04 7 views
0

Я пытаюсь создать игру типа астероидов, и каждый раз, когда астероид сталкивается с игроком, конечная сцена загружается нормально, вырезается, когда я пытаюсь перезапустить ее, как если бы код зацикливался на функции столкновения, которая вызывала конец сцены. Вот функция столкновенияSwift SpriteKit presentScene error

func didBeginContact(contact: SKPhysicsContact) { 
    print("5") 
    //Creating a variable that holds which two items collide 
    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask 
    //Creating a switch case statement 
    //This will run a different case depending on whitch two objects collide 
    switch(contactMask) { 
    //If the satellite and the asteroid collide do this 
    case bitMask.satellite.rawValue | bitMask.asteroid.rawValue: 
     //removing the satellite 
     let secondNode = contact.bodyB.node 
     secondNode?.physicsBody?.allowsRotation = true 
     let firstNode = contact.bodyA.node 
     firstNode?.removeFromParent() 
     //Stopping the mission timer 
     removeActionForKey("missionDurationTime") 
     self.removeAllChildren() 
     print("6") 
     self.view?.presentScene(EndScene()) 
     print("7") 
    default: 
     return 
    } 
} 

А вот функция, которая восходит к моей игре сцене из моей конечной сцены

func Restart(){ 
    print("hello") 
    RestartBtn.removeFromSuperview() 
    speach.removeFromSuperview() 
    score.removeFromSuperview() 
    gameOver.removeFromSuperview() 
    self.view?.presentScene(GameScene()) 

} 

После того как я нажал кнопку перезагрузки всех меток в EndScene уходит как они должны, но затем экран пуст, и консоль просто печатает `5 Слишком много раз, чтобы подсчитать до тех пор, пока метки в конце сцены не вернутся. Я очень смущен и по-своему над головой. Любая помощь высоко ценится!

UPDATE:

Я изменил код в моей кнопки перезапуска в этом

print("hello") 
    RestartBtn.removeFromSuperview() 
    speach.removeFromSuperview() 
    score.removeFromSuperview() 
    gameOver.removeFromSuperview() 
    let scene = GameScene(size: self.view!.bounds.size) 
    scene.backgroundColor = SKColor(red: 1, green: 1, blue: 1, alpha: 1) 
    scene.scaleMode = .AspectFill 
    scene.backgroundColor = UIColor.whiteColor() 
    let transition = SKTransition.pushWithDirection(SKTransitionDirection.Left, duration:0.5) 
    self.scene?.view?.presentScene(scene, transition: transition) 

Теперь нагрузок игра сцены, и все, как это должно быть, за то, что все пять раз превышает исключением , Это то, что он должен выглядеть следующим образом: What it should look like

И это то, что он выглядит как What it does look like

+0

Как вы призывающую вашу первую сцену, когда ваше приложение запускает (код в контроллере Gameview) ?. Можете ли вы поставить этот код на свой вопрос, пожалуйста. В вашем текущем коде перезагрузки вам необходимо инициализировать GameScene с ограничением просмотра в качестве его размера. Строка линии линии линии 2 ниже не будет работать, когда вы делаете это, потому что вы больше не масштабируете свою сцену. Я предполагаю, что вы изменяете размер своей сцены по-разному, когда загружаете свою игру и когда ее перезапускаете, и поэтому она выглядит по-другому. – crashoverride777

+0

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

+0

Я добавил ответ. Дайте мне знать, как это происходит. – crashoverride777

ответ

0

В перезапуске код, который вы инициализацией GameScene с размером view.bounds.

Если вы не изменили код GameViewController, то по умолчанию вы используете файл GameScene.sks в качестве ссылки (редактор визуального уровня) с размером сцены по умолчанию 1024 * 768 и режимом масштабирования .AspectFill.

Короче в функции перезапуска попробуйте этот

if let scene = GameScene(fileNamed: "GameScene") { // fileNamed is the GameScene.sks file 
    scene.backgroundColor = SKColor(red: 1, green: 1, blue: 1, alpha: 1) 
     .... 


} 

или альтернативно

let scene = GameScene(size: CGSize(width: 1024, height: 768) 
scene.backgroundColor .... 
+0

Будет ли это работать на всех размерах экрана? Не могу попробовать прямо сейчас, просто думая впереди. –

+0

Да, использование aspectFill - лучшее решение для большинства случаев, это зависит от того, что вы делаете. Вообще идея заключается в том, что вы размещаете свои вещи в своей игре по направлению к центру и просто располагаете дополнительным пространством по бокам/сверху/снизу при работе на iPad (в вашем случае только немного пространства фона). Взгляните на это http://blog.infinitecortex.com/2014/01/spritekit-understanding-skscene-scalemode/ – crashoverride777

+0

Он хотел, чтобы я поместил запятые после каждой сцены. Все, а затем указала переменную, используемую в пределах ее собственного начального значения –

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