[Swift] 적의 무작위 공격의 샘플입니다.(SpriteKit)
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를 먼저 만들면 되니까 이렇게 먼저 한다.
Reference
이 문제에 관하여([Swift] 적의 무작위 공격의 샘플입니다.(SpriteKit)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mochizukikotaro/items/af7f5a35cedfafb2d92a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)