场景:由于我需要知道我的游戏对象的生命值和得分,我想要扩展SKPhysicsBody以及更多的统计数据。我已经提出了一些相关问题here和here。
问题:我收到此错误"必须调用超类' 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()
时,我没有收到任何错误。但是,如何设置其大小如circleOfRadius
或rectangleOfSize
?通常它应该与super.init(circleOfRadius: <CGFloat>)
一起使用!
答案 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的任何标准初始值设定项。