Перезапуск игры с набором спрайтов Swift

#ios #swift #sprite-kit

#iOS #быстрый #Набор спрайтов

Вопрос:

Я создал простую 2D аркадную игру, используя SpriteKit, и я пытаюсь добавить систему подсчета очков. по сути, игра представляет собой квадратный спрайт, который должен перепрыгивать через различные препятствия. Итак, чего я хочу, так это когда игрок контактирует с объектом, чтобы перезапустить всю игру. Игра обнаруживает контакт (я тестировал его ранее), но когда я удаляю всех своих дочерних элементов, а затем запускаю основную основную функцию моей игры, я замечаю, что старые объекты продолжают появляться и мешать друг другу.

 func didBegin(_ contact: SKPhysicsContact) {

    if (contact.bodyA.categoryBitMask == PhysicsCategory.Player amp;amp; contact.bodyB.categoryBitMask == PhysicsCategory.Obstacles ) { //case where PLAYER collides with OBSTACLE

        print("I detect Contact")

        Scorelabel.text = "0"
        scoreCounter = 0


        self.removeAllActions()
        self.removeAllChildren()

        self.setupGame()

    }
 

// затем функция didBeging продолжается для других случаев

`

Комментарии:

1. Извините, но я не понимаю вашего вопроса: неясно, хотите ли вы реализовать простой конец игры или потерю жизни (где, например, вы должны вернуться к предыдущей ситуации без перезагрузки полной сцены). В любом случае, если вы хотите, чтобы игра закончилась, вы должны следовать ответу Nik, иначе вам следует исправить свои свойства, чтобы представить старое состояние. Вы не должны делать в didBegin(_contact), потому что его можно вызывать много раз (ваш код неверен ..)

2. Хорошо, большое вам спасибо. Я верю, что то, что вы сказали о том, что он вызывается несколько раз, — это то, что неправильно.

Ответ №1:

Если вы пытаетесь перезапустить сцену, вы можете просто представить ту же сцену, и она вернется к настройкам по умолчанию:

 let scene = GameScene(size: self.size) // Whichever scene you want to restart (and are in)
let animation = SKTransition.crossFade(withDuration: 0.5) // ...Add transition if you like
self.view?.presentScene(scene, transition: animation)
 

Поместите этот код в любую сцену, в которой вы находитесь, и хотите перезапустить. Его следует вызывать, когда вы хотите перезапустить сцену.

Возможно, вы просто захотите не показывать анимацию (или выполнять перекрестное затухание), если пытаетесь сделать плавный переход.

Кроме того, вы можете захотеть создать игру поверх сцены / меню. Это может быть просто еще один SKNode, который становится видимым после перезагрузки игры или даже другой сцены.

Комментарии:

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

2. @Confused Везде, где вы хотите перезапустить сцену

3. В игровой сцене?

4. @Confused В какой бы сцене вы уже ни находились (и хотите перезапустить)

5. Ваше здоровье. Это то, что сбивало меня с толку.

Ответ №2:

Прежде всего, вы должны проверить оба случая, если игрок является контактом A или если игрок является контактом B. Во-вторых, вы должны присвоить объект, который вы хотите удалить, lets говорит о препятствии, переменной, например, lets говорит, что объект B является препятствием, затем: contact.bodyB.node.removeFromParent(), и вы успешно удалите объект.

Комментарии:

1. По-моему, я выразился не очень ясно. Моя цель — полностью перезапустить свою игру. Я хочу устранить не только данное препятствие, но и все остальное. Что касается другого случая контакта, я внедрил его в свой код, но я просто не добавил его как часть своего вопроса, чтобы он выглядел аккуратнее

2. В этом случае вы можете сделать это следующим образом на своей игровой сцене: пусть NewGame = GameScene(size: self.size) NewGame.ViewController = self.ViewController self.ViewController.currentGame = NewGame self.changePlayer() NewGame.CurrentPlayer = self.CurrentPlayer пусть transition = SKTransition . дверной проем (с длительностью: 1.5) самовидение? . Присутствует сцена (новая игра, переход: переход)