【问题标题】:Custom Class Sprite kit自定义类 Sprite 套件
【发布时间】:2017-03-01 04:38:21
【问题描述】:

我正在尝试给我的主角一个自定义类,以便我可以在定义的类中定义他的所有行为。

我已经通过使用协议做了类似的事情:

protocol CustomNodeEvents{
    func didMoveToScene()
}

此协议位于课程开始之前的 GameScene 文件中。 然后我在 GameScene 类中这样调用函数:

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 文件中,我已经将该类附加到播放器)。

我的问题是如何让它发挥作用? 第二个问题是,这是定义自定义类并将其与其他类“连接”的最佳方式吗?

编辑:


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

【问题讨论】:

  • 嗯,你是不是把协议打错了?你有CustomNodeEvents(),它上面应该有()吗?
  • 另外,在我看来,播放器可能是 SKSpriteNode,而不是自定义,因此在您的“如果让”中,您遇到了失败的情况,跳过了 didMoveToScene
  • 我会仔细检查 SKS 文件以确保播放器的自定义类定义为自定义,然后执行player = self.childNode(withName: "//player") as! Custom。如果这失败了,那么我们就知道问题出在哪里了
  • @Knight0fDragon 只是我打错了,已编辑!正如我所说,它运行没有任何错误。我还考虑了第二条评论,我正在试图弄清楚缺少什么,因为它在更新之前就起作用了(至少这个过程起作用了,不一定是我写的例子)
  • 当您按照自己的方式编写条件代码时,请尝试评估您对它的需求。如果你需要保证一个玩家必须存在,那么打开可选的或者提供一个“else”条件。如果没有安全防护就让 if 那样做只会让调试变得很痛苦,并且在生产时会产生不良结果。您最不希望的事情是让您的客户崩溃,而他们无法解释它是如何崩溃的。

标签: swift xcode class sprite-kit swift3


【解决方案1】:

似乎您将player 转换为SpriteNode,然后尝试将其向上转换为CustomNodeEvents 协议。假设您的 sprite 自定义类如您所说在 .sks 文件中设置,SpriteKit 应该创建您的自定义类的实例,因此您可以这样做:

if let customNode = self.childNode(withName: "//player") as! Custom {
   customNode.didMoveToScene()
}

【讨论】:

  • 嗯我想我理解了,其实我一开始就声明了播放器为:
  • var player: SKSpriteNode!
  • @jlyonsmith,尽管您违反了协议逻辑。如果玩家不再是自定义,而是其他类怎么办?
  • (对多个 cmets 感到抱歉)关键是我想在最后的 Custom 类中创建一个 update 函数。而且每次都这样搜索玩家会花费很多!
【解决方案2】:

不确定问题出在哪里,但这段代码对我有用:

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文件有问题,我们抓取的玩家不是你要找的玩家,或者玩家不是Custom类的。 (注意我将玩家精灵放置在场景的最顶层)

【讨论】:

  • 谢谢你的回答,我真的很困惑,可能是xcode的更新没有给我打印字符串,因为它运行没有错误但什么也没打印
  • 一切都按预期打印和工作,创建一个新项目,用我的代码替换游戏场景,转到 sks 文件,转到右下角的媒体库选项卡,拖入宇宙飞船,命名精灵,给它自定义类,保存场景,然后运行。你会看到它的工作原理
  • 成功了,非常感谢!但这很奇怪,因为问题似乎是使用color sprite 而不是图像。我刚刚注意到它说“错误创建节点”,但是当我选择颜色精灵时,我仍然可以访问播放器并更改它的位置。可能是什么问题?
  • 这意味着你没有得到一个自定义类,你得到一个精灵节点
  • 这让我觉得这是 xcode 的一个错误,当我给一个彩色精灵一个自定义类时它不会保存
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多