Sprite Kit高效随机节点刷出



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

我有10个平台,在每个平台上我都想有一个敌人(SKNode),其中包含3个不同的SKSpriteNodes,这将随机生成。这些SKSpriteNodes都有其他行为,这就是为什么我不能简单地改变SKNode的纹理。

与我的代码一样,我想在不同的平台上生成相同的节点。然而,代码不能正常工作,节点确实生成,但只在1个位置(didMoveToView中最后一个SpawnEnemy代码的位置),这意味着10个节点在1个位置。 我还尝试添加了10个不同的敌人节点,每个节点都有一个平台。但这看起来就像一个副本&粘贴低效的代码

我该如何解决我的问题,或者是否有另一种方法来更有效地生成它们?

我代码:

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时,你需要添加一些其他精灵,但就敌人而言,你只是改变了它的位置。因为你是在同一个节点上添加精灵,所以当你移动敌人节点时,子精灵也会随之移动。

你有两个选项来解决这个问题。要么将精灵添加到一些更高级的节点(如场景),要么为你打算添加的每个精灵创建新的"敌人"节点。这两种方法都应该有效,但最佳选择将取决于你想要用它们完成什么—-讨论的范围超出了你在这里讨论的范围。

最新更新