在swift中,有没有一种方法可以通过名称选择一个精灵?
问题描述:
我是新来的编码在Swift中,所以我很抱歉,如果这是一个愚蠢的问题。在swift中,有没有一种方法可以通过名称选择一个精灵?
我有一个函数可以创建一系列精灵。这些精灵会四处移动并更改大小。通过该功能,每个人都有一个独特的名字。
我想要做的是当用户按下单独的一组精灵时,他们的位置/动画/大小/纹理会发生变化。换句话说,我需要按下另一个精灵来调用一个改变第一组精灵的函数。
但是,我遇到了麻烦。看起来我可以让它工作,如果我硬连接一个精灵的特定变量名称。但是,因为有很多,它们可能随着时间而改变,并且我可能想循环其中的许多硬连线并不好。
基本上,我希望能够选择一个精灵,并在其他精灵被触摸时为其设置动画。
有什么建议吗?
答
您可以创建自己的SKSpriteNode的子类,然后从它们的对象名称(变量的名称或常量)中调用它们。这意味着你不必使用硬连线,你可以使用任何种类的逻辑/函数来改变动画或者被调用/使用的精灵名称等。
在这个演示中,我创建了两个对象...一个是lightbult,另一个是lightswitch。当您点击车灯开关时,灯泡将亮起。
阅读评论以了解如何自定义此内容。你可以有任何对象告诉任何其他精灵发挥自己的个人动画:
class TouchMeSprite: SKSpriteNode {
// This is used for when another node is pressed... the animation THIS node will run:
var personalAnimation: SKAction?
// This is used when THIS node is clicked... the below nodes will run their `personalAnimation`:
var othersToAnimate: [TouchMeSprite]?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// Early exit:
guard let sprites = othersToAnimate else {
print("No sprites to animate. Error?")
return
}
for sprite in sprites {
// Early exit:
if sprite.scene == nil {
print("sprite was not in scene, not running animation")
continue
}
// Early exit:
guard let animation = sprite.personalAnimation else {
print("sprite had no animation")
continue
}
sprite.run(animation)
}
}
}
这里是GameScene文件,展示了电灯开关和灯泡演示:
class GameScene: SKScene {
override func didMove(to: SKView) {
// Bulb:
let lightBulb = TouchMeSprite(color: .black, size: CGSize(width: 100, height: 100))
// Lightbulb will turn on when you click lightswitch:
lightBulb.personalAnimation = SKAction.colorize(with: .yellow, colorBlendFactor: 1, duration: 0)
lightBulb.position = CGPoint(x: 0, y: 400)
lightBulb.isUserInteractionEnabled = true
addChild(lightBulb)
// Switch:
let lightSwitch = TouchMeSprite(color: .gray, size: CGSize(width: 25, height: 50))
// Lightswitch will turn on lightbulb:
lightSwitch.othersToAnimate = [lightBulb]
lightSwitch.isUserInteractionEnabled = true
lightSwitch.position = CGPoint(x: 0, y: 250)
addChild(lightSwitch)
}
}
从创建字典精灵“字符串”名称为精灵实例 – Alexander
制作您自己的Skspritenode(子类)并覆盖它的touchesBegan。使一个初始化器婴儿车的精灵触摸动画。如果你需要,我可以做出答案。 – Fluidity