SpriteKit - 在Gamescene.sks中创建精灵并在另一个类中创建

时间:2017-07-20 19:54:54

标签: ios swift sprite-kit

我知道我可以在GameScene.swift中使用以下内容来引用我在关卡编辑器中创建的精灵:

ball = childNode(withName: "ball") as? SKSpriteNode

如果我想从Ball类引用那个球怎么办?以下是我认为会起作用的。我错了。在关卡编辑器中,我给球定制了Ball。


1.我在GameScene.sks创建了一个球精灵,并为其分配了自定义类Ball

sprite in GameScene.sks

  1. 这是我的自定义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)
      }
    }
    
  2. 然后,在GameScene.swift中,我想使用我定义的Ball函数moveBall()

    class GameScene: SKScene {
      var ball = Ball()
      override func didMove(to view: SKView) {
        ball.moveBall()
      }  
    }
    

2 个答案:

答案 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)  
}