无法在 SpriteKit 中正确移动入侵者

Posted

技术标签:

【中文标题】无法在 SpriteKit 中正确移动入侵者【英文标题】:Can't move invaders correctly in SpriteKit 【发布时间】:2019-04-24 07:53:19 【问题描述】:

我正在尝试使用本教程在 Swift 中使用 SpriteKit 制作入侵者游戏:

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

我完成了第 1 部分和第 2 部分。但是入侵者的移动还是很奇怪。当入侵者到达屏幕的右边缘时,只有一名入侵者下线并向左移动。其他人只是向左移动。

我该如何解决?

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】:

我认为你需要移动这些行:

        self.timeOfLastMove = currentTime
        self.determineInvaderMovementDirection()

在以下创建的循环之外:

enumerateChildNodes(withName: InvaderType.name)

func moveInvaders(forUpdatefunc moveInvaders(forUpdate.

您只需将它们移到“”之后即可。

我认为正在发生的事情是您正在移动一个入侵者,然后将invaderMovementDirection 更改为proposedMovementDirection,而您应该仅在所有入侵者都移动之后才更改更改invaderMovementDirection

所以他们正在移动.right,他们撞墙了,你处理了第一个入侵者。您移动它,然后调用determineInvaderMovementDirection,它将建议的方向设置为.downThenLeft。在determineInvaderMovementDirection 的末尾,您将入侵者的方向从proposedMovementDirection 设置为.downThenLeft

当您处理下一个入侵者时,它的方向(错误地)设置为.downThenLeft。所以你将它向下然后向左移动,调用determineInvaderMovementDirection,它将入侵者的方向设置为.left,用于处理所有其他入侵者。

【讨论】:

感谢您的描述!我明白问题出在哪里,而且效果很好!

以上是关于无法在 SpriteKit 中正确移动入侵者的主要内容,如果未能解决你的问题,请参考以下文章

如何用Sprite Kit制作《太空入侵者》

enumerateChildNodesWithName 没有停止

防范黑客入侵,关闭端口封锁大门 黑客无法入侵

Qt编写视频监控系统(移动侦测/遮挡报警/区域入侵/越界侦测/报警输入输出等)

你的手机被入侵过吗

你的手机被入侵过吗