Как это исправить: вызов узла по имени (генерируется func) не будет работать - PullRequest
0 голосов
/ 09 июня 2019

В настоящее время я работаю над своей первой тестовой игрой, в которой игрок должен перепрыгнуть через несколько случайно сгенерированных баров. Я написал функцию, которая должна генерировать столбики вне моей сцены. В настоящий момент моя проблема заключается в том, что когда я пытаюсь вызвать созданные бары с помощью «self.childNode (withName :)», xCode сообщает мне «Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения».

Я уже прочитал документацию Apple для "childNode (withName :)" и добавил "//" перед именем узла. Кроме того, я использовал поиск по стеку, но не смог найти ничего, что решило бы мою проблему.

//
//  GameScene.swift
//  PlaxerJump
//
//

import SpriteKit
import AVFoundation

class GameScene: SKScene {

    let bottom1 = SKSpriteNode(imageNamed: "Bottom")
    let bottom2 = SKSpriteNode(imageNamed: "Bottom")
    let player = SKSpriteNode(imageNamed: "Player")

    var velocity = CGFloat(0)
    var onGround = true

    var value = CGFloat(5)

    override func didMove(to view: SKView) {

        // Hintergrund
        self.backgroundColor = SKColor.lightGray
        bottom1.anchorPoint = CGPoint.zero
        bottom1.position = CGPoint.zero
        bottom1.zPosition = 1
        self.addChild(bottom1)

        bottom2.anchorPoint = CGPoint.zero
        bottom2.position = CGPoint(x: bottom1.size.width - 1, y: 0)
        bottom2.zPosition = 1
        self.addChild(bottom2)

        // Spieler
        player.position = CGPoint(x: player.size.width / 2 + 20, y: bottom1.size.height + player.size.height / 2)
        player.zPosition = 2
        self.addChild(player)

        //Balken
        addBalken(xScale: 1.5, yScale: 1, name: "ba1", xPoint: 0)


    }


    func addBalken(xScale: CGFloat, yScale: CGFloat, name: String, xPoint: CGFloat) {
        let balken = SKSpriteNode(imageNamed: "Balken")
        balken.anchorPoint = CGPoint.zero
        balken.position = CGPoint(x: self.size.width + (2 * balken.size.width) + xPoint, y: bottom1.size.height - 16)
        balken.zPosition = 1
        balken.xScale = xScale
        balken.yScale = yScale
        balken.name = name
    addChild(balken)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if onGround == true {
            velocity = -16
            onGround = false
            self.run(SKAction.playSoundFileNamed("Jump.wav", waitForCompletion: false))
        }

    }



    override func update(_ currentTime: TimeInterval) {
        //Player
        player.zRotation -= CGFloat(Double.pi * 5) / 180

        velocity += 0.6
        player.position.y -= velocity


        if player.position.y <= bottom1.size.height {
            player.position.y = bottom1.size.height
            velocity = 0
            onGround = true
        }

       //Bottom
        bottom1.position.x -= 4
        bottom2.position.x -= 4
        if bottom1.position.x < -bottom1.size.width {
            bottom1.position.x = bottom2.position.x + bottom2.size.width
        } else if bottom2.position.x < -bottom2.size.width {
           bottom2.position.x = bottom1.position.x + bottom1.size.width
        }

        //Balken - ** THIS IS THE PART WHERE THE ERROR OCCURS **
        let balke1 = self.childNode(withName: "//ba1") as! SKSpriteNode
        balke1.position.x -= value

        if balke1.position.x < self.size.width {
            balke1.position.x = self.size.width + (2 * balke1.size.width)
            value = CGFloat(arc4random_uniform(UInt32(value)))

        }


    }


}

Я просто хочу вызвать узел, чтобы использовать его для реализации баров в игре.

1 Ответ

0 голосов
/ 09 июня 2019

Измените эту строку кода:

addBalken(xScale: 1.5, yScale: 1, name: "//ba1", xPoint: 0)

на:

addBalken(xScale: 1.5, yScale: 1, name: "ba1", xPoint: 0)

// применяется только при поиске узла, поэтому сохраняйте следующие символы в этой строке:

let balke1 = self.childNode(withName: "//ba1") as! SKSpriteNode

РЕДАКТИРОВАТЬ:

Я думаю, что основной причиной вашей проблемы является то, что вы забыли вызвать addChild в вашей функции addBalken.Простого создания узла недостаточно.Узел также должен быть добавлен к сцене.Итак, это окончательный код:

func addBalken(xScale: CGFloat, yScale: CGFloat, name: String, xPoint: CGFloat) {
    let balken = SKSpriteNode(imageNamed: "Balken")
    balken.anchorPoint = CGPoint.zero
    balken.position = CGPoint(x: self.size.width + (2 * balken.size.width) + xPoint, y: bottom1.size.height - 16)
    balken.zPosition = 1
    balken.xScale = xScale
    balken.yScale = yScale
    balken.name = name

    //add the node to the scene
    addChild(balken)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...