繁体   English   中英

Sprite Kit高效随机节点生成

[英]Sprite Kit efficient random node spawn

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

我有10个平台,在每个平台上我都想拥有一个包含3个不同的SKSpriteNodes的敌人(SKNode),它们将随机产生。 这些SKSpriteNodes都具有其他行为,这就是为什么我不能简单地更改SKNode的Texture。

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

我还尝试了添加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
    }

}

您只看到一个位置的原因是,您只创建了一个“敌人”,并使用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节点时,子精灵也会随之移动。

您有两个解决方案。 将您的精灵添加到某个更高级别的节点(如场景),或为要添加的每个精灵创建新的“敌人”节点。 两者都应该起作用,但是最佳选择将取决于您要与他们达成的目标-讨论的范围超出了您在此处的讨论范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM