2015-10-02 3 views
0

Я ищу наиболее эффективный способ для узлов со случайными SKSpriteNodes на данных позициях.Sprite Kit эффективный случайный узел spawn

У меня есть 10 платформ, на каждом из них я хочу иметь врага (SKNode), который содержит для 3 разных SKSpriteNodes, которые будут случайным образом появляться. Эти SKSpriteNodes выполняют другие действия, поэтому я не могу просто изменить текстуру SKNode.

Как и в моем коде, я хотел создать тот же узел на разных платформах. Однако код не работает должным образом, узлы появляются, но только в 1 позиции (позиция из последнего SpawnEnemy кода в didMoveToView), что означает 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 
    } 

} 
+0

Вы не можете иметь один и тот же узел в разных положениях. Вам нужно создать 10 вражеских узлов. –

+0

Но как получилось, что он порождает эти узлы, но занимает позицию последней «SpawnEnemy» и все икру на этой позиции? – Albert

ответ

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(), вы создаете один вражеский узел. Затем, когда вы вызываете SpawnEnemy, вы делаете кучу вещей, чтобы добавить других спрайтов, но, что касается Enemy, вы просто меняете свое положение. Поскольку вы добавляете спрайты в один и тот же узел, когда вы перемещаете этот узел Enemy, дочерние спрайты тоже перемещаются вместе с ним.

У вас есть два варианта исправить это. Либо добавьте спрайты на какой-либо узел более высокого уровня (например, сцену), либо создайте новые «вражеские» узлы для каждого из спрайтов, которые вы собираетесь добавить. Любой из них должен работать, но лучший выбор будет зависеть от того, что вы пытаетесь выполнить с ними - объем этого обсуждения выходит за рамки того, о чем вы говорите.

+0

Итак, чтобы создать новые вражеские узлы для каждого спрайта, есть ли другой способ, как мой первый пост (редактировать)? Нужно ли мне воссоздавать SpawnEnemy для каждого врага, или есть способ иметь только 1 SpwnEnemy func и все «Enemy» в нем? – Albert

+1

Ну, вместо того, чтобы сохранить переменную «Враг» как переменную класса, вы можете просто создать новый узел «Враг» всякий раз, когда вы создаете спрайт. Например, вы можете удалить строку «var» и в верхней части вашей функции SpawnEnemy() добавить что-то вроде «let Enemy = SKNode()». Таким образом, каждый раз, когда вы создаете врага, у него есть свой собственный узел. –