ios - Sprite Kit 高效的随机节点生成

标签 ios swift sprite-kit

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

我有 10 个平台,我希望在每个平台上都有一个 Enemy (SKNode),其中包含 3 个随机生成的不同 SKSpriteNode。这些 SKSpriteNode 都执行其他行为,这就是为什么我不能简单地更改 SKNode 的纹理。

对于我的代码,我想在不同的平台上生成相同的节点。 但是,代码无法正常工作,节点会生成,但仅在 1 个位置(didMoveToView 中最后一个 SpawnEnemy 代码的位置),这意味着 1 个位置有 10 个节点.

我还尝试添加 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 移动它。因为你的 Sprite 都被添加到同一个“敌人”,所以它们都会出现在你的敌人被移动到最后的地方。

让我们把你的代码分解成相关的部分:

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 时,您做了很多事情来添加其他 sprite,但就 Enemy 而言,您只是在改变它的位置。由于您将 Sprite 添加到同一节点,因此当您移动该敌人节点时,子 Sprite 也会随之移动。

您有两种选择来解决这个问题。要么将您的 Sprite 添加到某个更高级别的节点(如场景),要么为您打算添加的每个 Sprite 创建新的“敌人”节点。两者都应该有效,但最佳选择将取决于您试图用它们完成什么 - 该讨论的范围超出了您在这里谈论的范围。

关于ios - Sprite Kit 高效的随机节点生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32904162/

相关文章:

ios - 游戏激活时运行函数 iOS - SpriteKit

ios - 如何在动画 Sprite 时动态计算 SKPhysicsBody?

ios - 在游戏场景中以编程方式将按钮居中

ios - 根据表中出现的内容重新排序 MutableArray

ios - 如何以编程方式停用应用程序?

ios - 将带有可见导航栏的 View Controller 弹出到带有隐藏导航栏的 View Controller 时,带有 interactivePopGestureRecognizer 的黑色区域

iphone - CoreData 有什么不同

xcode - Xcode beta 7.3 (7D162j) 中的 UIFont 错误?

ios - 不执行 segue

arrays - 如何在 Swift 4 中选择要反序列化的 JSON 数组