gpt4 book ai didi

python - 两个 Sprite 互相发现

转载 作者:行者123 更新时间:2023-11-28 23:01:50 24 4
gpt4 key购买 nike

再次问好 Stack Overflow。你可能还记得我在 pygame 程序“Table Wars”中遇到的单位生成问题。我决定将我的游戏范围更改为即时战略游戏,而不是回合制游戏。我希望游戏按照顶级 Flash 游戏:“ war 时代”的路线进行游戏。几乎游戏中的一切都有效:重生单位、游戏的 HUD,甚至是基础生命值。不幸的是,我似乎无法弄清楚如何实现单位攻击敌人或敌人基地的能力。以下是单元本身的概念:

  • 该单位在团队基地周围的按键上产生:K_1Red_Infantry 类中产生一个 Sprite
  • 该单位在生成时被添加到 Group 类中。有两个 Group,每个团队一个。
  • 该单位通过 def update 中的 move_ip 调用移动,直到它到达靠近敌人基地的点,然后停止。

以下是我希望不同单位的战斗方式:

  • 只要发现攻击范围内有敌人,该单位就会停止。不同的单位有不同的攻击范围
  • 然后该单位以一秒为间隔进行攻击。
  • 如果该单位成功将敌方单位的生命值降为 0,则敌人死亡,而另一个可以继续
  • 此循环重复进行,直到该单位到达敌方基地,然后每隔一秒攻击一次敌方基地。其中一个单位将能够对基地造成三倍的正常伤害。

这是我的代码示例,显示了 Red_Infantry 类:

class Red_Infantry(pygame.sprite.Sprite):
def __init__(self, screen):
pygame.sprite.Sprite.__init__(self)
self.image, self.rect = load_image('Soldier_red.png', -1)
self.rect.move_ip(random.randint(75, 100), random.randint(275, 325))
self.selected = 0
self.area = screen.get_rect()
self.health = 100 #Soldiers are have mediocre toughness.
self.attack_damage = 25 #The amount of damage it deals
self.range = 20 #The attack range of the unit.
self.update()
def update(self):
self.rect.move_ip(1, 0)
if self.rect.right >= 725: #This position is close to the enemy base...
self.rect.right = 725 #...where it will then stop
if self.health <= 0:
self.kill() #a simple code that kills the sprite if his health reaches 0

主循环只包含生成每个单元的能力。

最佳答案

从您的问题中并不能完全清楚群体如何与每个群体互动以进行发现。在下文中,如果 A 的任何成员 a 在 B 的任何成员 b 的某个指定范围内,我将假设 A 组“发现”B 组。

执行此操作的最简单方法是遍历所有 (a,b) 对。为此,您可以使用 itertools 库,例如...

spotted = False
for a, b in itertools.product(A.sprites( ), B.sprites( )):
if is_in_range(a, b):
spotted = True
break

这种方法的问题是计算成本相当高。 (它的复杂性是 n**2。)此外,如果不进行某种修剪和优化,您还必须为每对友军/敌军组运行此代码块。现在,如果保证每个组都有一些恒定的几何形状,那么我们可以使计算成本便宜得多。但是,假设组没有固定的几何形状,那么我建议您考虑使用几何包来为您完成大量工作。这些软件包非常强大且非常高效……而且其中很多还非常易于使用。可能有特定于 PyGame 的几何包......我现在想不出任何。

我经常使用 shapely package .如果我们使用 shapely,那么确定检测范围内的组的问题更像是......

import shapely
import shapely.geometry

#-- Build a polygon envelope around the members of the group.
pointsA = shapely.geometry.MultiPoint(map(lambda r: r.center, A.sprites( )))
pointsB = shapely.geometry.MultiPoint(map(lambda r: r.center, B.sprites( )))

#-- Ask shapely to give the minimum distance between the hulls that
#-- encompass the two groups.
distance = pointsA.convex_hull.distance(pointsB.convex_hull)

if distance < RANGE_OF_DETECTION:
detected = True
else:
detected = False

请注意,我没有测试上面的代码...它只是为了演示使用 shapely 库来帮助进行几何计算的一般想法。

如果您是游戏编程的新手,您可能还想研究使用四叉树作为修剪需要完成多少几何计算的方法。

关于python - 两个 Sprite 互相发现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10519470/

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