我正在尝试使用 GameplayKit 来实现使用 SpriteKit 制作的 2D 游戏的所有实体/组件。我创建的第一个组件是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实体,该实体应添加到游戏层次结构中并在每一帧更新。但我认为这个逻辑是有缺陷的,因为这样组件需要有一个变量不仅指向游戏场景,而且指向包含所有实体并定期更新它们的对象。这样,我必须编写扭曲的代码才能发射子弹。我正在寻找一种简洁干净的方式来实现它:有什么建议吗?