python - 在pygame中与敌人碰撞使玩家失去多条生命
问题描述
我正在努力做到这一点,然后当敌人与玩家发生碰撞时,一个人的生命就会消失,并且玩家会被定位在屏幕的中心。它大约有一半的时间有效,但另一半的时间有两三个人因一次碰撞而丧生。
def collide(self):
for enemy in enemies:
if ((robot.hitbox[0] < enemy.x + 16 < robot.hitbox[0] + robot.hitbox[2]) or (robot.hitbox[0] < enemy.x - 16 < robot.hitbox[0] + robot.hitbox[2])) and ((robot.hitbox[1] < enemy.y + 16 < robot.hitbox[1] + robot.hitbox[3]) or (robot.hitbox[1] < enemy.y - 16 < robot.hitbox[1] + robot.hitbox[3])):
robot.alive = False
robot.x = 400
robot.y = 300
for enemy in enemies:
enemies.remove(enemy)
robot.lives -= 1
robot.alive = True
这是 Enemy 类下的一个函数,在 Enemy 的 draw 函数内部调用,该函数在 while 循环中调用。
while running:
## add if robot.alive == True into loop
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
userInput = pygame.key.get_pressed()
if len(enemies) <= 3:
randSpawnX = random.randint(32, 768)
randSpawnY = random.randint(77, 568)
if (robot.x - 100 <= randSpawnX <= robot.x + 100) or (robot.y - 100 <= randSpawnY <= robot.y + 100):
randSpawnX = random.randint(32, 768)
randSpawnY = random.randint(77, 568)
else:
enemy = Enemy(randSpawnX, randSpawnY)
enemies.append(enemy)
if robot.alive == True:
for enemy in enemies:
enemy.move()
robot.shoot()
robot.movePlayer(userInput)
drawGame()
谁能帮我弄清楚为什么会这样?我相信这是因为正在记录多次碰撞,但是由于我在记录第一次命中并且在失去生命之前将机器人移动到屏幕中间,为什么会发生这种情况?
解决方案
阅读如何在 pygame 中检测碰撞?并使用pygame.Rect
/colliderect()
进行碰撞检测。
阅读如何在迭代时从列表中删除项目?并遍历列表的副本。
x
如果遇到碰撞,仅仅改变玩家的属性和属性是不够的y
。您还需要更改hitbox
. 此外break
,检测到碰撞时的循环:
def collide(self):
robot_rect = pygame.Rect(*robot.hitbox)
for enemy in enemies[:]:
enemy_rect = pygame.Rect(enemy.x, enemy.y, 16, 16)
if robot_rect.colliderrect(enemy_rect):
enemies.remove(enemy)
robot.x, robot.y = 400, 300
robot.hitbox[0] = robot.x
robot.hitbox[1] = robot.y
robot.lives -= 1
break
推荐阅读
- sql - 分组依据以及子句外部的列
- python - 基于策略的学习不收敛
- mysql - 合并多个表中的数据
- python - 如何使用 Python 在图中找到最近的坐标
- java - 如何以笛卡尔方式迭代字符串列表?
- .net-core - .NET Core Runtime 是否向后兼容以前的版本?
- javascript - Air Datepicker - 计算所选日期范围内的天数
- php - 无法使用 php 的 utf-8_encode 获得所需的格式或解码包含 "\x" 的字符串
- regex - 匹配字符模式之间的 N 行,移动 N 行使其与字符模式内联
- java - 无论如何我可以在 Big-O 中使用这种方法 O(1) 吗?