как заменить изображение SKSpriteNode на клик

Я столкнулся с проблемой при замене изображения SKSpriteNode на клик, так как я не могу получить доступ к SKSpriteNode в touchesBegan().

У меня есть местоположение и узел, который соприкасается, но я не могу заменить изображение. я попытался заменить изображение как этот "balloon.texture = SKTexture (imageNamed:" explode ")", я не могу использовать этот код, поскольку я создаю свой SKSpriteNode внутри блока. Вот мой код

class GameScene: SKScene {
let brickCategoryBitMask: UInt32 = 0x1 << 2
var balloonArray = ["Blue","Green","Yellow","Purple","Red"]
let viewSize = UIScreen.main.bounds.size
var gameScore: SKLabelNode!

override func didMove(to view: SKView) {
    addRandomBalloon()
}

func addRandomBalloon() {
    // This function randomly places balloon around the game scene
    //
    let wait = SKAction.wait(forDuration: 0.7)

    let block = SKAction.run({
        let randomX = self.randomFloat(from: 50, to: self.frame.size.width - 50)
        let randomY = self.randomFloat(from: 200 , to: self.frame.size.height - 100)

        let randomBalloon = self.balloonArray.randomElement()!
        let balloon = SKSpriteNode(imageNamed: randomBalloon)
        balloon.position = CGPoint(x: randomX, y: randomY)
        balloon.size = CGSize(width: 25, height: 25)

        balloon.physicsBody = SKPhysicsBody(circleOfRadius: balloon.frame.width)
        balloon.physicsBody?.linearDamping = 0
        balloon.physicsBody?.allowsRotation = false
        balloon.physicsBody?.isDynamic = false // Prevents the ball from slowing down when it hits a brick
        balloon.physicsBody?.affectedByGravity = false
        balloon.physicsBody?.friction = 0.0
        balloon.physicsBody?.categoryBitMask = self.brickCategoryBitMask

        balloon.run( SKAction.scale(to: 4, duration: 0.5))
        self.addChild(balloon)

        ///assigning unique name to each balloon
        if randomBalloon == "Blue"{
            balloon.name = "blue_balloon"
        }else  {
            balloon.name = "purple_balloon"
        }

        removeBalloon(node: balloon, balloonName: balloon.name!)  //remove balloon after certain time
    })

    func removeBalloon(node : SKSpriteNode, balloonName : String){
        let deadlineTime = DispatchTime.now() + .seconds(2)
        DispatchQueue.main.asyncAfter(deadline: deadlineTime, execute: {
            if self.balloonIsTapped == true{
            }else{
                 node.removeFromParent()
            }
        })  
    }

   let sequence = SKAction.sequence([wait, block])
    run(SKAction.repeatForever(sequence), withKey: "addBlock")

}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
     if let touch = touches.first {
         let location = touch.location(in: self)
         let tappedNodes = nodes(at: location)

         for node in tappedNodes {
            if node.name == "blue_balloon"  {
                    score = score+1
                balloonIsTapped = true
                node.run( SKAction.scale(to: 1, duration: 0.4)){
                    node.removeFromParent()
                    self.balloonIsTapped = false
                }
            }

            if node.name == "purple_balloon"  {
                score = score+1
                balloonIsTapped = true
                node.run( SKAction.scale(to: 1, duration: 0.4)){
                    node.removeFromParent()
                    self.balloonIsTapped = false
                }
            }
        }

    }

}

// Marker: Random number generation
func randomFloat(from: CGFloat, to: CGFloat) -> CGFloat {
    let random: CGFloat = CGFloat(Float(arc4random()) / 0xFFFFFFFF)
    return random * (to - from) + from
}
}

я просто хочу заменить изображение воздушного шара, если пользователь щелкнет на воздушном шаре. Пожалуйста, помогите или предложите, если что-то не так в этом коде, так как я новичок в разработке игр для iOS и SpriteKit.

0
источник поделиться
1 ответ

В цикле for в вашей функции touchesBegan node имеет тип SKNode. Вам нужно опуститься до SKSpriteNode. Когда вы переходите в SKSpriteNode, вы можете изменить текстуру.

for node in tappedNodes {
    if let tappedBalloon = node as? SKSpriteNode {
        if tappedBalloon.name == "blue_balloon" {
            // Set tapped balloon texture
            tappedBalloon.texture = // The texture you want here.
            // Handle tapping a balloon, such as increasing the score.
        }
    }
}

Я заметил в вашем цикле for, что у вас есть один и тот же код внутри блоков if для синих и фиолетовых шаров. Вы можете легко переместить дублированный код в его собственную функцию, popBalloon или как хотите, чтобы назвать его, и вызывать эту функцию, когда вы нажимаете на воздушный шар. Если нет никаких различий в воздушных шарах, кроме их цвета, вы можете просто дать каждому воздушному шару название "balloon" и проверить одно имя вместо проверки нескольких имен воздушных шаров. Это сократило бы ваш код.

Вы также можете упростить понимание своего кода, создав структуру или класс Balloon и указав в качестве одного из свойств спрайтовый узел. Напишите код, который имеет дело с воздушными шарами вместо узлов спрайтов и другими терминами SpriteKit.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос