gpt4 book ai didi

swift - 使用 enumerate ChildNode WithName 后,如何只让一个 child 做某事?

转载 作者:行者123 更新时间:2023-11-30 13:28:47 26 4
gpt4 key购买 nike

我使用了enumerateChildNodesWithName命令来赋予我的所有 block 物理特性,如下所示:

    func findBlock(theName:String){

self.enumerateChildNodesWithName("//*"){
node, stop in

if node.name == theName{
node.physicsBody?.categoryBitMask = physicsCategory.block
node.physicsBody?.collisionBitMask = physicsCategory.laser
node.physicsBody?.contactTestBitMask = physicsCategory.laser
}
}
}

现在我只希望其中一个方 block 在被激光击中时消失。然而,如果不让所有其他 block 同时消失,我就无法实现这一点。
我尝试在 didBeginContact 中使用这行代码来查找哪个 block 代表第一个主体并将其删除:

if firstBody.categoryBitMask == physicsCategory.block && secondBody.categoryBitMask == physicsCategory.laser{

let block = SKSpriteNode()
block.physicsBody = firstBody
block.alpha = 1
let byeBlock = SKAction.fadeOutWithDuration(0.5)
let gone = SKAction.removeFromParent()
let run = SKAction.sequence([byeBlock, gone])
block.runAction(run)
self.removeChildrenInArray([laser])

}

但这最终也不起作用。请帮忙!提前致谢!

最佳答案

我假设您按照应有的方式处理联系人,因此您提供的 if block 可以正常工作。如果是这样,这就是您想要的:

if firstBody.categoryBitMask == physicsCategory.block && secondBody.categoryBitMask == physicsCategory.laser{
{
//Downcast it to SKSpriteNode or whatever your block is
if let block = firstBody.node as? SKSpriteNode {

//We don't want to run removing action twice on the same block
if block.actionForKey("removing") == nil {

block.alpha = 1
let fadeOut = SKAction.fadeOutWithDuration(0.5)
let remove = SKAction.removeFromParent()
block.runAction(SKAction.sequence([fadeOut, remove]), withKey: "removing")
}

}
//Downcast it to SKSpriteNode or whatever your laser is
if let laser = secondBody.node as? SKSpriteNode {
self.removeChildrenInArray([laser])
}

}

关于swift - 使用 enumerate ChildNode WithName 后,如何只让一个 child 做某事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36818937/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com