首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何修复:按名称调用节点(由func生成)不起作用

如何修复:按名称调用节点(由func生成)不起作用
EN

Stack Overflow用户
提问于 2019-06-09 22:29:10
回答 1查看 50关注 0票数 0

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

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

代码语言:javascript
复制
//
//  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)))

        }


    }


}

我只想调用节点,这样我就可以使用它来实现游戏中的条。

EN

回答 1

Stack Overflow用户

发布于 2019-06-10 00:34:31

更改以下代码行:

代码语言:javascript
复制
addBalken(xScale: 1.5, yScale: 1, name: "//ba1", xPoint: 0)

至:

代码语言:javascript
复制
addBalken(xScale: 1.5, yScale: 1, name: "ba1", xPoint: 0)

//仅在搜索节点时适用,因此请在该行中保留以下字符:

代码语言:javascript
复制
let balke1 = self.childNode(withName: "//ba1") as! SKSpriteNode

编辑:

我认为问题的根本原因是您忘记在addBalken函数中调用addChild。仅仅创建一个节点是不够的。节点也必须添加到场景中。所以这是最终的代码:

代码语言:javascript
复制
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)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56515428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档