SKNode (アチーブメントと呼ばれる) のサブクラスを介して作成したノードの 1 つが存在するかどうかを検出しようとしています。存在しない場合は、ブール変数をオフにしようとしています。
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
下の画像からわかるように、それぞれに個別の名前とロック解除基準を持つ多数の異なる実績ノードがあり、実績がロック解除されると、インジケーターが作成され、ここで 2 つの X ノードに表示されるグラフィックが変更されます。それぞれの右上隅にある色付きの赤い円は「インジケーター」です (その下部にあるサブクラスを見ると、インジケーターの作成があります)
画像の右下隅にある大きな赤いボタンは、ブール変数 (menuAchieveNotificationOn) によって制御されるインジケーターを備えた実績メニュー ボタンです。私が達成しようとしているのは、一度の実績です。インジケータがそれぞれ押されていると、ノードから削除されます。
私がやろうとしているのは、各ノードを検索して、インジケーターがまだ存在するかどうかを確認することです。変数 (menuAchieveNotificationOn) を false にします。
これを使用できるはずです:
if let indicatorNode = childNode(withName: "//Indicator") as! SKShapeNode? {
menuAchieveNotificationOn = false
} else {
menuAchieveNotificationOn = true
}
編集: シーン内のすべての「インジケーター」ノードに対していくつかのコードを実行します。いずれかが見つかった場合、activationsFound は true に設定されます。
achievementsFound = false
enumerateChildNodes(withName: "//Indicator") { indicatorNode, _ in
// Do something with indicatorNode
achievementsFound = true
}
これは単純すぎるように思えますが、私はあなたの意図を誤解していたかもしれません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加