Swiftrisで学んでみる(1)


ゲーム「テトリス」を作成することで`Swift`を学ぼう、というのがこちらのサイト。

> [Learn Swift Build Your First iOS Game](https://www.bloc.io/swiftris-build-your-first-ios-game-with-swift)

無目的に文法だけ学ぶというのも虚しいなあと思っていたので、ちょうど良いサイトに巡り会えた。

記録がてら、ひと記事書いて行こうかと思う。
なお、当方はiOS Application作成経験は皆無のため、本当に初歩的なところから四苦八苦して行く模様。

※環境はXcode6-Beta5

## 1. メールアドレスを入力する

まずはメールアドレスの入力が必要らしい。
とはいえ、なんの目的で集めるのかは気になるところ。
一応、サイト下部にあるプライバシーポリシーを見てみる。

> 1. How We Collect and Use Information
2. Sharing of Your Information
3. How We Protect Your Information
4. Your Choices About Your Information
5. Links to Other Websites and Services
6. Changes to Our Privacy Policy
7. How to Contact Us

翻訳については各人でお願いしたい。
文責は一切持たないのであしからず。

重要そうなところだけ超意訳（google翻訳して抜粋しただけ）すると、

1. メールアドレスをキーにして個人情報を収集するよ、第三者機関とかも使っちゃうから、FaceBookばりのクッキーで追っかけっから。

2. 第三者にもプライバシーポリシーは守らせるし、法令に準拠した個人情報保護をお約束しますよ。

ってところだろうか。
訳には自信ないし、とりあえず、捨てアカかエイリアスで切り抜ける事にしよう。

## 2. 新しいプロジェクトを作成する

空欄にメールアドレスを入力して「Learn more」ボタンを押下すると、次の画面へ遷移する。

最初にすべき事として、Xcodeでプロジェクトを作成せよ、とのこと。

新規プロジェクトの作成画面で、まずはテンプレートの選択を行う。
`iOS`の`Application`の`Game`を選んでNextボタンをポチっと。
サイトの説明に従って`options`を埋めていこう。

……デベロッパー登録していないせいか、それとも`Apple ID`と違うメールアドレスの所為か、なんか文句言われてんな。

リポジトリからソースをダウンロード出来ないだけ、だと良いんだが。

……`⌘ + R`でデフォルトゲームが走らん……。

```
The operation couldn’t be completed. (IDEPseudoTerminalDomain error 1.)
```

google先生、google先生！！

えー、Xcode再起動したらいいんじゃない、って言われました。

はい、`iOS Simmulator`起動しましたー。
google先生、ありがとうございました。

これで、"2. Creating a New Game Project"はおしまい。

## 3. 不要なものを削除したり必要なものをDLしたり

まあ、テンプレで用意したものから不要なものを削除して目的に近付けて行くのは常套手段ですね。

### 3-1. 不要ファイルの削除

* `GameScene.sks`を削除
* `Images.xcassets` > `Spaceship`を削除

`sks`ファイルというのは、プロジェクト作成の際に選んだ`SpriteKit`に関連するファイル。
`SpriteKit`というのは、iOS・Mac OS X用2Dゲーム開発フレームワークらしい。
ま、削除しちゃうんですけどね。

`Images.xcassets`ってのは画面の管理ツール？らしいですよ。

### 3-2. 不要コードの削除

ソースコードから不要な部分を削除しよう。
背景が赤く塗られている部分は要らないから削除してね、って書いてあるみたいだけど、正直赤くない。

### 3-3. 絵とか音とかダウンロードしよっ？

ダイエットが終わったら、今度はテトリスに必要な画像や音楽等のリソースをダウンロードしよう。

……どこから？
URLは？
リンクは？

ありました。
"Download the necessary assets"という赤文字部分をクリックすると、ダウンロード出来ます。
……てか、英語サイトってこういうの多いですよね。
わっかんねーっつーの。

### 3-4. プロジェクトに追加

ダウンロードしたら解凍します。
中身はこんなカンジ。

```
Blocs
├── Images
│   ├── background.png
│   ├── background@2x.png
│   ├── gameboard.png
│   ├── gameboard@2x.png
│   ├── whitebg.png
│   └── whitebg@2x.png
├── Sounds
├── Sprites.atlas
├── icon-29pt.png
├── icon-40pt.png
└── icon-60pt.png
```

解凍したら下記対象に対し、以下の操作を行います。

* `Sounds`フォルダ
* `Sprites.atlas`フォルダ
* `Imagesの中身`

1. `Supporting Files`フォルダにドラッグ＆ドロップ
2. `Choose options for adding these files`ウインドウの`Destination:Copy items if needed`をチェック
3. `Finish`ボタンを押下

ちょいと解説をば。
`Supporting Files`フォルダはXcodeの左ペイン？のプロジェクトナビゲーターにあります。

`Images`フォルダについては、フォルダ内に入って、全ての画像ファイルを選択して`Supporting Files`フォルダにドラッグ＆ドロップです。

最後に、ナビゲーターから`Images.xcassets`を選択して、`AppIcon`をクリックします。

解凍したフォルダ`Blocs`直下の、29pt、40pt、60ptのアイコンを`AppIcon`の空欄にドラッグ&ドロップします。

### 3-5. 追加したリソースを活かす

まずは`GameScene.swift`を編集します。
このクラスは`Swiftris`の画面描画の全てと、音楽の再生、時間の経過を担うらしい。
奥さん、テトリスのブロックは英語で`tetrominos`って言うんだそうですわよ？

```swift:GameScene.swift
        required init(coder aDecoder: NSCoder!) {
            fatalError("NSCoder not supported")
        }
        override init(size: CGSize) {
            super.init(size: size)
            
            anchorPoint = CGPoint(x: 0, y: 0)
            
            let background = SKSpriteNode(imageNamed: "background")
            background.position = CGPoint(x: 0, y: 0)
            background.anchorPoint = CGPoint(x: 0, y: 1.0)
            addChild(background)
        }
```

ちょっと奥さん、init()でエラー出てますわよ？

```
GameScene.swift:15:22: Initializers may only be declared within a type
```
```
GameScene.swift:18:22: Initializers may only be declared within a type
```

うーん、調査したいけど、時間ないから今日はここまで。

->解決した。
　間違えて`update()`の中に追加用のコード書いてた。
　正しくは`update()`と並列に書くのが正しい。
　これによりエラーは解消された。

それから、Xcode6 Beta7にアップデートした。
すると、下記の部分でワーニングが出た。

```swift:GameScene.swift
        required init(coder aDecoder: NSCoder!) {
            fatalError("NSCoder not supported")
        }
```
```
GameScene.swift:15:25: Overriding initializer parameter of type 'NSCoder' with implicitly unwrapped optional type 'NSCoder!'
```

行数表示の横の三角マークをクリックするとIssueが表示され、

```
Fix-it Remove'!' to make tha parameter required
```
```
Fix-it Add parenthese to silence this warning
```

下の方を選んでこうなった。

```swift:GameScene.swift
        required init(coder aDecoder: (NSCoder!)) {
            fatalError("NSCoder not supported")
        }
```