ios - 如何控制多个同名的 Sprite 套件节点?

标签 ios swift sprite-kit

swift 2 SpriteKit

所以我使用以下代码随机生成敌人,然后将它们移向玩家。但由于某种原因,只有第一个敌人向玩家移动,其余的敌人什么也不做。我是新手,因此所有详细信息都会有所帮助。

在 didmovetoview 下:

        let wait = SKAction.waitForDuration(3, withRange: 2)
        let spawn = SKAction.runBlock {
            let Enemy = SKSpriteNode(imageNamed: "Enemy.png")
            Enemy.size.height = (70) //138
            Enemy.size.width = (49) //99
            Enemy.position = CGPointMake(CGRectGetWidth(self.frame) - 100 , CGRectGetHeight(self.frame) - 100)
            Enemy.physicsBody = SKPhysicsBody (rectangleOfSize: Enemy.size)
            Enemy.physicsBody!.dynamic = true
            Enemy.physicsBody!.allowsRotation = false
            Enemy.physicsBody!.friction = 0
            Enemy.physicsBody!.restitution = 0
            Enemy.physicsBody!.linearDamping = 1
            Enemy.physicsBody!.angularDamping = 1
            Enemy.name = "Enemy"
            Enemy.zPosition = 3
            self.addChild(Enemy)
            self.EnemyExists=true

        }
        let sequence = SKAction.sequence([wait, spawn])
        self.runAction(SKAction.repeatActionForever(sequence))

在更新功能下:

            let Enemy = childNodeWithName("Enemy") as! SKSpriteNode
            let Player = childNodeWithName("Player") as! SKSpriteNode

            if EnemySpeed == OriginalEnemySpeed {

                let impulseVector = CGVector(dx: (Player.position.x - Enemy.position.x)/200, dy: (Player.position.y - Enemy.position.y)/200)
                Enemy.physicsBody?.applyImpulse(impulseVector)
            }

            if Enemy.position.x + Enemy.size.width / 4 > size.width {
                Enemy.position.x = Enemy.size.width / 4

            }
            else if Enemy.position.x + Enemy.size.width / 4 < 0 {
                Enemy.position.x = size.width - Enemy.size.width / 4

            }

            if Enemy.position.y + Enemy.size.height / 4 > size.height {
                Enemy.position.y = Enemy.size.height / 4

            }
            else if Enemy.position.y + Enemy.size.height / 4 < 0 {
                Enemy.position.y = size.height - Enemy.size.height / 4

            }

            EnemySpeed-=1
            if EnemySpeed < 1 {
                EnemySpeed = OriginalEnemySpeed
            }

最佳答案

childNodeWithName("Enemy") 只会拾取场景中名为 Enemy 的第一个 Sprite 。

您需要使用enumerateChildNodesWithName循环遍历所有名为敌人的 Sprite :

        enumerateChildNodesWithName("Enemy") {
            node, stop in
            let Enemy = node as! SKSpriteNode

            // Your enemy movement/update code here

        }

如果您的 EnemySpeed 变量应该指的是您当前正在处理的 Sprite 的速度,则您必须对它进行一些操作,因为它只是一个实例变量,而不是该变量的属性 Sprite 。您可能需要使用 Enemy.physicalsBody.velocity,它是一个 CGVector,因此要将其转换为您需要的速度:

enemySpeedX = enemy.physicsbody.velocity.dx
enemySpeedY = enemy.physicsbody.velocity.dy
enemySpeed = sqrt(enemySpeedX* enemySpeedX + enemySpeedY* enemySpeedY)

还要检查您的命名标准;大多数东西应该是驼峰式的,所以 Enemy 应该是 enemyOriginalEnemySpeed 应该是 originalEnemySpeed 等等。

关于ios - 如何控制多个同名的 Sprite 套件节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36928183/

相关文章:

ios - 动画 UILabel 进度百分比 swift

swift - 如何在 Swift 中设置速度

ios - SKCameraNode 跟不上移动节点

ios - 如何根据数组中包含的字符串隐藏特定的 UIButton

ios - Facebook for swift 4.2 实现错误

ios - 我将如何显示一组注释?

ios - OpenGL 纹理在使用 Swift 的 iOS 上不显示

swift - 画直线用于瞄准

ios - WiFi 关闭时 NSURLSessionTask 永远不会回调

iphone - UITableViewCell 背景 View 中的 UIButton