Swiftで遊ぼう! - 886 - 実力無いけどなんとか取り組んでます
- Swiftで遊ぼう!の前書き-> Life-LOG OtherSide
- 初心者はここから!-> 50オヤジでもできるiOS開発
- 私の本業、オフィシャルなブログ-> Life-LOG
- Swift 3 対応
GameplayKitの勉強で取り組んでいるチュートリアルは、iOS9向けなんで、iOS10の環境で動かないんです。問題部分は自分なりに回避して対応させていってますが、昨日までの話はまだ準備段階です。今日のトピックから、GameplayKitの神髄、「Entity-Component」デザイン・パターンの話題が登場します。GameplayKit with Swift for Beginners — Tower Defense Game — Part 2: Entities, Components and Pathfindingに進みます。
Entittyはゲームで扱うオブジェクトクラスで、共通機能をComponentとして作ります。プロトコールのように使い回しができるクラスを用意するんです。このゲームで必要なタワー(やぐら)と敵キャラはどちらも、画面に表示する機能を持つので、この「画面に表示」という機能を持ったクラスを作ります。
メニューから「File -> New -> File...」を選び、「Cocoa Touch Class」を選択して、「Subclass of:」を「GKComponent」に変更します。名前を「VisualComponent」にしてプロジェクト内に保存します。
ファイルがオープンされたら、class宣言の前にエラーが表示されていると思います。GKComponentクラスを継承したクラスなのに、imoprtしたフレームワークはUIKitしか組み込まれていないからです。GKComponentクラスはGameplayKitフレームワークに存在するため、「import GameplayKit」と「import SpriteKit」に変更します。
そして、コードを次のようにします。
import GameplayKit import SpriteKit class VisualComponent: GKComponent { var scene: GameScene! var sprite: SKSpriteNode! var coordinate: int2! init(scene: GameScene, sprite: SKSpriteNode, coordinate: int2) { self.scene = scene self.sprite = sprite self.coordinate = coordinate super.init() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } }
このVisualComponentは、画面に表示する機能だけを持ったクラスです。GKComponentクラスを継承していますが、GKComponentには何も機能が備わっていません。「描画」という機能をさせるために、sceneインスタンス(画面)とspriteインスタンス(表示させるオブジェクト)、そして、画面上の位置情報となるcordinateクラスを持つだけです。
ここで「int2」型は、GameplayKitで使われている座標系で、「vector_int2」と書いてもいいようです。「(Int32, Int32)」の組み合わせで座標情報を保持します。
プロパティ宣言をした場合、必ずイニシャライザを書かなければなりません*1。指定イニシャライザが1つ必要になります。まず、独自のプロパティを初期化してから、スーパークラスの指定イニシャライザも呼ぶ必要があります。ということで、「super.init()」が必要になります。
そして、 「required init?(coder aDecoder: NSCoder)」もストーリーボードを利用している限り必ず必要になりますが、VisualComponentはストリーボードで作成していないので、Xcodeに指定されるまま、何も書かずに放置します。
これでVisulaComponentクラスの用意ができました。
これだけです。
*1:クラスを利用するために知らなければならない基本事項の1つはイニシャライザの理解です -> Swiftで遊ぼう! - 407 - Initializer イニシャライザ - Swiftで遊ぼう! on Hatena