繁体   English   中英

当我所有的节点都在本地声明时,不知道如何更新分数标签节点

[英]don't know how to update the score label node , when all my nodes are declared locally

我创建了一个游戏,其中球穿过障碍物,障碍物掉落到任意位置,当球穿过障碍物时,分数应增加1,但是对象的所有结点都在局部声明,而不是如何增加在没有创建太多节点的情况下得分。

这是一个示例:我的功能之一:

func leftObject(){
        var rand = arc4random_uniform(2) + 1
        if rand == 1
        {
            var bigWall = SKSpriteNode(imageNamed: "shortwall")
             bigWall.position = CGPointMake(CGRectGetMinX(self.frame) + bigWall.size.width / 2, CGRectGetMaxY(self.frame))

            var moveObjects = SKAction.moveByX(0, y: -self.frame.size.height * 2, duration: NSTimeInterval(self.frame.size.height / 100))
            var removeObjects = SKAction.removeFromParent()
            var moveAndRemoveObjects = SKAction.sequence([moveObjects,removeObjects])
            bigWall.runAction(moveAndRemoveObjects)
            bigWall.physicsBody = SKPhysicsBody(rectangleOfSize: bigWall.size)
            bigWall.physicsBody?.dynamic = false
            bigWall.physicsBody?.categoryBitMask = objectGroup



        }

        else
        {
            var tallWall = SKSpriteNode(imageNamed: "shortwall")
            tallWall.position = CGPointMake(CGRectGetMinX(self.frame) + tallWall.size.width / 2, CGRectGetMaxY(self.frame))
            var moveObjects = SKAction.moveByX(0, y: -self.frame.size.height * 2, duration: NSTimeInterval(self.frame.size.height / 100))
            var removeObjects = SKAction.removeFromParent()
            var moveAndRemoveObjects = SKAction.sequence([moveObjects,removeObjects])
            tallWall.runAction(moveAndRemoveObjects)
            tallWall.physicsBody = SKPhysicsBody(rectangleOfSize: tallWall.size)
            tallWall.physicsBody?.categoryBitMask = objectGroup
            tallWall.physicsBody?.dynamic = false



            movingObjects.addChild(tallWall)
        }

然后我有一个函数,该函数每1秒被调用一次,该函数生成一个随机数,以调用随机显示对象的6个函数。 如果即使我必须更改自己的代码,您仍然知道该怎么做,请提供帮助。 谢谢。

您在这里有一些选择,以及一些代码设计决策。

首先,任何重复的代码都应放入单独的方法中,而不要放在if / else中。 从外观上看,您的前8行左右是重复的。 所以做一个新方法:

func setUpWall() -> SKSpriteNode {
   var tallWall = SKSpriteNode(imageNamed: "shortwall")
   //all other lines that are duplicate;
}

这样,您可以在两个if / else条件下都调用此方法:

var rand = arc4random_uniform(2) + 1

var wall = setUpWall()

if rand == 1 {
 //any unique stuff
} else {
 //other unique stuff
}

其次,为了能够访问墙或方法之外的任何变量,可以在类顶部将它们声明为实例变量。

 var wall = SKSpriteNode() //its declared as var, so you can update it inside the method call and still access it outside the method

这是一种方法,另一种方法是使用某种地图或字典将本地变量保存在其中。 字典具有一个键值对,因此您可以将一个特定的键分配为变量的名称,并为它分配一个正确的对象作为值

您可以在此处阅读有关它们的信息,但我将在下面提供示例: https : //developer.apple.com/library/mac/documentation//General/Reference/SwiftStandardLibraryReference/Dictionary.html

//declare your dictionary as an instance variable (a class variable, not inside a method)
//pseudocode, you gotta make sure the syntax is correct and it compiles

var myDict = Dictionary<String: SKSpriteNode>()

在您的方法中,当您创建要在方法之外访问的任何精灵时,请将它们添加到字典中,并给它们指定一个您将知道的名称:

var bigWall = SKSpriteNode(imageNamed: "shortwall")
myDict["myWall1"] = bigWall

//then to get it later you can say:
let myWallFromOtherMethod = myDict["myWall1"]


//but I would check if the key exists first
// you don't want to get a nil error
// so use this syntax

if let myWallFromOtherMethod = myDict["myWall1"] {
// now val is not nil and the Optional has been unwrapped, so use it
}

就像我之前说过的那样,您需要确保所有内容都符合我添加的语法,因为我没有亲自在Xcode中对其进行测试。 另外,由于我不知道整个项目的设计方式,因此一种方法对您而言可能比另一种更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM