如何调用超类 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()
时,我没有收到任何错误。但是我怎样才能像 circleOfRadius
或 rectangleOfSize
那样设置它的大小呢?通常它应该与 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 的任何标准初始化器。
场景: 因为我需要知道我的游戏对象的生命值和得分,所以我想用更多的统计数据扩展 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()
时,我没有收到任何错误。但是我怎样才能像 circleOfRadius
或 rectangleOfSize
那样设置它的大小呢?通常它应该与 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 的任何标准初始化器。