Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 定制类精灵套件_Swift_Xcode_Class_Sprite Kit_Swift3 - Fatal编程技术网

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")
        }
    }

}