SpriteKit で作成された 2D ゲームのすべてのエンティティ/コンポーネントを実装するために GameplayKit を使用しようとしています。私が作成した最初のコンポーネントはSpriteComponentです:
class SpriteComponent:GKComponent
{
let node:SKSpriteNode
init(texture:SKTexture) {
node = SKSpriteNode(texture: texture, color: SKColor.clear, size: texture.size())
super.init()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
これは、シーンに追加する必要があるすべてのコンポーネントで使用されることを意図しています。次に、弾丸を発射するためのコンポーネントを追加したいと思いました。これをFiringComponentと呼びます。箇条書きはグラフィック アイテムであるため、 SpriteComponentを実装するエンティティである可能性があるため、次のコードを記述し ました。
class Bullet:GKEntity
{
var velocity:CGPoint
var node:SKSpriteNode
{
return self.component(ofType: SpriteComponent.self)!.node
}
init(withVelocity velocity:CGPoint)
{
self.velocity = velocity
super.init()
let spriteComponent = SpriteComponent(texture: SKTexture(imageNamed: "Bullet"))
addComponent(spriteComponent)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func update(deltaTime seconds: TimeInterval)
{
self.node.position += self.velocity * CGFloat(seconds)
// I have overridden the CGPoint += and * operators
}
}
次に疑問があります。FiringComponentは弾丸エンティティをシーンに直接追加する必要がありますか? FiringComponentの可能な実装は、ゲーム階層に追加され、各フレームで更新されるBulletエンティティを追加することです。しかし、このロジックには欠陥があると思います。この方法では、ゲーム シーンだけでなく、すべてのエンティティを保持して定期的に更新するオブジェクトを指す変数がコンポーネントに必要になるからです。このように、弾丸を発射するためだけにゆがんだコードを書かなければなりません。私はそれを実装するためのきちんとしたクリーンな方法を探しています:何か提案はありますか?