如何控制多个同名精灵套件节点?

Posted

技术标签:

【中文标题】如何控制多个同名精灵套件节点?【英文标题】:How to control multiple sprite kit nodes with the same name? 【发布时间】:2016-04-29 01:41:15 【问题描述】:

斯威夫特 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
            

【问题讨论】:

【参考方案1】:

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

你需要用enumerateChildNodesWithName遍历所有个被称为敌人的精灵:

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

            // Your enemy movement/update code here

        

如果您的EnemySpeed 变量应该引用您当前正在处理的精灵的速度,您必须对它做一些事情,因为它只是一个实例变量,而不是该精灵的属性。您可能想要使用 Enemy.physicsBody.velocity,它是一个 CGVector,因此要将其转换为您需要的速度:

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

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

【讨论】:

你能详细说明如何修改我的enemySpeed成为CGVector吗?我只希望敌人追逐玩家,最好以恒定的速度而不是当前的情况,即随着玩家越远他们变得越快。

以上是关于如何控制多个同名精灵套件节点?的主要内容,如果未能解决你的问题,请参考以下文章

如何在精灵套件中旋转精灵节点?

iOS7 SpriteKit 如何对两个或多个精灵节点子节点的动画进行分组?

如何检测精灵套件中的碰撞?

快速创建具有相同纹理的多个精灵(节点)

精灵套件目标 c 中的停止按钮

触摸节点是精灵套件