Swift,Objective-Cプログラミング ~ iOS ~

Objective-C,Swift,Apple Watchなどのプログラミング

【iOS Swift ゲーム開発(SpriteKit)入門 #7】一定間隔で物が落ちてくる処理をする

定期的に物体が落ちてくるようにするには、
NSTimerを使って、一定間隔で特定の処理をさせる。

ここでは円形の物体が一定間隔で上から落ちてくるようにする。

■実装
こちらからスタート用サンプルプロジェクトをダウンロード。
SampleBallFall_Start.zip - Google ドライブ


↓の記事から引き続き読んでいただいている場合は必要ない。swift.swift-studying.com


用意できたら、GameScene.swiftを開く。
「追加」と書いている部分を見て、書いていく。

import SpriteKit

class GameScene: SKScene{
    var contactCount = 0  // 衝突回数
    var contactCountLabel:SKLabelNode?  // 衝突回数を表示するラベル

    override func didMoveToView(view: SKView) {
        //シーンに物理エンジンの設定をする
        physicsWorld.gravity = CGVector(dx: 0.0, dy: -1.0)  //dyを-1.0。下方向に落ちるように重力を設定
        physicsWorld.contactDelegate = self  // 物体同士が衝突したときに処理を実行するお願い

        // 衝突回数を表示するラベル
        let contactCountLabel = SKLabelNode(fontNamed: "Helvetica")
        contactCountLabel.position = CGPoint(x: size.width * 0.92, y: size.height * 0.92)
        contactCountLabel.fontSize = 24.0
        contactCountLabel.horizontalAlignmentMode = .Right
        contactCountLabel.fontColor = UIColor.redColor()
        contactCountLabel.text = "\(contactCount)回"
        addChild(contactCountLabel)
        self.contactCountLabel = contactCountLabel

        // 画面一番下(画面外)に見えない物体を配置
        let bottom = SKShapeNode(rectOfSize: CGSize(width: size.width, height: 1.0))
        bottom.position = CGPoint(x: size.width * 0.5, y: -bottom.frame.size.height)

        // 物理設定
        let physicsBody = SKPhysicsBody(rectangleOfSize: bottom.frame.size)
        physicsBody.dynamic = false  // 重力により移動しなくする→位置を固定する
        physicsBody.contactTestBitMask = 0x1  // 物体が触れたり、重なったときに検知するおまじない
        bottom.physicsBody = physicsBody

        addChild(bottom)  // シーンに物体を追加

        //変更 物体の追加処理をfallBallメソッドに移動
        //追加 物体の追加処理を一定間隔で実行する
        NSTimer.scheduledTimerWithTimeInterval(3.0, target: self, selector: "setupBall", userInfo: nil, repeats: true)
    }

    //追加 円形の物体の追加
    func setupBall(){

        // 物体の表示
        let texture = SKTexture(imageNamed: "green")  // 画像の読み出し
        let sprite = SKSpriteNode(texture: texture)  // Spriteの作成
        let xPosition = CGFloat(arc4random_uniform(UInt32(size.width - texture.size().width))) + texture.size().width * 0.5  //追加 物体のX位置を算出
        sprite.position = CGPoint(x: xPosition, y: size.height - sprite.size.height * 0.5)  //変更 初期位置のセット ランダムで生成したX位置をセット
        sprite.physicsBody = SKPhysicsBody(texture: texture, size: texture.size())  //ゲームキャラや物体が物理エンジンの影響をうけるように設定する
        sprite.physicsBody?.contactTestBitMask = 0x1  // 物体が触れたり、重なったときに検知するおまじない

        // シーンに追加
        addChild(sprite)
    }
}

// 衝突発生時の処理
extension GameScene:SKPhysicsContactDelegate{
    func didBeginContact(contact: SKPhysicsContact) {
        contactCount++
        contactCountLabel?.text = "\(contactCount)回"
    }
}

■実行
書けたら実行しよう。
下記動画のとおりになるはず。

ならない方。
こちらから完成版サンプルプロジェクトをダウンロード。
SampleBallFall_Complete.zip - Google ドライブ


■おわりに
Macを置いておくようにいいかも!?


Twelve South BookArc for Macbook Air TWS-ST-000005


【参考情報】
ここに書いている内容をもう少し詳しく知りたい方はコチラ。

SpriteKitではじめる2Dゲームプログラミング Swift対応


英語を読むことに自身があればコチラ?

iOS Swift Game Development Cookbook: Simple Solutions for Game Development Problems


iOSアプリ開発未経験の人向け
iOSアプリ開発をはじめたとき最初に買った書籍
【アプリ作成未経験の人向け】
Storyboardを使って画面を作成していく。
手順にしたがって操作していくと、ボタンの作成やWebViewの作成などができる。
アプリって、こんな感じで作るんだというのを体験できる。

Swiftではじめる iPhoneアプリ開発の教科書 【iOS 8&Xcode 6対応】

Swiftではじめる iPhoneアプリ開発の教科書 【iOS 8&Xcode 6対応】

・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾

③中級者、上級者向け

詳解 Swift

詳解 Swift