[Swift] 적의 무작위 공격의 샘플입니다.(SpriteKit)

16057 단어 XcodeSwiftSpriteKit
개발 환경: Xcode6-Beta4
testBullet.gif
SpriteKit을 사용했습니다.
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)자동 스케일이라도 효과적으로 진행되지 않을 것 같습니다.
아이폰4s라면 512를 먼저 만들면 되니까 이렇게 먼저 한다.

좋은 웹페이지 즐겨찾기