我目前正在开发我的第一个测试游戏,玩家必须跳过一些随机生成的小节。
我写了一个函数,该函数应该在场景之外生成条形图。
目前我的问题是,当我尝试使用“ self.childNode(withName :)”调用创建的条时,xCode告诉我“致命错误:在展开可选值时意外发现nil”。

我已经阅读了Apple文档中的“ childNode(withName :)”,并在节点名称之前添加了“ //”。另外,我使用了stackoverflow搜索,但是找不到解决我问题的任何东西。

//
//  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)))

        }


    }


}


我只想调用该节点,以便可以使用它来实现游戏中的小节。

最佳答案

更改以下代码行:

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

关于swift - 如何解决:按名称调用节点(由func生成)将不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56515428/

10-11 22:32
查看更多