[Swift] ランダムに敵が攻撃をしてくるサンプル。（SpriteKit）

開発環境：Xcode6-Beta4


![testBullet.gif](https://qiita-image-store.s3.amazonaws.com/0/45822/c1b2eb61-15e9-2e20-393c-23f78e418ea8.gif)

SpriteKitをつかっております。


```swift:GameScene.swift

import SpriteKit

class GameScene: SKScene {
    var width: Int!
    
    // インターバルを用意する。
    var lastEnemy: CFTimeInterval!
    var lastBullet: CFTimeInterval!
    
    // ノードをいれる配列を用意
    var allEnemies: [SKNode] = []
    var allDead: [SKNode] = []
    
    // 衝突判定用のカテゴリを用意しておく
    let enemyCategory: UInt32 = 0x1 << 0
    let bulletCategory: UInt32 = 0x1 << 1
    
    
    override func didMoveToView(view: SKView) {
        self.physicsWorld.gravity = CGVector(0, 0)
        
        // widthに画面幅値を入れておく。
        // self.width = Int(self.view.bounds.size.width)としても自動Scaleが効いてるから上手くいかないと思う。
        // ここの512をどう出すか。別途やります。面倒臭いからiPhone 4sなら512で上手くいくのでいったん入れておく。
        self.width = 512
    }
    
    // Step.1 敵を生成するアクション。
    func createEnemy() {
        
        // 敵のx座標をつくる。めんどくさい。。
        var xPos = UInt(CGRectGetMidX(self.frame))
            + UInt(arc4random_uniform(UInt32(self.width)))
            - UInt(self.width / 2)
        
        var location = CGPoint(x: CGFloat(xPos), y: CGRectGetMaxY(self.frame))
        
        var enemy = SKSpriteNode(color: UIColor.redColor(), size: CGSizeMake(60, 40))
        enemy.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(60, 40))
        enemy.physicsBody.velocity = CGVector(0, -80)
        enemy.physicsBody.linearDamping = false
        enemy.physicsBody.categoryBitMask = enemyCategory
        enemy.physicsBody.collisionBitMask = enemyCategory
        enemy.name = "enemy"
        enemy.position = location
        self.addChild(enemy)
    }
    
    // Step.2 生きている（画面の中にいる）敵ノードの配列を作成するアクション。
    func makeEnemyArray() {
        self.allEnemies.removeAll()
        self.allDead.removeAll()
        
        // 敵をallEnemiesに格納していく。
        self.enumerateChildNodesWithName("enemy") {
            node, stop in
            
            if node.position.y < 0 {
                self.allDead.append(node)
            } else {
                self.allEnemies.append(node)
            }
        }
    }
    
    // Step.3 敵が光弾を撃つアクション。
    func createBullet() {
        
        // まずは光弾を放つ敵をランダムで選択するために。
        let cnt = allEnemies.count
        let index = arc4random_uniform(UInt32(cnt))
        
        // 敵が居るなら、光弾を生成する。
        if allEnemies != [] {
            var attackEnemy = allEnemies[Int(index)]

            // 光弾を作成
            let bullet = SKSpriteNode(color: UIColor.yellowColor(), size: CGSizeMake(10, 10))
            bullet.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(10, 10))
            bullet.physicsBody.velocity = CGVectorMake(0, -400)
            bullet.physicsBody.affectedByGravity = false
            bullet.physicsBody.categoryBitMask = bulletCategory
            bullet.physicsBody.collisionBitMask = bulletCategory
            bullet.position = attackEnemy.position
            self.addChild(bullet)
        }
    }
    
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {}
    
    override func update(currentTime: CFTimeInterval) {
        
        if !lastEnemy {
            lastEnemy = currentTime
        }
        if !lastBullet {
            lastBullet = currentTime
        }
        
        // 0.8秒間隔で敵を生成する。
        if lastEnemy + 0.8 <= currentTime {
            self.createEnemy()
            lastEnemy = currentTime
        }
        
        // 0.2秒間隔で光弾を生成する。
        if lastBullet + 0.1 <= currentTime {
            self.createBullet()
            lastBullet = currentTime
        }
        
        // 常時、allEnemiesを更新、画面外の敵を削除する。
        self.makeEnemyArray()
        for dead in self.allDead {
            dead.removeFromParent()
        }
    }
}
```

### 補足（画面幅について）

widthに画面幅値を入れているのですが、
`self.width = Int(self.view.bounds.size.width)`
としても自動Scaleが効いてるから上手くいかないと思います。
「iPhone 4s」なら512にしておけば一旦上手くいくので、いったんそのようにしています。。