Swift Sprite Kit再次调用Function
Swift Sprite Kit call Function again
我想用我的 SKSpriteNodes
/ SKNode
做一个无限循环,但循环不能正常工作。
为了让您了解我的游戏,有 2 个长目标,在屏幕底部彼此相邻生成,它们之间有间隙。
两个 Objectives 之间是 contactNode,它确定 Player 是否穿过墙壁来得分。
目标无限生成。
游戏开始后,调用函数addObjectives
。稍等片刻后,我想用新节点再次调用同一个函数,而旧的衍生节点仍然存在并随着新节点移动到顶部。
但是使用我的代码,在节点到达 Update:
中给定的点后,它们停止,场景再次调用函数,新节点移动到该点并停止 again.An无限循环。
我不想在再次调用 addObjectives
后停止节点,它们应该从屏幕底部生成并移动到顶部,然后被删除,同时总会有新的自下而上的目标。
我该怎么做?
...
var contactNode = SKNode()
...
func addObjectives(){
O1 = SKSpriteNode(imageNamed: "Objective.png")
O1.size = CGSize(width: self.frame.size.width / 1.3, height: self.frame.size.height / 17)
O1.position = positions[randomPosition()]
O1.zPosition = 3
...
self.addChild(O1)
O2 = SKSpriteNode(imageNamed: "Objective.png")
O2.size = CGSize(width: self.frame.size.width / 1.3, height: self.frame.size.height / 17)
O2.position = CGPoint(x: O1.position.x + CGFloat(Gap), y: O1.position.y)
O2.zPosition = 3
...
self.addChild(O2)
contactNode.physicsBody = SKPhysicsBody(rectangleOfSize:CGSize(width: CGFloat(Gap) / 2, height: O1.size.height))
contactNode.position = CGPoint(x: O1.position.x + (CGFloat(Gap) / 2), y: O1.position.y - 20)
contactNode.physicsBody?.dynamic = false
contactNode.physicsBody?.categoryBitMask = ScoreCategory
contactNode.physicsBody?.contactTestBitMask = PlayerCategory
contactNode.physicsBody?.collisionBitMask = 0
self.addChild(contactNode)
}
//Called in the Update Method
func ScrollingMauer(){
O1.position = CGPointMake(O1.position.x, O1.position.y + Speed)
O2.position = CGPointMake(O2.position.x, O2.position.y + Speed)
contactNode.position = CGPointMake(contactNode.position.x, contactNode.position.y + Speed)
if(O1.position.y > self.frame.size.height + O1.size.height)
{
O1.removeFromParent()
}
if(O2.position.y > self.frame.size.height + O2.size.height)
{
O2.removeFromParent()
}
if(contactNode.position.y > self.frame.size.height + Mauer2.size.height)
{
contactNode.removeFromParent()
}
// Here the Function is called again, but the previous spawned
Objectives stop and the new Objectives come from the bottom to the top.
if(O1.position.y > self.frame.size.height / 3)
{
self.addObjectives()
}
}
因为 contactNode
已经被添加到场景中所以你得到这个错误,所以再次添加它会产生这个错误,因为 contactNode
已经有一个父级。
您可以使用布尔标志来指示节点是否已添加,并且只添加一次:
contactNode.physicsBody = SKPhysicsBody(rectangleOfSize:CGSize(width: CGFloat(Gap) / 2, height: O1.size.height))
contactNode.position = CGPoint(x: O1.position.x + (CGFloat(Gap) / 2), y: O1.position.y - 20)
contactNode.physicsBody?.dynamic = false
contactNode.physicsBody?.categoryBitMask = ScoreCategory
contactNode.physicsBody?.contactTestBitMask = PlayerCategory
contactNode.physicsBody?.collisionBitMask = 0
if !self.contactNodeAdded {
self.addChild(contactNode)
self.contactNodeAdded = true
}
并在您的 ScrollingMauer
方法中:
if(contactNode.position.y > self.frame.size.height + Mauer2.size.height)
{
contactNode.removeFromParent()
self.contactNodeAdded = false
}
(您也可以按名称搜索节点,但效率会降低,尤其是在每次帧更新时调用时)
编辑:
如果你想为每个接触节点创建一个新实例:
contactNode = SKNode()
// set physics body etc..
contactNodesArray.append(contactNode)
要跟踪这些实例(以便稍后删除它们),将它们存储在一个数组中并检查数组的每个实例,就像您在删除联系节点逻辑中所做的那样:
let nodesToRemoveArray: Array<Int> = Array();
for (index, node) in enumerate(contactNodesArray) {
if(node.position.y > self.frame.size.height + Mauer2.size.height)
{
node.removeFromParent()
nodesToRemoveArray.append(index);
}
}
for indexToRemove in nodesToRemoveArray {
contactNodesArray.removeATIndex(indexToRemove)
}
我想用我的 SKSpriteNodes
/ SKNode
做一个无限循环,但循环不能正常工作。
为了让您了解我的游戏,有 2 个长目标,在屏幕底部彼此相邻生成,它们之间有间隙。 两个 Objectives 之间是 contactNode,它确定 Player 是否穿过墙壁来得分。 目标无限生成。
游戏开始后,调用函数addObjectives
。稍等片刻后,我想用新节点再次调用同一个函数,而旧的衍生节点仍然存在并随着新节点移动到顶部。
但是使用我的代码,在节点到达 Update:
中给定的点后,它们停止,场景再次调用函数,新节点移动到该点并停止 again.An无限循环。
我不想在再次调用 addObjectives
后停止节点,它们应该从屏幕底部生成并移动到顶部,然后被删除,同时总会有新的自下而上的目标。
我该怎么做?
...
var contactNode = SKNode()
...
func addObjectives(){
O1 = SKSpriteNode(imageNamed: "Objective.png")
O1.size = CGSize(width: self.frame.size.width / 1.3, height: self.frame.size.height / 17)
O1.position = positions[randomPosition()]
O1.zPosition = 3
...
self.addChild(O1)
O2 = SKSpriteNode(imageNamed: "Objective.png")
O2.size = CGSize(width: self.frame.size.width / 1.3, height: self.frame.size.height / 17)
O2.position = CGPoint(x: O1.position.x + CGFloat(Gap), y: O1.position.y)
O2.zPosition = 3
...
self.addChild(O2)
contactNode.physicsBody = SKPhysicsBody(rectangleOfSize:CGSize(width: CGFloat(Gap) / 2, height: O1.size.height))
contactNode.position = CGPoint(x: O1.position.x + (CGFloat(Gap) / 2), y: O1.position.y - 20)
contactNode.physicsBody?.dynamic = false
contactNode.physicsBody?.categoryBitMask = ScoreCategory
contactNode.physicsBody?.contactTestBitMask = PlayerCategory
contactNode.physicsBody?.collisionBitMask = 0
self.addChild(contactNode)
}
//Called in the Update Method
func ScrollingMauer(){
O1.position = CGPointMake(O1.position.x, O1.position.y + Speed)
O2.position = CGPointMake(O2.position.x, O2.position.y + Speed)
contactNode.position = CGPointMake(contactNode.position.x, contactNode.position.y + Speed)
if(O1.position.y > self.frame.size.height + O1.size.height)
{
O1.removeFromParent()
}
if(O2.position.y > self.frame.size.height + O2.size.height)
{
O2.removeFromParent()
}
if(contactNode.position.y > self.frame.size.height + Mauer2.size.height)
{
contactNode.removeFromParent()
}
// Here the Function is called again, but the previous spawned
Objectives stop and the new Objectives come from the bottom to the top.
if(O1.position.y > self.frame.size.height / 3)
{
self.addObjectives()
}
}
因为 contactNode
已经被添加到场景中所以你得到这个错误,所以再次添加它会产生这个错误,因为 contactNode
已经有一个父级。
您可以使用布尔标志来指示节点是否已添加,并且只添加一次:
contactNode.physicsBody = SKPhysicsBody(rectangleOfSize:CGSize(width: CGFloat(Gap) / 2, height: O1.size.height))
contactNode.position = CGPoint(x: O1.position.x + (CGFloat(Gap) / 2), y: O1.position.y - 20)
contactNode.physicsBody?.dynamic = false
contactNode.physicsBody?.categoryBitMask = ScoreCategory
contactNode.physicsBody?.contactTestBitMask = PlayerCategory
contactNode.physicsBody?.collisionBitMask = 0
if !self.contactNodeAdded {
self.addChild(contactNode)
self.contactNodeAdded = true
}
并在您的 ScrollingMauer
方法中:
if(contactNode.position.y > self.frame.size.height + Mauer2.size.height)
{
contactNode.removeFromParent()
self.contactNodeAdded = false
}
(您也可以按名称搜索节点,但效率会降低,尤其是在每次帧更新时调用时)
编辑: 如果你想为每个接触节点创建一个新实例:
contactNode = SKNode()
// set physics body etc..
contactNodesArray.append(contactNode)
要跟踪这些实例(以便稍后删除它们),将它们存储在一个数组中并检查数组的每个实例,就像您在删除联系节点逻辑中所做的那样:
let nodesToRemoveArray: Array<Int> = Array();
for (index, node) in enumerate(contactNodesArray) {
if(node.position.y > self.frame.size.height + Mauer2.size.height)
{
node.removeFromParent()
nodesToRemoveArray.append(index);
}
}
for indexToRemove in nodesToRemoveArray {
contactNodesArray.removeATIndex(indexToRemove)
}