我创造了一个游戏,其中一个球穿过在随机位置落下的障碍物,当球穿过障碍物时,得分应该增加一个,但是物体的所有节点都在当地宣布并且不在如何在不创建如此多节点的情况下提高分数。
这是一个例子:我的一个功能:
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个函数。 如果你知道一种方法,即使我必须更改我的代码,请帮助。 谢谢。
答案 0 :(得分:0)
这里有几个选项,以及一些代码设计决策。
首先,任何重复的代码都应该放在一个单独的方法中,而不是放在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中亲自测试过。此外,由于我不知道您的整体项目是如何设计的,因此一种方法可能比另一种方法更适合您。