Pygame玩家重生后移动受限问题求助
问题分析与解决
问题根源
重生后玩家只能移动10-20像素的核心原因是:当生命值归0后,主循环的每帧都会执行player_rectangle.x = 500和player_rectangle.y = 500。由于current_health始终为0,玩家刚移动一点就被强制拉回重生坐标,导致移动范围被限制。
修复方案
重生时必须同时重置玩家生命值,让重生逻辑只触发一次,而非每帧重复执行。
修正后的核心代码片段
# 重生逻辑修正 if current_health == 0: current_health = 500 # 重置生命值为初始值 player_rectangle.x = 500 player_rectangle.y = 500
完整修正代码
import pygame import keyboard pygame.init() speed_player=5.0 number = '10' game_font =pygame.font.Font('font\\THEBOLDFONT.ttf',50) window = pygame.display.set_mode((1280,720)) pygame.display.set_caption('test') clock = pygame.time.Clock() #health_bar current_health = 500 max_health = 1200 health_bar_length = 250 health_ratio = max_health / health_bar_length def get_damage(amount):#damage funct global current_health if current_health > 0: current_health -= amount if current_health <= 0: current_health = 0 def get_health(amount):#heal funct global current_health if current_health < max_health: current_health += amount if current_health >= max_health: current_health = max_health ground_surface = pygame.image.load('sand.png').convert_alpha() stone_surface = pygame.image.load('stone.png').convert_alpha() stone_rectangle = stone_surface.get_rect(center = (640,360)) player_surface = pygame.image.load('player.png').convert_alpha() player_rectangle = player_surface.get_rect(topleft = (0,0)) text_surface = game_font.render('WELCOME',True,'Black') text_rectangle = text_surface.get_rect(center = (640,90)) number_surface = game_font.render(number,True,'White') number_rectangle = number_surface.get_rect(center = (800,90)) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() window.blit(ground_surface,(0,0)) if keyboard.is_pressed('w'):player_rectangle.y -= speed_player if keyboard.is_pressed('s'):player_rectangle.y += speed_player if keyboard.is_pressed('a'):player_rectangle.x -= speed_player if keyboard.is_pressed('d'):player_rectangle.x += speed_player window.blit(stone_surface,stone_rectangle) window.blit(player_surface,player_rectangle) #write health if player_rectangle.colliderect(stone_rectangle): get_damage(10) print(current_health) # 修正后的重生逻辑 if current_health == 0: current_health = 500 player_rectangle.x = 500 player_rectangle.y = 500 if player_rectangle.colliderect(stone_rectangle): print("collision") window.blit(text_surface,(text_rectangle)) window.blit(number_surface,number_rectangle) pygame.display.update() clock.tick(60) pygame.quit()
额外优化建议
- 替换
keyboard库为Pygame原生的pygame.key.get_pressed(),更适配Pygame事件循环:keys = pygame.key.get_pressed() if keys[pygame.K_w]: player_rectangle.y -= speed_player if keys[pygame.K_s]: player_rectangle.y += speed_player if keys[pygame.K_a]: player_rectangle.x -= speed_player if keys[pygame.K_d]: player_rectangle.x += speed_player - 添加重生无敌时间,避免刚重生就再次碰撞掉血,提升游戏体验。
内容的提问来源于stack exchange,提问作者Umut Kaya Bal
相关产品推荐
相关产品推荐

