【问题标题】:detecting if a spritenode exists in swift快速检测 spritenode 是否存在
【发布时间】:2017-06-14 09:47:21
【问题描述】:

我正在尝试检测我通过 SKNode (称为成就) 的子类创建的节点之一是否存在,如果不存在,那么我正在尝试关闭布尔变量。

我使用什么来定位 SKShapeNode(称为“指标”)

func checkIndicatorStatus() {

    moveableArea.enumerateChildNodes(withName: "Achievement") {
        (node, stop) in

         let Indicate = node

        Indicate.enumerateChildNodes(withName: "Indicator") {
            node, stop in

            if let Achievement = node as? Achievements {

                    menuAchieveNotificationOn = false

            }
        }
    }
}

我已经专门枚举了节点并尝试搜索它,但它似乎没有做任何事情。我做错了什么?

这是我的子类。我的场景中显示了其中许多已命名的成就。

class Achievements: SKNode {

//Nodes used throughout the SKNode class
var achievementLabel = SKLabelNode()
var achievementTitleLabel = SKLabelNode()
var achievementNode = SKSpriteNode()
var notifyCircle = SKShapeNode()

//Amount Variables used as Achievement Properties
var image: String = ""
var information: String = ""
var title: String = ""
var amount = 0
var neededAmount = 0
var notification:Bool = false
var stage = 0


func getachievementData(AchName: String) {

    let getDataRequest:NSFetchRequest<Achievement> = Achievement.fetchRequest()
    getDataRequest.predicate = NSPredicate(format: "theSearchName == %@" , AchName)

    do {

        let searchResults = try CoreDatabaseContoller.getContext().fetch(getDataRequest)

        //print("number of results: \(searchResults.count)")
        for result in searchResults as [Achievement] {

            title = result.theName!
            information = result.theDescription!
            image = result.theImage!
            amount = Int(result.aAmount!)
            neededAmount = Int(result.aNeededAmount!)
            stage = Int(result.aStage!)

            if result.aHasBeenAchieved!.intValue == 1 {

                notification = true
            }

        }
    }

    catch {

            print("ERROR: \(error)")

    }

    createAchievement()
}

func createAchievement() {

    let tex:SKTexture = SKTexture(imageNamed: image)

    achievementNode = SKSpriteNode(texture: tex, color: SKColor.black, size: CGSize(width: 85, height: 85))  //frame.maxX / 20, height: frame.maxY / 20))
    achievementNode.zPosition = -10
    achievementSprites.append(achievementNode)


    self.name = "Achievement"
    self.addChild(achievementNode)
    self.zPosition = -11

    createAchievementLabels()

}

func createAchievementLabels() {

    achievementTitleLabel = SKLabelNode(fontNamed: "Avenir-Black")
    achievementTitleLabel.fontColor = UIColor.black;
    achievementTitleLabel.fontSize = 15 //self.frame.maxY/30
    achievementTitleLabel.position = CGPoint (x: 0, y: 50)
    achievementTitleLabel.text = "\(title)"
    achievementTitleLabel.zPosition = -9
    addChild(achievementTitleLabel)

    achievementLabel = SKLabelNode(fontNamed: "Avenir-Black")
    achievementLabel.fontColor = UIColor.black;
    achievementLabel.fontSize = 13 //self.frame.maxY/30
    achievementLabel.position = CGPoint (x: 0, y: -55)
    achievementLabel.text = ("\(amount) / \(neededAmount)")
    achievementLabel.zPosition = -9
    addChild(achievementLabel)

    if notification == true {

        notifyCircle = SKShapeNode(circleOfRadius: 10)
        notifyCircle.fillColor = .red
        notifyCircle.position = CGPoint(x: 30 , y: 35)
        notifyCircle.zPosition = 1000
        notifyCircle.name = "Indicator"
        addChild(notifyCircle)
    }

  }
}  

编辑 1

如下图所示,有许多不同的成就节点,每个节点都有各自的名称和解锁条件,当一个成就被解锁时,它会生成一个指示器并更改图形,这可以从两个 X 中看到这里的节点在每个节点的右上角都有红色圆圈,这是“指标”(如果你查看它底部的子类,指标的创建就在那里)

现在你可以看到图片右下角的红色大按钮是成就菜单按钮,它还有一个由布尔变量 (menuAchieveNotificationOn) 控制的指示器,我想要实现的是一次每个带有指标的成就都被按下,它们将从节点中删除。

我正在尝试做的是搜索每个节点以查看指示器是否仍然存在,如果不存在我想将变量 (menuAchieveNotificationOn) 设置为 false。

【问题讨论】:

    标签: ios swift xcode sprite-kit


    【解决方案1】:

    你应该可以使用这个:

    if let indicatorNode = childNode(withName: "//Indicator") as! SKShapeNode? {
            menuAchieveNotificationOn = false
        } else {
            menuAchieveNotificationOn = true
        }
    

    编辑:为场景中的每个“指标”节点运行一些代码。如果找到,则将resultsFound 设置为true:

    achievementsFound = false
    enumerateChildNodes(withName: "//Indicator") { indicatorNode, _ in
        // Do something with indicatorNode
        achievementsFound = true
    }
    

    虽然这看起来太简单了,所以我可能误解了你的目的。

    【讨论】:

    • 我希望在场景中搜索的指标有很多,因为有多个节点可能有也可能没有。我这样做的全部原因是通知玩家已实现成就,然后再次检查场景以关闭所有成就后在另一个场景中的通知,因为当它们被按下时“指示器消失并且然后我需要再次搜索场景以检查指示节点是否存在。如果不存在,则需要关闭上述问题中的布尔值。这有意义吗?
    • 所以您需要检查场景节点树中的每个指标节点是否有这些“指标”?如果是这样,请参阅我的编辑。
    • 检查我的编辑以了解我的目标和视觉表现的更多细节。
    • 您编辑中的代码似乎很好地找到了指标节点,只是如果场景中没有指标节点,我该如何制作它以关闭 bool 变量?
    • 我已经更新了编辑,以便在找到一些请求的节点时将标志 achievementsFound 设置为 true
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 2014-02-16
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    相关资源
    最近更新 更多