Wie kann man addChild() in einer anderen Klasse als in GameScene benutzen?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Macoun 2019 - Frühbucherrabatt bis 26.7.2019

  • Wie kann man addChild() in einer anderen Klasse als in GameScene benutzen?

    Hallo,

    seit Längerem versuche ich Nodes in einer anderen Klasse als in der GameScene hinzuzufügen:

    Quellcode

    1. var gameScene2 : GameScene!

    Quellcode

    1. func animateDeck() {
    2. let chip = SKSpriteNode(imageNamed: "Chip")
    3. chip.position = CGPoint(x: 200, y: 300)
    4. chip.zPosition = 2
    5. chip.setScale(1)
    6. gameScene2.addChild(chip)
    7. }
    Es wird folgende Fehlermeldung ausgegeben:

    Quellcode

    1. Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

    Kennt jemand eine Möglichkeit, wie man auch außerhalb der GameScene Nodes erstellen kann?

    Danke im Voraus ^^
  • Mac & i Test Abo
  • Meinst du als GameScene Objekt let chip = SKSpriteNode(imageNamed: „Chip“) oder var gameScene2 : GameScene?

    Beide Deklarationen findet man in derselben Klasse „Battlefield“ vor und somit nicht in GameScene.swift.

    Die Funktion animateDeck() befindet sich ebenfalls in der Klasse „Battlefield“. Es gibt ein Button, der auf dem ViewController dieser Klasse liegt (im Main.storyboard), der die Funktion aufruft. Dieser Button ist ebenfalls in der Klasse „Battlefield“ initialisiert.

    Auf folgende Antworten werde ich nun versuchen schneller zu reagieren :)
  • gameScene2 = GameScene() habe ich nirgends stehen. Ich dachte, dass var gameScene2 : GameScene ausreicht. Ich habe es gerade versucht an verschiedenen Stellen einzufügen, jedoch gibt das immer eine Fehlermeldung wie Expected declaration.

    PS: Wie kann ich hier antworten, ohne dass eine weitere Thread Zeile entsteht? Bin hier (noch ;) ) recht neu, jedoch gefällt mir dieses Forum immer mehr und mehr, da man hier auch Antworten auf seine Frage bekommt :)
  • Es hat keinen Fehler gegeben und der Code lässt sich ausführen. Jedoch wird die Node nicht angezeigt.
    Kann sein, dass hier ein kleiner Fehler vorliegt, den ich übersehen habe? ?(

    Quellcode

    1. class Battlefield: UIViewController {
    2. var gameScene2 = GameScene()
    3. @IBOutlet var startGameButton: UIButton!
    4. override func viewDidLoad() {
    5. super.viewDidLoad()
    6. let scene2 = GameScene(size: CGSize(width: 1536, height: 2048))
    7. //Configure the view
    8. let skView2 = self.view as! SKView
    9. skView2.showsFPS = true
    10. skView2.showsNodeCount = true
    11. skView2.ignoresSiblingOrder = true
    12. // scene.scaleMode = .aspectFit
    13. skView2.presentScene(scene2)
    14. // skView2.presentScene(gameScene)
    15. }
    16. @IBAction func startGame(_ sender: Any) {
    17. print("the game starts...")
    18. startGameButton.isHidden = true
    19. animateDeck()
    20. }
    21. func animateDeck() {
    22. let chip = SKSpriteNode(imageNamed: "Chip")
    23. chip.position = CGPoint(x: 300, y: 400)
    24. chip.zPosition = 2
    25. chip.setScale(1)
    26. gameScene2.addChild(chip)
    27. print("test")
    28. }
    Alles anzeigen
    Es wird auch "test" ausgegeben, sodass die Funktion animateDeck() auch vollständig ausgeführt wurde.
  • Du hast ja doch ein GameScene Objekt

    Quellcode

    1. let scene2 = GameScene(size: CGSize(width: 1536, height: 2048))

    Diese musst Du natürlich in animateDeck() verwenden. ;)

    Versuche es mal so:

    C-Quellcode

    1. class Battlefield: UIViewController {
    2. var gameScene2 : GameScene
    3. @IBOutlet var startGameButton: UIButton!
    4. override func viewDidLoad() {
    5. super.viewDidLoad()
    6. gameScene2 = GameScene(size: CGSize(width: 1536, height: 2048))
    7. //Configure the view
    8. let skView2 = self.view as! SKView
    9. skView2.showsFPS = true
    10. skView2.showsNodeCount = true
    11. skView2.ignoresSiblingOrder = true
    12. // scene.scaleMode = .aspectFit
    13. skView2.presentScene(gameScene2)
    14. // skView2.presentScene(gameScene)
    15. }
    16. @IBAction func startGame(_ sender: Any) {
    17. print("the game starts...")
    18. startGameButton.isHidden = true
    19. animateDeck()
    20. }
    21. func animateDeck() {
    22. let chip = SKSpriteNode(imageNamed: "Chip")
    23. chip.position = CGPoint(x: 300, y: 400)
    24. chip.zPosition = 2
    25. chip.setScale(1)
    26. gameScene2.addChild(chip)
    27. print("test")
    28. }
    Alles anzeigen
  • TimKrs schrieb:


    Ich dachte, dass var gameScene2 : GameScene ausreicht. Ich habe es gerade versucht an verschiedenen Stellen einzufügen, jedoch gibt das immer eine Fehlermeldung

    Nein, das ist nur eine Deklarierung, ein Versprechen, daß unter diesem Namen später mal ein Wert vorliegen wird. Wenn diesem Namen, also dieser Variable aber niemals ein Wert zugewiesen wird, dann… Bäng!

    Mit dem ! in var gameScene2 : GameScene! machst Du es übrigens noch viel schlimmer. Du sagst damit: "Lieber Compiler, ich weiß besser als Du, daß immer, wenn ich darauf zugreifen werde, ein Wert vorliegt." Was offensichtlich nicht so stimmt.^^

    Geh noch mal einen kleinen Schritt zurück. Probiere noch mal kleine Testsachen. Anstatt gleich große fette GUI-APIs anzufassen. Daran kann man viel lernen.

    Ich hatte übrigens ein ähnliches Grundlagenverständnisproblem als ich überhaupt als Lernender vor ca. 20 Jahren von Java nach Obj-C kam. Das mit den Pointern crashte einfach alles nur immer und selbst dann, wenn ich gar nicht wußte, daß da Pointer waren… :)
    Das hier ist eine Grundlagensache, die Du versuchen solltest zu reduzieren, auszuprobieren und zu verstehen. Mit 'GameScene' hat das nichts zu tun…
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • Der Code hat funktioniert. Deswegen möchte ich mich an dieser Stelle für deine/eure Antworten einfach mal bedanken :)

    Nur bleibt das Problem, dass das Bild des Nodes stark verzerrt ist. Dem wende ich mich aber jetzt mal zu und hoffe eine Lösung zu finden.

    Bis zum nächsten Thread ;)

    Zu torquato:
    Das ist ein nett gemeinter Tipp, jedoch habe ich mich schon vielen dieser kleinen Projekte wie einen Primzahlberechner oder einen Programm, welches Nullstellen berechnet oder Ähnlichen zugewendet. Daher dachte ich, dass es nun an der Zeit wäre, ein kleines Spiel zu entwickeln. Auch den simple Fehler kannte ich bereits bzw. wusste, was dies zu bedeuten hat. Umso mehr wundere ich mich, wie ich solch etwas nur übersehen konnte.