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



我创造了一个游戏,在这个游戏中,一个球穿过了随机位置的障碍物,当球穿过障碍物时,分数应该增加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中测试它。此外,由于我不知道您的整个项目是如何设计的,因此一种方法可能比另一种方法更适合您。

最新更新