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

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

##勝ち負けのないブロック崩し
[Swift4(Xcode9)でiPhoneアプリのブロック崩し作成する](http://barus.hatenadiary.jp/entry/2018/01/15/113330)
と言うサイトがあったので参考にして書いてみた

###プロジェクトの作成
Xcodeを用いてプロジェクトを作成した
![スクリーンショット 2019-06-28 5.44.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277131/30a13401-61ec-b36e-0402-b865f08dcc4e.png)
この時、GameplayKitのチェックを入れた
###ブロックの配置
GameScene.sksのファイルを開き、右下にある丸い印を選択する
その中にあるColorSpriteを画面にドラッグ&ドロップする
![スクリーンショット 2019-06-28 5.55.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277131/14e4242a-49fd-096f-18e9-162bedbe2aff.png)
長方形のブロックを、均等高さや幅が均等になるように12個配置した
同じようにしてパドルも1個配置した

![スクリーンショット 2019-06-28 6.02.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277131/d0b71bce-82f5-4e0c-d217-ccd1eaf73e42.png)
###ボールの配置
ボールには![ball.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277131/2aec1be7-6f6d-b5c1-dc78-424bbc4d4030.png)←これを使用した
画像挿入するとき、.xcodeproj拡張子のファイルを開いて、App Iconsの設定を変更
![スクリーンショット 2019-06-28 6.14.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277131/3f51376d-93b5-adcd-3b6a-2fd849175928.png)
そして、Assets.xcassetsに画像をドラッグ&ドロップした
###ブロックとパドルの設定
comandキーを押しながら全部のブロックを選択し、右の設定するところで名前を変更した
また、値などを以下のように変更した
![スクリーンショット 2019-06-28 6.22.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277131/46b0ce8a-8691-f10c-807d-6b5b440678fe.png)
パドルの設定はブロックと同じで名前は区別できるようにした
###ボールの設定
ボールの名前を変更し、以下のように設定を変更した
![スクリーンショット 2019-06-28 6.30.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277131/d432b6cc-e573-e503-9d92-54291bb49001.png)
多少、ブロックと値が異なるので注意が必要
###コードをかく
変更を加えるのはGmeScene.swiftだけ

```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](https://www.raywenderlich.com/1160-how-to-make-a-breakout-game-with-spritekit-and-swift-part-2)
を参考に実装を試みた
##数時間後
できなかった...
次こそは完成させたい...
まずは、本やサイトで勉強ですね