Pygame开发恐龙类游戏:按空格键精灵无法移动的问题求助
解决Pygame中恐龙精灵按空格键无法跳跃的问题
你的问题核心是修改全局变量x不会影响已创建精灵的位置——这个x只是初始化恐龙时传入的参数,之后恐龙的位置完全由player.rect属性控制,和全局x没有任何关联。另外你写的x+=5是让数值变大,在Pygame坐标系里y值越大位置越靠下,这反而会让恐龙往下走,和你想要的跳跃(向上,y值减小)逻辑相反。
修改方案:
直接操作精灵的rect属性来改变位置,同时调整数值方向实现向上跳跃:
- 删掉全局变量
x,初始化恐龙时直接传入固定y值; - 在空格键事件中,修改
player.rect.center的y分量(或者直接修改player.rect.y)。
修改后的完整代码:
import pygame, sys, random from pygame.locals import QUIT class Player(pygame.sprite.Sprite): def __init__(self, picture_path, pos_x, pos_y): super().__init__() self.image = pygame.image.load(picture_path) self.rect = self.image.get_rect() self.rect.center = [pos_x, pos_y] class Weed(pygame.sprite.Sprite): def __init__(self, picture_path, pos_x, pos_y): super().__init__() self.image = pygame.image.load(picture_path) self.rect = self.image.get_rect() self.rect.center = [pos_x, pos_y] #general setup pygame.init() clock = pygame.time.Clock() screen = pygame.display.set_mode((400, 300)) pygame.display.set_caption('game') second_surface = pygame.Surface((400, 100)) second_surface.fill((4, 130, 40)) # 直接传入固定y值,不再用全局x player = Player('DinoSprites - tard.png', 40, 241) player_group = pygame.sprite.Group() player_group.add(player) weed_group = pygame.sprite.Group() for weed in range(3): new_weed = Weed('tumble_weed.png', random.randrange(80,400), 241) weed_group.add(new_weed) while True: screen.fill((168, 202, 255)) screen.blit(second_surface, (0, 250)) player_group.draw(screen) weed_group.draw(screen) for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: # 直接修改精灵rect的y值,减小y实现向上跳跃 player.rect.y -= 15 # 或者用center属性:player.rect.center[1] -= 15 pygame.display.update() clock.tick(15)
补充说明:
- Pygame的坐标系以左上角为原点(0,0),y轴向下递增,所以向上移动需要减小y值;
- 精灵的绘制位置完全由
rect属性决定,所有位置操作都要针对这个属性; - 如果之后要实现下落逻辑,可以给Player类添加一个速度属性,比如
self.velocity = 0,在循环里不断更新self.rect.y += self.velocity,再加上重力加速度的逻辑。
内容的提问来源于stack exchange,提问作者Sebstein
相关产品推荐
相关产品推荐

