如何调用超类SKPhysicsBody的指定初始值设定项?

时间:2015-08-05 21:08:52

标签: swift initialization skphysicsbody extending

场景:由于我需要知道我的游戏对象的生命值和得分,我想要扩展SKPhysicsBody以及更多的统计数据。我已经提出了一些相关问题herehere

问题:我收到此错误"必须调用超类' SKPhysicsBody'" 的指定初始值设定项。我不知道我做错了什么。我对SKSpriteNode和super.init的工作几乎一样。但是我遇到的问题是碰撞检测只返回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>)一起使用!

1 个答案:

答案 0 :(得分:2)

您尝试调用的初始化程序源自Objective C工厂方法的转换:

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

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

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

相比之下,UIView初始化器:

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

在Swift中被视为:

init(frame: CGRect)

没有/*not inherited*/评论。

区别的原因是SKPhysicsBody初始化程序底层的工厂方法总是返回SKPhysicsBody的具体实例,而initWithFrame是返回instancetype的实例方法,允许它在子类初始化中使用。

因此,您的子类不能依赖SKPhysicsBody的任何标准初始值设定项。