LoginSignup
20
14

More than 3 years have passed since last update.

swift初心者がブロック崩しを作ろうとしてみた

Last updated at Posted at 2019-06-27

はじめに

研究室の同期と「寝ずに作りたいものを作ってみよう」と言う企画を実行した
swiftの勉強を兼ねてブロック崩しを作ることにした
swiftを扱ったことがない完全な初心者が頑張った記録をここに記す

勝ち負けのないブロック崩し

Swift4(Xcode9)でiPhoneアプリのブロック崩し作成する
と言うサイトがあったので参考にして書いてみた

プロジェクトの作成

Xcodeを用いてプロジェクトを作成した
スクリーンショット 2019-06-28 5.44.50.png
この時、GameplayKitのチェックを入れた

ブロックの配置

GameScene.sksのファイルを開き、右下にある丸い印を選択する
その中にあるColorSpriteを画面にドラッグ&ドロップする
スクリーンショット 2019-06-28 5.55.22.png
長方形のブロックを、均等高さや幅が均等になるように12個配置した
同じようにしてパドルも1個配置した

スクリーンショット 2019-06-28 6.02.20.png

ボールの配置

ボールにはball.png←これを使用した
画像挿入するとき、.xcodeproj拡張子のファイルを開いて、App Iconsの設定を変更
スクリーンショット 2019-06-28 6.14.02.png
そして、Assets.xcassetsに画像をドラッグ&ドロップした

ブロックとパドルの設定

comandキーを押しながら全部のブロックを選択し、右の設定するところで名前を変更した
また、値などを以下のように変更した
スクリーンショット 2019-06-28 6.22.10.png
パドルの設定はブロックと同じで名前は区別できるようにした

ボールの設定

ボールの名前を変更し、以下のように設定を変更した
スクリーンショット 2019-06-28 6.30.09.png
多少、ブロックと値が異なるので注意が必要

コードをかく

変更を加えるのはGmeScene.swiftだけ

GameScene.swift

import SpriteKit
import GameplayKit
class GameScene: SKScene , SKPhysicsContactDelegate {
    var entities = [GKEntity]()
    var graphs = [String : GKGraph]()
    var ball:SKSpriteNode!
    var paddle:SKSpriteNode!
    override func didMove(to view: SKView) {
        //withname にはGameScene.sksで作成した名前
        ball   = self.childNode(withName: "ball") as! SKSpriteNode
        paddle = self.childNode(withName: "paddle") as! SKSpriteNode
        //ボールの飛ぶ方向
        ball.physicsBody?.applyImpulse(CGVector(dx: 5, dy: 5))
        //ボールが壁にぶつかった時に跳ねかえる
        let border = SKPhysicsBody(edgeLoopFrom: (view.scene?.frame)!)
        border.friction = 0
        self.physicsBody = border
        //SKPhysicsContactDelegate をクラス参照に入れてないとエラーとなる
        self.physicsWorld.contactDelegate = self
    }
    //パドル
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches
        {
            let toucLocation = touch.location(in: self)
            paddle.position.x = toucLocation.x
        }
    }
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches
        {
            let toucLocation = touch.location(in: self)
            paddle.position.x = toucLocation.x
        }
    }
    //ブロックがボールに当たると消える。
    func didBegin(_ contact : SKPhysicsContact)
    {
        let bodyAName = contact.bodyA.node?.name;
        let bodyBName = contact.bodyB.node?.name;
        if bodyAName == "ball" && bodyBName == "brick" ||
            bodyAName == "brick" && bodyBName == "ball"
        {
            if bodyAName == "brick"
            {
                contact.bodyA.node?.removeFromParent()
            }
            else if bodyBName == "brick"
            {
                contact.bodyB.node?.removeFromParent()
            }
        }
}
}

書き終えたら、上のツールバーから [Product] -> [Run] または command + r で実行すれば簡易的なブロック崩しが動くことが確認できた

シーンごとに分けたい

このままでは始まりと終わりがないので、始まる前の画面とブロックを全て壊した時の画面に推移させたい。そこで、
SpriteKitとSwiftでブレイクアウトゲームを作る方法:パート2
を参考に実装を試みた

数時間後

できなかった...
次こそは完成させたい...
まずは、本やサイトで勉強ですね

20
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
14