如何调用超类 SKPhysicsBody 的指定初始化器?

How to call a designated initializer of the superclass SKPhysicsBody?

场景: 因为我需要知道我的游戏对象的生命值和得分,所以我想用更多的统计数据扩展 SKPhysicsBody。我已经问过一些相关问题 here and

问题: 我收到此错误 "Must call a designated initializer of the superclass 'SKPhysicsBody'"。而且我不知道我做错了什么。我对 SKSpriteNode 做了几乎相同的事情并且 super.init 工作了。但是我遇到的问题是碰撞检测只有 returns physicsBody 而不是 SKSpriteNode.

import Foundation
import SpriteKit

class Bubble: SKPhysicsBody {

    let bubbleSize = ["large": CGFloat(1.0), "medium": CGFloat(0.5), "small": CGFloat(0.25)]

    let playerCategory: UInt32 = 1 << 0
    let worldCategory: UInt32 = 1 << 1
    let bubbleCategory: UInt32 = 1 << 2
    let bulletCategory: UInt32 = 1 << 3

    var hitpoints: Int?
    var score: Int?

    init(bubble: (id: Int, name: String, scale: String, image: String, hitpoints: Int, score: Int)) {
        super.init(circleOfRadius: 50)
        self.hitpoints = bubble.hitpoints
        self.score = bubble.score

        self.dynamic = true
        self.friction = 0.5
        self.restitution = 1
        self.linearDamping = 0
        self.angularDamping = 0
        self.mass = 0.3
        self.categoryBitMask = bubbleCategory
        self.collisionBitMask = worldCategory
        self.contactTestBitMask = worldCategory | playerCategory
    }

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

编辑: 当我使用 super.init() 时,我没有收到任何错误。但是我怎样才能像 circleOfRadiusrectangleOfSize 那样设置它的大小呢?通常它应该与 super.init(circleOfRadius: <CGFloat>)!

一起使用

您尝试调用的初始化程序是从 Objective C 工厂方法的转换派生的:

+ (SKPhysicsBody *)bodyWithCircleOfRadius:(CGFloat)r;

通过命令单击代码中的 class,您可以看到它呈现给 Swift 为:

/*not inherited*/ init(circleOfRadius r: CGFloat)

作为对比,UIView 初始值设定项:

- (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER;

在 Swift 中显示为:

init(frame: CGRect)

没有 /*not inherited*/ 评论。

差异的原因是 SKPhysicsBody 初始化程序的底层工厂方法总是 returns SKPhysicsBody 的具体实例,而 initWithFrame 是返回 instancetype 的实例方法,允许它用于subclass 初始化.

因此,您的子class不能依赖 SKPhysicsBody 的任何标准初始化器。