我有一个组件:
class Test: GKComponent {
override init() {
super.init()
print("init ran")
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
print("coder init ran")
}
}
我也有一个子类:
class Testing: SKSpriteNode {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
所以在我的场景编辑器中,我有一个精灵。在编辑器中,我将其子类化为Testing。
同样在场景编辑器中,我添加了组件Test。
当我运行项目时,它运行正常,并在Component子类中打印两个print语句。
为什么它同时使用两个init函数?如何才能使用它?
如何在动作或其他内容中添加此组件中的某些内容...例如,我想让精灵旋转?我该怎么做?
感谢您的帮助......
答案 0 :(得分:1)
1)我猜你不明白组件是什么,组件与SKSpriteNode
不同,实际上它们是完全不同的2个,彼此几乎没有任何关系。使用场景构建器在场景上放置节点时,在幕后它会自动生成GKEntity
和GKSKComponent
的实例。 GKSKComponent
是包含SKSpriteNode
的组件。您的Test
组件是执行其他操作的组件。一切都是分开的。最好的例子,想想一辆自行车。车轮是一个组件,链条是一个组件,制动器是一个组件,每个都有一个非常独特的用途。您需要创建(init)所有这些对象才能获得自行车。
2)要让其他组件与SKSpriteNode
一起使用,您需要访问该实体。组件应该可以访问它,因此您只需要self.entity
。然后,您需要找到GKSKComponent
,它将包含指向您要查找的节点的链接,以便您可以对其应用操作。
以下是我的课程,以便让Components更容易访问节点
import GameplayKit
class NodeComponent : GKComponent
{
public private(set) lazy var node : SKNode = self.entity!.component(ofType: GKSKNodeComponent.self)!.node
func resetNode(to node:SKNode)
{
self.node = node;
}
}