我的SpriteKit游戏中有一个循环,随机生成一个对象的副本,我想使用removeFromParent()删除我的联系对象。但是,当我将其添加到代码中时,不会删除该对象。这是我生成对象的循环代码:
for i = 0; i<1000; ++i {
var randomNumber = CGFloat(arc4random_uniform(3000)) * 200
bubbleDuplicate.position = (CGPointMake(randomNumber, 400))
bubbleDuplicate = bubble.copy() as! SKSpriteNode
bubbleDuplicate.physicsBody?.categoryBitMask = bubbleCategory
bubbleDuplicate.physicsBody?.collisionBitMask = 0
bubbleDuplicate.physicsBody?.contactTestBitMask = 0
addChild(bubbleDuplicate)
func BubbleContact(){
bubbleDuplicate.removeFromParent()
bubble.removeFromParent()
bubbleDuplicate.setScale(0)
bubble.setScale(0)
}
}
这是我的碰撞代码,它应该删除我的对象:
func didBeginContact(contact: SKPhysicsContact) {
let collision:UInt32 = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask)
if collision == (playerCategory | crateCategory) {
gameOver()
}
if collision == (playerCategory | bubbleCategory) {
NSLog("Bubble Contact")
bubbleDuplicate.removeAllActions()
bubbleDuplicate.removeFromParent()
bubble.removeAllActions()
bubble.removeFromParent()
bubbleDuplicate.setScale(0)
bubble.setScale(0)
bubbleDuplicate.alpha = 0
bubble.removeFromParent()
bubbleDuplicate.removeFromParent()
}
}
如何修复我的代码?
编辑:感谢@ NikitaLeonov的回答,我的泡泡精灵现在按照预期的方式运作。但是,我正在尝试将相同的功能应用于另一个sprite节点,只是复制他的代码不会产生相同的效果。我该怎么办?这是新代码:
if (contact.bodyA.categoryBitMask == bubbleCategory) {
let node = contact.bodyB.node
//Other remove routine
NSLog("Bubble Contact")
node?.removeAllActions()
node?.removeFromParent()
} else if (contact.bodyB.categoryBitMask == bubbleCategory) {
let node = contact.bodyB.node
//Other remove routine
NSLog("Bubble Contact")
node?.removeAllActions()
node?.removeFromParent()
}else if (contact.bodyA.categoryBitMask == wormCategory) {
let node = contact.bodyB.node
//Other remove routine
NSLog("Worm Contact")
node?.removeAllActions()
node?.removeFromParent()
}else if (contact.bodyB.categoryBitMask == wormCategory) {
let node = contact.bodyB.node
//Other remove routine
NSLog("Worm Contact")
node?.removeAllActions()
node?.removeFromParent()
}
答案 0 :(得分:1)
您使用bubbleDuplicate和bubble作为全局变量并将removeFromParent调用它们,因此只会删除最后生成的bubble和bubbleDuplicate。如你所见,这不是一个正确的方法。您应该从联系方法中的contact.bodyA和contact.bodyB变量中获取需要删除的节点。
func didBeginContact(contact: SKPhysicsContact) {
let collision:UInt32 = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask)
if collision == (playerCategory | crateCategory) {
gameOver()
}
if (contact.bodyA.categoryBitMask == bubbleCategory) {
let node = contact.bodyA.node
//Other remove routine
node.removeAllActions()
node.removeFromParent()
} else if (contact.bodyB.categoryBitMask == bubbleCategory) {
let node = contact.bodyB.node
//Other remove routine
node.removeAllActions()
node.removeFromParent()
}
}
此外,如果bubble和bubbleDouble以某种方式相关,我会尝试使用子节点设置系统但不会在联系方式中单独管理它们。同时删除我也建议作为Action来简化一切的管理。因此除了明显的代码重复争夺之外,还有很多机会如何改进这些代码。
ps看来我在这个游戏上做了很多贡献:)你应该在发布时给我一个促销代码:D