これおもしろい

なにはともあれ1日1記事

App A Week(iOS)をやってみる: 3日目

1週間目: 11/3(金)〜11/9(木)

作ってるもの

STG with クイズ

リポジトリ

GitHub - takattata/spritekit-stg-quiz (晒し忘れてました😅)

状況

所感

アウトプットとインプットのバランスに悩んでます。
どっちも時間掛かるし、やりたいことはいっぱいだし、時間の工夫は難しいですねぇ。
今、移動時間にはPEAKS(ピークス)|堤 修一 吉田 悠一 池田 翔 坂田 晃一 加藤 尋樹 川邉 雄介 岸川 克己 所 友太 永野 哲久 - 第一線の開発者陣による「iOS 11 Programming」執筆プロジェクト!を読んでいます。
ありがたい代物です。読んでて面白い。

あと今日イチでSwiftここ良いよなー!と思ったのが、

private func didCollide(bullet: SKSpriteNode, enemy: SKSpriteNode) {
    print(">>> HIT: " + #function)
}

private func didCollide(myCharacter: SKSpriteNode, enemy: SKSpriteNode) {
    print(">>> HIT: " + #function)
}

こんな感じに、同じ引数の型でも、引数の名前変えるだけで関数を定義できるとこですね!
何度書いてもこれは格好良いなーと思います。

進捗

一応説明しておくと、思いついた内容が、今会社で開発している(宣伝しておこう)

このアプリの画像を使ったものだったので、画像に色塗ったりして問題がないようにしている為、見た目がよく分からない感じになっています。

f:id:takattata:20171105233515g:plain
本来なら、タイトル画面の赤い四角は赤ちゃんがパタパタしていて、ゲーム画面の上部に常駐しているのは赤ちゃんの絵、という想定です。
黒いのが障害物、下のハートが自キャラ、発射してるのが自弾です。(画像がややこしいですね汗)
背景の紫っぽい?四角は障害物の移動範囲を、確認の為に可視化してた名残です。消し忘れました。
それを踏まえた上で進捗を説明すると、

  • 赤ちゃんと自弾の当たり判定をつける + 赤ちゃんのHPが回復する
  • 障害物を出す + 移動範囲をつける(範囲内で跳ね返る)
  • 障害物と自弾の当たり判定をつける
  • 自キャラと障害物の当たり判定をつける + 自キャラ瞬間操作不能, 点滅アニメーション

思ったほど進んでない😱
面白いけど、やっぱり実際に作っていくとなると難しいものだなー。
でもやっぱり作るの楽しいなぁ。

明日には終わらせたい

  • 敵貫通のレーザービーム作る
  • オーバーレイでクイズ画面への遷移作る + メイン画面の時間を止める

詰まったところ

演算子オーバーロード

加減乗除はいいものの、+=(加算代入)に少し手間取りました。
inout使って解決。

Must call a designated initializer of the superclass

オブジェクトクラスにSKSpriteNodeを継承させようとした時に初期化に悩みました。
参考サイトあたりを参照して、convenienceとdesinatedの2種類initializerがあることを知り、実際に継承している方のソース見て事なきを得ましたが。
どれがdesignated initializerなのかの判別はドキュメントでするものなのでしょうか?🤔

画面の左下が(0, 0)ということを忘れる

どうにも左上が(0, 0)のイメージが強くて、うっかり詰まりました...。
敵が出現する範囲決める時にやらかしました。

端末の画面サイズの違い

これはまだ直してないです...😭 ずっと8plusのシミュレータでやってたのですが、ふとSE(自分の端末)で動かしてみたら画面が凄いことになりました笑 たしかにテキトーにsetScaleしてたからなぁ。
画面サイズを考慮しなくて良い開発の仕方を意識しないといけないなぁ。

updateの書き方

どうにも、自キャラの状態更新などに毎フレ更新させる様な処理を書いてしまうのですが、SpriteKitっぽい書き方ではないのだろうなぁと感じます。
あと、フレームでカウントすると、fpsが定まってないから辛い。
こういうパターンの動きがほしい!という定石があるだろうから、掴みたいですね。
人のソース読んでみないと。

書き方が定まらない

これは書いている内に自分の中で固まりそうなので、書いた分だけ迷いもなくなっていきそうだなと思います。
とはいえ、ゲームを作る時とアプリを作る時では書き方違うから、その切り替えに苦戦しそうではありますが。

参考サイト

[Swift] 演算子のオーバーロード | 目くじら日記
SKNode - SpriteKit | Apple Developer Documentation
[Swift] クラスのイニシャライザ3: Designated Initializer と Convenience Initializer - Qiita
Swift倉庫・SKSpriteNodeでCButtonを作ってみました。 - Qiita
アクション|Sprite Kit入門
SpriteKitでNodeを点滅させる - Unnnnnnnn