如何使用 gameplaykit 在编辑器中向精灵添加组件
How to add components to sprites within editor with gameplaykit
我有一个组件:
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)
}
}
所以在我的场景编辑器中,我有一个精灵。在编辑器中,我将其子类化为测试。
我还在场景编辑器中添加了组件测试。
当我 运行 项目时,它 运行 没问题,它会打印 Component 子类中的两个打印语句。
为什么它同时使用两个初始化函数,我如何让它只使用 1 个函数?
我如何在这个组件中添加一些东西,比如动作或其他东西...比如说我想让精灵旋转?我该怎么做?
感谢您的帮助...
1) 我猜你不明白组件是什么,组件和SKSpriteNode
不是一回事,实际上它们是两个完全不同的东西,彼此几乎没有关系。当您使用场景生成器将节点放置在场景中时,它会在幕后自动生成 GKEntity
和 GKSKComponent
的实例。 GKSKComponent
是包含 SKSpriteNode
的组件。您的 Test
组件是一个执行其他操作的组件。一切都是分开的。最好的例子是自行车。车轮是一个组件,链条是一个组件,刹车是一个组件,每个组件都有一个非常独特的用途。您需要创建(初始化)所有这些对象才能获得一辆自行车。
2) 要让其他组件与您的 SKSpriteNode
一起工作,您需要访问该实体。该组件应该可以访问它,因此您只需要执行 self.entity
。然后您需要找到 GKSKComponent
,它将有一个 link 到您要查找的节点,以便您可以对其应用操作。
这是我的class我为了让组件更容易访问节点
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;
}
}
我有一个组件:
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)
}
}
所以在我的场景编辑器中,我有一个精灵。在编辑器中,我将其子类化为测试。
我还在场景编辑器中添加了组件测试。
当我 运行 项目时,它 运行 没问题,它会打印 Component 子类中的两个打印语句。
为什么它同时使用两个初始化函数,我如何让它只使用 1 个函数?
我如何在这个组件中添加一些东西,比如动作或其他东西...比如说我想让精灵旋转?我该怎么做?
感谢您的帮助...
1) 我猜你不明白组件是什么,组件和SKSpriteNode
不是一回事,实际上它们是两个完全不同的东西,彼此几乎没有关系。当您使用场景生成器将节点放置在场景中时,它会在幕后自动生成 GKEntity
和 GKSKComponent
的实例。 GKSKComponent
是包含 SKSpriteNode
的组件。您的 Test
组件是一个执行其他操作的组件。一切都是分开的。最好的例子是自行车。车轮是一个组件,链条是一个组件,刹车是一个组件,每个组件都有一个非常独特的用途。您需要创建(初始化)所有这些对象才能获得一辆自行车。
2) 要让其他组件与您的 SKSpriteNode
一起工作,您需要访问该实体。该组件应该可以访问它,因此您只需要执行 self.entity
。然后您需要找到 GKSKComponent
,它将有一个 link 到您要查找的节点,以便您可以对其应用操作。
这是我的class我为了让组件更容易访问节点
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;
}
}