如何使用gameplaykit

时间:2017-09-24 14:45:51

标签: ios swift sprite-kit components gameplay-kit

我有一个组件:

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语句。

  1. 为什么它同时使用两个init函数?如何才能使用它?

  2. 如何在动作或其他内容中添加此组件中的某些内容...例如,我想让精灵旋转?我该怎么做?

  3. 感谢您的帮助......

1 个答案:

答案 0 :(得分:1)

1)我猜你不明白组件是什么,组件与SKSpriteNode不同,实际上它们是完全不同的2个,彼此几乎没有任何关系。使用场景构建器在场景上放置节点时,在幕后它会自动生成GKEntityGKSKComponent的实例。 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;
    }

}