从 GameScene class 中的节点创建子 class

Creating a sub-class from a node in the GameScene class

我正在尝试从这个节点制作一个 class,以便我可以从中制作各种对象,但 Xcode 一直说 "Expected Declaration"。如何从我的节点创建 class?这是给我错误的代码: P.S。我是 Whosebug 的新手,所以如果我的问题需要更多详细信息,请告诉我,而不是搁置。谢谢!

import SpriteKit
import GameplayKit

class GameScene: SKScene, SKPhysicsContactDelegate  {

    override func didMove(to view: SKView) {

        class nodeClass{
            let platform = SKSpriteNode(color: UIColor.yellow, size: CGSize(width: 400, height: 60))

            platform.xScale = 0.8
            platform.yScale = 0.8
            platform.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: platform.size.width, height: platform.size.width / 6))

            platform.position = CGPoint(x: 150, y: -100)
            platform.physicsBody?.categoryBitMask = 1
            platform.physicsBody?.collisionBitMask = 0
            platform.physicsBody?.isDynamic = false
            platform.physicsBody?.affectedByGravity = false

            self.addChild(platform)
}
}
}

您应该(理想情况下)在函数之外声明和定义您的 class。

由于缺少更好的术语,在包含代码的文件的 'root' 级别。

为了个人的清晰度,大多数人在大多数时候创建一个新文件并使用它来保存他们的声明和所有他们 classes 可以做的定义。这在 Swift 中不是绝对必要的,但对于刚开始的人来说,这是一种有用的清晰度技巧。和我一样。

下一个问题:nodeClass 不是像您写的那样子class 任何东西。这是 'standalone' 类型。由于它在冒号后没有任何内容说明它的子classing,它是一个全新的类型。

在上方,您可以看到 GameSceneSKScene 的子 class,因为它正在执行此操作。在被子classed 之后的任何类型名称是 Protocols GameScene 同意 符合 .

Ad @Confused 刚才说了,你应该避免在方法中声明一个class。

这是一个可能的解决方案

class GameScene: SKScene, SKPhysicsContactDelegate  {

    override func didMove(to view: SKView) {
        let platform = Platform(size: CGSize(width: 400, height: 60))
        platform.xScale = 0.8
        platform.yScale = 0.8
        platform.position = CGPoint(x: 150, y: -100)
        self.addChild(platform)
    }
}

class Platform: SKSpriteNode {

    init(size: CGSize) {
        super.init(texture: nil, color: .yellow, size: size)
        let physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: size.width, height: size.width / 6)) // Are you sure about this??
        physicsBody.categoryBitMask = 1
        physicsBody.collisionBitMask = 0
        physicsBody.isDynamic = false
        physicsBody.affectedByGravity = false
        self.physicsBody = physicsBody
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}