gpt4 book ai didi

ios - 如何在 Sprite Kit 中为敌人设置 ID 系统?

转载 作者:行者123 更新时间:2023-11-28 23:27:26 25 4
gpt4 key购买 nike

我正在为 iOS 制作 2d 太空射击风格的游戏,但在为游戏元素(尤其是敌人)创建 ID 系统时遇到了困难。

我使用的教程只展示了如何让敌人在一击后爆炸。它使用一个名为 didBegin(_ contact: SKPhysicsContact) 的函数。

根据我的理解,这个函数会评估每个接触实例,为两个实体分配两个不同的角色,然后决定如何处理每个实体。我假设让一个敌人受到三击,将使用一个包含他们剩余生命值的变量。然后,每发生一次接触,变量就会减一,直到为零,敌人就会被移除。

然而,这里面有一个深层次的问题。由于didBegin(_ contact: SKPhysicsContact) 仅评估一个接触实例,它不知道其他先前的接触实例。本质上,当敌人被击中时,无法知道敌人是否之前被击中、根本没有被击中,或者已经被击中太多次。如果只有一个敌人,那么我可以使用一个变量来跟踪其健康状况。但事实并非如此,因为屏幕上同时有多个敌人,每次接触时,都无法知道之前的攻击是针对这个敌人还是另一个敌人。

如果屏幕上有一个敌人,这很简单,因为每次接触时都必须是那个敌人。但如果屏幕上有多个实体,则无法知道接触适用于哪个敌人。

我知道我必须设置一个 ID 系统,以便在检测到接触后进行调用,但我只是不知道该怎么做。

我尝试建立一个字典和一个类结构(我知道你可以像这样解决它,但我还没能弄清楚)。

最佳答案

可能最简单的方法是继承 SKNode 并将其用于你的敌人。您可以将 health 属性添加到您的 EnemyNode 并将其初始化为合适的值。

然后在 didBegin(_ contact: SKPhysicsContact) 中你可以找到敌人,减少它的生命值并在适当的时候摧毁它。

func didBegin(_ contact: SKPhysicsContact) {
var enemy: EnemyNode? = nil

if contact.bodyA.node is EnemyNode {
enemy = contact.bodyA.node
} else if contact.bodyB.node is EnemyNode {
enemy = contact.bodyB.node
}

if let enemy = enemy {
enemy.health -= 1
if enemy.health == 0 {
//TODO: explode enemy
}
}
}

关于ios - 如何在 Sprite Kit 中为敌人设置 ID 系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58195282/

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