如何在Pygame中实现生命值归0时显示游戏结束界面并终止游戏?
问题描述
参照YouTube教程制作2D Python游戏,教程未实现死亡功能与游戏结束界面。已自行完成游戏结束界面开发,但无法在player.py中玩家self.health<=0时触发该界面,不清楚如何关联player.py与main.py实现此逻辑。
相关代码
main.py
import pygame import sys from settings import WIDTH, HEIGTH, WATER_COLOR, FPS from level import Level from button import Button def get_font(size): return pygame.font.SysFont(None, size) def main_menu(): pass class Game: def __init__(self): # general setup pygame.init() self.screen = pygame.display.set_mode((WIDTH, HEIGTH)) pygame.display.set_caption('Zelda') self.clock = pygame.time.Clock() self.level = Level() self.playing = False def run(self): main_sound = pygame.mixer.Sound('../audio/zelda.ogg') main_sound.set_volume(0.4) main_sound.play(loops=-1) while not self.playing: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_m: self.level.toggle_menu() if self.playing == True: main_sound.stop() pygame.display.update() self.game_over() self.screen.fill(WATER_COLOR) self.level.run() pygame.display.update() self.clock.tick(FPS) def game_over(self): Over_sound = pygame.mixer.Sound('../audio/Retro-Game.ogg') Over_sound.set_volume(0.5) Over_sound.play() while True: Game_Over_MOUSE_POS = pygame.mouse.get_pos() SCREEN.fill("black") Game_Over_TEXT = get_font(90).render( "Game Over", True, "Red") Game_Over_RECT = Game_Over_TEXT.get_rect(center=(640, 260)) SCREEN.blit(Game_Over_TEXT, Game_Over_RECT) Game_Over_BACK = Button(image=None, pos=(640, 460), text_input="Main menu", font=get_font(75), base_color="White", hovering_color="Green") Game_Over_BACK.changeColor(Game_Over_MOUSE_POS) Game_Over_BACK.update(SCREEN) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.MOUSEBUTTONDOWN: if Game_Over_BACK.checkForInput(Game_Over_MOUSE_POS): Over_sound.stop() main_menu() pygame.display.update() if __name__ == '__main__': while True: game = Game() game.run() game.game_over()
player.py
import pygame from settings import * from support import import_folder from entity import Entity class Player(Entity): def __init__(self): super().__init__() self.stats = {'health': 20, 'energy': 60, 'attack': 10, 'magic': 4, 'speed': 5} self.health = self.stats['health'] def death(self): if self.health <= 0: self.playing = True else: self.playing = False def update(self): self.input() self.cooldowns() self.get_status() self.animate() self.move(self.stats['speed']) self.energy_recovery() self.death()
解决方案
1. 修正Player类的死亡状态标记
Player类中的self.playing属于Game类的属性,无法直接影响Game的运行状态。给Player添加独立的死亡状态属性,用来标记玩家是否死亡:
class Player(Entity): def __init__(self): super().__init__() self.stats = {'health': 20, 'energy': 60, 'attack': 10, 'magic': 4, 'speed': 5} self.health = self.stats['health'] self.is_dead = False # 新增死亡状态标记 def death(self): if self.health <= 0: self.is_dead = True # 可在此添加死亡动画、停止玩家动作等逻辑 else: self.is_dead = False def update(self): self.input() self.cooldowns() self.get_status() self.animate() if not self.is_dead: # 死亡后停止移动 self.move(self.stats['speed']) self.energy_recovery() self.death()
2. 在Game类中检测玩家死亡状态
假设Level类内部持有Player实例(如self.player = Player()),在Game的主循环中实时检查玩家的is_dead状态,触发游戏结束界面:
def run(self): main_sound = pygame.mixer.Sound('../audio/zelda.ogg') main_sound.set_volume(0.4) main_sound.play(loops=-1) while not self.playing: # 每次循环优先检查玩家是否死亡 if self.level.player.is_dead: self.playing = True main_sound.stop() self.game_over() break for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_m: self.level.toggle_menu() self.screen.fill(WATER_COLOR) self.level.run() pygame.display.update() self.clock.tick(FPS)
3. 修复Game Over界面的屏幕引用问题
game_over方法中使用的SCREEN未定义,需替换为Game类的self.screen属性:
def game_over(self): Over_sound = pygame.mixer.Sound('../audio/Retro-Game.ogg') Over_sound.set_volume(0.5) Over_sound.play() while True: Game_Over_MOUSE_POS = pygame.mouse.get_pos() self.screen.fill("black") Game_Over_TEXT = get_font(90).render( "Game Over", True, "Red") Game_Over_RECT = Game_Over_TEXT.get_rect(center=(640, 260)) self.screen.blit(Game_Over_TEXT, Game_Over_RECT) Game_Over_BACK = Button(image=None, pos=(640, 460), text_input="Main menu", font=get_font(75), base_color="White", hovering_color="Green") Game_Over_BACK.changeColor(Game_Over_MOUSE_POS) Game_Over_BACK.update(self.screen) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.MOUSEBUTTONDOWN: if Game_Over_BACK.checkForInput(Game_Over_MOUSE_POS): Over_sound.stop() main_menu() pygame.display.update()
4. 确保Level类能访问Player实例
在Level类的初始化方法中创建Player实例并保存为类属性:
class Level: def __init__(self): self.player = Player() # 其他关卡初始化逻辑 def run(self): self.player.update() # 其他关卡逻辑(绘制玩家、敌人等)
内容的提问来源于stack exchange,提问作者Nabil
相关产品推荐
相关产品推荐

