首页 > 解决方案 > 如何使用自定义 GKComponent 创建 SKSpriteNode?

问题描述

所以我目前正在使用spriteKitand开发游戏gameplayKit。我创建了一个自定义GKComponent类,我SKSpriteNode通过 Xcode 中的场景检查器(图像)提供给某些特定的类。SKSpritenodes现在,当我想用​​相同的方法重新创建 random时GKComponent,它似乎不起作用,因为我的自定义的覆盖更新方法GKComponent不起作用。有什么线索吗?

我试图给节点一个新的实体对象(因为它返回 nil)并且我给了那个实体我的自定义GKComponent但没有任何工作

// In scene                
let node = SKSpriteNode(texture: "coin", color: UIColor.clear, size: CGSize(width: 60, height: 60))
let entities: GKEntity! = GKEntity()
let component: CollectableComponent = CollectableComponent()
component.itemType = 1

node.anchorPoint = CGPoint(x: 0.5, y: 0.5)
node.zPosition = 6
node.setScale(0.5)
node.size = CGSize(width: 60, height: 60)
node.position = CGPoint(x: 90, y: 90)
entities.addComponent(component)
node.entity = entities
self.scene?.addChild(node)


// GKComponent

class CustomComponent: GKComponent {
    var node: SKSpriteNode?

    @GKInspectable var itemType: Int = 0
    @GKInspectable var isStatic: Bool = false

    override init() {
        super.init()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func update(deltaTime seconds: TimeInterval) {
        if node == nil {
            if let nodeComponent = self.entity?.component(ofType: GKSKNodeComponent.self){
                node = nodeComponent.node as? SKSpriteNode
            }
        }
    }
}

期望的行为:如果nodeComponent变量 inCustomComponent不为零,我想让它运行这样的动画:

node = nodeComponent.node as? SKSpriteNode; node.run(SKAction.moveBy(x: 0, y: 15, duration: 0.3));

但是使用代码,该操作将不会运行

标签: iosswiftsprite-kitgameplay-kit

解决方案


这就是你想要这样做的方式。

请注意,您需要保留实体,因此需要一个全局变量。

此外,当您向 中添加节点时GKSKNodeComponentnode.entity会自动设置变量。

class GameScene : SKScene{
    var entities: [GKEntity] = [GKEntity]()

    func doSomething(){


        let node = SKSpriteNode(texture: "coin", color: UIColor.clear, size: CGSize(width: 60, height: 60))
        node.anchorPoint = CGPoint(x: 0.5, y: 0.5)
node.zPosition = 6
        node.setScale(0.5) //<--- YUCK!!!!!
        node.size = CGSize(width: 60, height: 60)
        node.position = CGPoint(x: 90, y: 90)
        self.scene?.addChild(node)

        let entity = GKEntity()
        let nodeComponent : GKSKNodeComponent = GKSKNodeComponent(node:node)
        let component: CollectableComponent = CollectableComponent()
        component.itemType = 1
        entity.addComponent(nodeComponent)
        entity.addComponent(component)
        entities.append(entity)

    }
}

// GKComponent

class CustomComponent: GKComponent {
    //We want this line to crash if node is empty, so do not use ?
    lazy var node: SKSpriteNode! = {return self.entity!.component(ofType: GKSKNodeComponent.self).node as? SKSpriteNode! }

    @GKInspectable var itemType: Int = 0
    @GKInspectable var isStatic: Bool = false

    override init() {
        super.init()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func update(deltaTime seconds: TimeInterval) {

    }
}

推荐阅读