Не могу правильно переместить захватчиков в SpriteKit - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь сделать игру Invader в SpriteKit в Swift с помощью этого урока:

https://www.raywenderlich.com/1167-how-to-make-a-game-like-space-invaders-with-spritekit-and-swift-part-1

Я закончил часть 1 и часть 2.Но перемещение захватчиков все еще странно.Когда захватчики достигли правого края экрана, только один захватчик идет вниз и двигается влево.Остальные просто двигаются влево.

Как я могу это решить?

bug

enum InvaderMovementDirection {
        case right
        case left
        case downThenRight
        case downThenLeft
        case none
    }

func moveInvaders(forUpdate currentTime: CFTimeInterval) {

        if (currentTime - timeOfLastMove < timePerMove) {
            return
        }

        enumerateChildNodes(withName: InvaderType.name) { node, stop in

            switch self.invaderMovementDirection {
            case .right:
                node.position = CGPoint(x: node.position.x + 10, y: node.position.y)
            case .left:
                node.position = CGPoint(x: node.position.x - 10, y: node.position.y)
            case .downThenLeft, .downThenRight:
                node.position = CGPoint(x: node.position.x, y: node.position.y - 10)
            case .none:
                break
            }

            self.timeOfLastMove = currentTime
            self.determineInvaderMovementDirection()

        }
    }


func determineInvaderMovementDirection() {

        var proposedMovementDirection: InvaderMovementDirection = invaderMovementDirection

        enumerateChildNodes(withName: InvaderType.name) { node, stop in

            switch self.invaderMovementDirection {
            case .right:
                if (node.frame.maxX >= node.scene!.size.width - 1.0) {

                    proposedMovementDirection = .downThenLeft
                    self.adjustInvaderMovement(to: self.timePerMove * 0.8)
                    stop.pointee = true
                }
            case .left:

                if (node.frame.minX <= 1.0) {
                    proposedMovementDirection = .downThenRight
                    self.adjustInvaderMovement(to: self.timePerMove * 0.8)
                    stop.pointee = true
                }

            case .downThenLeft:
                proposedMovementDirection = .left
                stop.pointee = true

            case .downThenRight:
                proposedMovementDirection = .right
                stop.pointee = true

            default:
                break
            }

        }

        if (proposedMovementDirection != invaderMovementDirection) {
            invaderMovementDirection = proposedMovementDirection
        }
    }

1 Ответ

0 голосов
/ 24 апреля 2019

Я думаю, вам нужно переместить эти строки:

        self.timeOfLastMove = currentTime
        self.determineInvaderMovementDirection()

находиться вне цикла, созданного:

enumerateChildNodes(withName: InvaderType.name)

в func moveInvaders(forUpdatefunc moveInvaders(forUpdate.

Вы можете сделать это, просто переместив их после '}'.

Я думаю, что происходит то, что вы перемещаете одного захватчика, а затем меняете invaderMovementDirection на proposedMovementDirection, тогда как вы должны изменить значение invaderMovementDirection только после того, как ВСЕ захватчики переместились.

Итак, они двигаются .right, они ударяются о стену, и вы обрабатываете первого захватчика. Вы перемещаете его и затем вызываете determineInvaderMovementDirection, который устанавливает предлагаемое направление на .downThenLeft. В конце determineInvaderMovementDirection вы устанавливаете направление захватчиков на .downThenLeft с proposedMovementDirection.

Когда вы обрабатываете следующий захватчик, его направление (неправильно) устанавливается как .downThenLeft. поэтому вы перемещаете его вниз, затем влево, вызываете determineInvaderMovementDirection, который устанавливает направление захватчиков на .left, которое используется для обработки всех других захватчиков.

...