Sprite Kit高效随机节点生成

时间:2015-10-02 09:22:16

标签: ios swift sprite-kit

我正在寻找在给定位置使用随机SKSpriteNodes的节点的最有效方法。

我有10个平台,每个平台上我都想拥有一个Enemy(SKNode),它包含3个不同的SKSpriteNodes,它们会随机产生。这些SKSpriteNodes都做其他行为,这就是为什么我不能简单地改变SKNode的纹理。

与我的代码一样,我想在不同的平台上生成相同的节点。 但是,代码无法正常运行,节点确实产生但仅在1个位置(SpawnEnemy中最后一个didMoveToView代码的位置),即1个位置的10个节点。

我还尝试添加10个不同的Enemy节点,每个节点都有一个平台。但这只是一个副本&粘贴代码效率低下。

如何解决我的问题,或者是否有其他方法可以更有效地生成它们?

我的代码:

class GameScene: SKScene, SKPhysicsContactDelegate {

var Enemy: SKNode!

override func didMoveToView(view: SKView) {
    /* Setup your scene here */
    self.physicsWorld.contactDelegate = self
    self.physicsBody?.velocity = CGVectorMake(0, 0)
    self.anchorPoint = CGPoint(x: 0, y: 0.20)

    backgroundColor = SKColor(red: 81.0/255.0, green: 192.0/255.0, blue: 201.0/255.0, alpha: 1.0)

    self.Enemy1 = SKNode()
    addChild(Enemy1)

    SpawnPlayer()
    SpawnEnemy(CGPoint(x: self.frame.size.width / 2, y: Platform1.position.y + 15))
    SpawnEnemy(CGPoint(x: self.frame.size.width / 2, y: Platform2.position.y + 15))
    //Same code for all the other Platforms.
    }

 func SpawnEnemy(position: CGPoint!){

    switch (arc4random_uniform(3)){

    case 0:

        Picture1.filteringMode = .Nearest
        Picture2.filteringMode = .Nearest

        Animation1 = SKAction.animateWithTextures([Picture1,Picture2], timePerFrame: 0.5)
        AnimationRepeat1 = SKAction.repeatActionForever(Animation1)

        Sprite1 = SKSpriteNode (imageNamed: "Sprite1.png")
        Sprite1.size = CGSize(width: 64, height: 64)
        Sprite1.zPosition = 2

        Sprite1.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 45, height: 50))
        Sprite1.physicsBody?.dynamic = true
        Sprite1.physicsBody?.allowsRotation = false
        Sprite1.physicsBody?.restitution = 0.0
        Sprite1.physicsBody?.usesPreciseCollisionDetection = true

        Sprite1.physicsBody?.categoryBitMask = EnemyCategory
        Sprite1.physicsBody?.collisionBitMask = PlayerCategory | Platform1Category
        Sprite1.physicsBody?.contactTestBitMask = Wall1Category | Wall2Category | PlayerCategory

        Sprite1.runAction(AnimationRepeat1)

    Enemy.position = position
    Enemy.addChild(Sprite1)

    case 1:

        Picture3.filteringMode = .Nearest
        Picture4.filteringMode = .Nearest

        Animation1 = SKAction.animateWithTextures([Picture3,Picture4], timePerFrame: 0.5)
        AnimationRepeat1 = SKAction.repeatActionForever(Animation1)

        Sprite2 = SKSpriteNode (imageNamed: "Sprite2.png")
        Sprite2.size = CGSize(width: 64, height: 64)
        Sprite2.zPosition = 2

        Sprite2.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 45, height: 50))
        Sprite2.physicsBody?.dynamic = true
        Sprite2.physicsBody?.allowsRotation = false
        Sprite2.physicsBody?.restitution = 0.0
        Sprite2.physicsBody?.usesPreciseCollisionDetection = true

        Sprite2.physicsBody?.categoryBitMask = EnemyCategory
        Sprite2.physicsBody?.collisionBitMask = PlayerCategory | Platform1Category
        Sprite2.physicsBody?.contactTestBitMask = Wall1Category | Wall2Category | PlayerCategory

        Sprite2.runAction(AnimationRepeat1)

    Enemy.position = position
    Enemy.addChild(Sprite2)

    case 2:

        Picture5.filteringMode = .Nearest
        Picture6.filteringMode = .Nearest

        Animation1 = SKAction.animateWithTextures([Picture5,Picture6], timePerFrame: 0.5)
        AnimationRepeat1 = SKAction.repeatActionForever(Animation1)

        Sprite3 = SKSpriteNode (imageNamed: "Sprite3.png")
        Sprite3.size = CGSize(width: 64, height: 64)
        Sprite3.zPosition = 2

        Sprite3.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 45, height: 50))
        Sprite3.physicsBody?.dynamic = true
        Sprite3.physicsBody?.allowsRotation = false
        Sprite3.physicsBody?.restitution = 0.0
        Sprite3.physicsBody?.usesPreciseCollisionDetection = true

        Sprite3.physicsBody?.categoryBitMask = EnemyCategory
        Sprite3.physicsBody?.collisionBitMask = PlayerCategory | Platform1Category
        Sprite3.physicsBody?.contactTestBitMask = Wall1Category | Wall2Category | PlayerCategory

        Sprite3.runAction(AnimationRepeat1)

    Enemy.position = position
    Enemy.addChild(Sprite3)

    default:
        return
    }

}

1 个答案:

答案 0 :(得分:2)

你只看到一个位置的原因是你只是创造了一个“敌人”并用SpawnEnemy移动它。由于你的精灵都被添加到同一个“敌人”中,它们都将出现在你的敌人被移动的任何地方。

让我们将你的代码写入相关位:

var Enemy: SKNode!

override func didMoveToView(view: SKView) {

    self.Enemy1 = SKNode()
    addChild(Enemy1)
    SpawnEnemy(CGPoint(x: self.frame.size.width / 2, y: Platform1.position.y + 15))
    SpawnEnemy(CGPoint(x: self.frame.size.width / 2, y: Platform2.position.y + 15))

    }

 func SpawnEnemy(position: CGPoint!){

    switch (arc4random_uniform(3)){

    case 0:

        Enemy.position = position
        Enemy.addChild(Sprite1)

    case 1:

        Enemy.position = position
        Enemy.addChild(Sprite2)

    case 2:

        Enemy.position = position
        Enemy.addChild(Sprite3)

    default:
        return
    }

}

因此,在didMoveToView()中,您创建了一个Enemy节点。然后,当你打电话给SpawnEnemy时,你会做一些东西来添加其他精灵,但就敌人来说,你只是改变它的位置。由于您将精灵添加到同一节点,因此当您移动该Enemy节点时,子精灵也会随之移动。

您有两种方法可以解决此问题。将精灵添加到某个更高级别的节点(如场景),或为要添加的每个精灵创建新的“敌人”节点。要么应该工作,但最好的选择将取决于你想要用它们完成什么 - 讨论的范围超出了你在这里所讨论的范围。