从GameScene类中的节点创建子类

时间:2017-01-28 17:46:00

标签: swift class sprite-kit subclassing

我试图从这个节点创建一个类,所以我可以从中创建各种对象,但Xcode一直在说"预期声明"。如何从我的节点创建课程?这是给我一个错误的代码: 附:我是StackOverflow的新手,所以如果我的问题需要更多细节,请告诉我,而不是暂停。谢谢!

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

2 个答案:

答案 0 :(得分:3)

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

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

为了个人清晰,大多数人在大多数情况下创建一个新文件并使用它来保存他们所有类的声明和定义。这在Swift中并不是必需的,但是当你开始使用它时,它是一种有用的清晰度技术。像我一样。

下一个问题:nodeClass不是你编写它的方式,继承任何东西。它是一个独立的'类型。由于它在冒号后面没有任何内容,说明它的子类化,它是一种全新的类型。

在上面,您可以看到GameSceneSKScene的子类,因为它正在执行此操作。在子类之后的任何类型名称协议 GameScene同意符合

答案 1 :(得分:2)

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

这是一个可能的解决方案

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