ios - 如何使用自定义 GKComponent 创建 SKSpriteNode?
问题描述
所以我目前正在使用spriteKit
and开发游戏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));
但是使用代码,该操作将不会运行
解决方案
这就是你想要这样做的方式。
请注意,您需要保留实体,因此需要一个全局变量。
此外,当您向 中添加节点时GKSKNodeComponent
,node.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) {
}
}
推荐阅读
- sql - 在 PostgreSQL 中用每个用户的最新值填充缺失的日期
- javascript - IOS(Iphone)上的onbeforeunload问题
- react-native - 在 React-Native 中递归调用一个类
- python - 无法导入包 lib.NextBus
- html - 未应用自定义 CSS Bootstrap
- ios - 试图将库 Objective-C 函数抽象为协议
- java - 如何不同步 Hazelcast 中服务之间的所有地图
- matlab - 并行执行必须读取当前目录中具有固定名称的输入文件的可执行文件?
- firebase - 如何诊断导致移动设备上的站点崩溃的内存泄漏
- java.util.logging - 如何更改 logging.properties 中的 Util.Logging.Logger 打印颜色