Swift 定制类精灵套件
我试图给我的主角一个自定义类,这样我就可以在定义的类中定义他的所有行为 我已经通过使用协议做了类似的事情:Swift 定制类精灵套件,swift,xcode,class,sprite-kit,swift3,Swift,Xcode,Class,Sprite Kit,Swift3,我试图给我的主角一个自定义类,这样我就可以在定义的类中定义他的所有行为 我已经通过使用协议做了类似的事情: protocol CustomNodeEvents{ func didMoveToScene() } 在类开始之前,此协议在游戏场景文件中。 然后在GameSecene类中调用如下函数: override func didMove(to view: SKView) { if let customnode = player as? CustomNodeEvents{
protocol CustomNodeEvents{
func didMoveToScene()
}
在类开始之前,此协议在游戏场景文件中。
然后在GameSecene类中调用如下函数:
override func didMove(to view: SKView) {
if let customnode = player as? CustomNodeEvents{
customnode.didMoveToScene()
}
}
其中,玩家定义为:
player = self.childNode(withName: "//player") as! SKSpriteNode
也在didMove(to view:SKView)函数中
现在,我创建了另一个文件(我的自定义类文件),并编写:
import SpriteKit
class Custom: SKSpriteNode, CustomNodeEvents{
func didMoveToScene() {
print("It Worked")
}
}
我没有任何错误,但它实际上没有在我的自定义类中运行代码块(在GameScene.sks文件中,我已经将该类附加到播放器)
我的问题是我怎样才能让它工作?
第二个问题是,这是定义自定义类并将其与其他类“连接”的最佳方法吗
编辑:
似乎您正在将
player
转换为SpriteNode
,然后尝试将其升级为CustomNodeEvents
协议。假设您的sprite自定义类如您所说设置在.sks
文件中,SpriteKit应该创建自定义类的实例,以便您可以执行以下操作:
if let customNode = self.childNode(withName: "//player") as! Custom {
customNode.didMoveToScene()
}
不确定问题出在哪里,但此代码对我有效:
import SpriteKit
protocol CustomNodeEvents
{
func didMoveToScene()
}
class Custom : SKSpriteNode,CustomNodeEvents
{
func didMoveToScene()
{
print("It Worked")
}
}
class GameScene:SKScene{
var player : SKSpriteNode!
override func didMove(to view: SKView) {
player = self.childNode(withName: "//player") as! SKSpriteNode
if let customnode = player as? CustomNodeEvents
{
customnode.didMoveToScene()
}
else
{
print("Error creating node")
}
}
}
我只能得出结论,在sks文件中有一个问题,我们正在抓取的玩家不是您正在寻找的玩家,或者该玩家不是定制的。(注意,我把玩家精灵放在了场景的最顶层)hmm,你是否输入了协议?你有CustomNodeEvents(),它应该有()吗?另外,在我看来,播放器可能是一个SKSpritEndode,而不是一个Custom,所以在“if let”中,你得到了一个失败的条件,跳过didMoveToSceneI会仔细检查SKS文件,以确保播放器有定义为Custom的自定义类,然后执行
player=self.childNode(名称://player)为!Custom
。如果此操作失败,则我们知道问题出在哪里is@Knight0fDragon我只是打字,编辑!正如我所说,它运行时没有任何错误。我还考虑了第二条评论,我正在试图找出缺失的内容,因为它在更新之前就起作用了(至少这个过程起作用了,不一定是我写的例子)当你以你现在的方式编写条件代码时,试着评估一下你的需求。如果你需要保证玩家必须存在,那么打开可选的或者提供一个“else”条件。如果像这样让if没有安全防护只会让调试变得很痛苦,并且在生产时会产生不希望的结果。你最不希望的是它对你的客户造成破坏,而他们无法解释它是如何破坏的。嗯,我想我理解了,事实上,我在一开始就将播放器声明为:var player:SKSpriteNode!@jlyonsmith,但您违反了协议逻辑。如果播放机不再是自定义的,而是其他类的,该怎么办?(很抱歉有这么多评论)关键是,我想在最后在自定义类中创建一个update
函数。每次搜索播放器都要花费很多钱!谢谢你的回答,我真的很困惑,可能是xcode的更新没有打印字符串,因为它运行时没有错误,但什么都没有打印出来s和我的预期工作,创建一个新项目,用我的代码替换游戏场景,转到sks文件,转到右下角的媒体库选项卡,拖入一艘宇宙飞船,命名精灵,给它自定义类,保存场景,然后运行。你会看到它工作它工作了,非常感谢!但这很奇怪,因为问题似乎是u唱一个彩色精灵
而不是图像。我刚刚注意到它说“创建节点时出错”,但当我选择一个彩色精灵时,我仍然可以访问播放器并改变它的位置。这可能是什么问题?这意味着你没有得到一个自定义类,你得到的是一个精灵节点。这让我觉得这是xcode的一个bug,当我给彩色精灵一个自定义类时,它不会保存
import SpriteKit
protocol CustomNodeEvents
{
func didMoveToScene()
}
class Custom : SKSpriteNode,CustomNodeEvents
{
func didMoveToScene()
{
print("It Worked")
}
}
class GameScene:SKScene{
var player : SKSpriteNode!
override func didMove(to view: SKView) {
player = self.childNode(withName: "//player") as! SKSpriteNode
if let customnode = player as? CustomNodeEvents
{
customnode.didMoveToScene()
}
else
{
print("Error creating node")
}
}
}