我知道我可以在GameScene.swift中使用以下内容来引用我在关卡编辑器中创建的精灵:
ball = childNode(withName: "ball") as? SKSpriteNode
如果我想从Ball类引用那个球怎么办?以下是我认为会起作用的。我错了。在关卡编辑器中,我给球定制了Ball。
1.我在GameScene.sks
创建了一个球精灵,并为其分配了自定义类Ball
:
这是我的自定义Ball
课程。 (你可以忽略这些内容,因为它不起作用。)
class Ball: SKSpriteNode {
init() {
let size = CGSize(width: 35, height: 35)
super.init(texture: nil, color: UIColor.clear, size: size)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func moveBall() {
self.position = CGPoint(x: 50, y:50)
}
}
然后,在GameScene.swift
中,我想使用我定义的Ball
函数moveBall()
。
class GameScene: SKScene {
var ball = Ball()
override func didMove(to view: SKView) {
ball.moveBall()
}
}
答案 0 :(得分:0)
Ball类是sprite-ball对象的蓝图 ..你不希望在球的蓝图里面有一个属性 ..这是像球精灵的开始:)你希望你的功能对自己采取行动
moveUp() { self.position .... }
您的initBall
也只需要成为常规init
。您试图将字面设置为自身,例如let 1 = 1
这基本上是你用猫而不是精灵写的:
class Cat {
var cat: Cat!
initCat() {
cat = Cat()
}
func catMeows() {
print("meow!")
}
}
你想要的是:
class Cat {
func meow() {
print("meow!")
}
}
另外,在你的游戏中,你需要把它当作游戏!球'不是spritenode。你正在引用正确的对象(如果你修复了你的球类),因为不正确的演员而无法访问Ball方法。
答案 1 :(得分:0)
修改
如果要将自定义对象添加到场景编辑器,则需要将以下初始值设定项添加到自定义类中。
class Ball: SKSpriteNode {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func moveBall() {
self.position = CGPoint(x: 50, y:50)
}
}
init()
func仅在您在代码中创建新对象时使用。这实际上是你在阻止 3 中做的事情,这完全违背了关于从场景编辑器引用精灵的问题。
如果需要,可以删除init(),除非您计划在其他时间通过代码添加对象
然后,您需要引用在场景编辑器中添加的对象。在块 3 中,您没有引用该对象,而是在创建一个新对象。
class GameScene: SKScene {
private var ball: Ball
override func didMove(to view: SKView) {
if let ball = childNode(withName: "ball") as? Ball {
self.ball = ball
ball.moveBall()
}
}
原始答案
您还没有向我们展示对象initBall
被调用的任何地方
如果要在场景编辑器中添加,您需要确保子类文件具有正确的初始化程序
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
我所做的是从子类required init
调用一个安装文件,或者如果需要一个变量进行设置,则从代码中调用它
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
func setup() {
ball = childNode(withName: "ball") as? SKSpriteNode
ball.size = CGSize(width: 35, height: 35)
}
或
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func setupWith(variable: SomeVariableType) {
if variable == x {
//setup based on variable
}
else {
//setup based on variable
}
}
...in your Scene...
if let ball = childNode(withName: "ball") as? Ball {
self.ball = ball
ball.setup(variable: someVarHere)
}