Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 886 - 実力無いけどなんとか取り組んでます

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