Pygame按下按键精灵不移动退出 报blit无效目标位置错误
错误原因
报错TypeError: invalid destination position for blit的直接触发原因是Rect.move_ip()方法的用法错误:
move_ip()是pygame.Rect的原地修改方法,调用后会直接修改当前Rect对象的坐标,返回值为None。
原代码中写了player_rect = player_rect.move_ip(0,5),按下空格触发这行代码后,原本存储Rect对象的player_rect变量会被赋值为None,后续执行screen.blit(player, player_rect)时传入None作为绘制坐标,就会触发参数类型错误,直接崩溃。
除此之外现有代码的跳跃逻辑也存在设计问题:
- 按下空格仅单次向下移动5像素,没有起跳、重力下落、落地的完整跳跃流程
- 没有地面碰撞判定,角色移动后无法回到初始站立位置
- 没有做跳跃状态限制,会出现空中重复触发跳跃的问题
修复后可正常运行的代码
import pygame from sys import exit pygame.init() # 基础配置 screen = pygame.display.set_mode((800,400)) pygame.display.set_caption('Shooter Mania') text = pygame.font.Font(None, 50) clock = pygame.time.Clock() GROUND_Y = 300 # 地面高度常量 player_gravity = 0 # 玩家重力值,用于模拟跳跃下落 # 资源加载 bg = pygame.image.load('background.png') player = pygame.image.load('player.png').convert_alpha() player_rect = player.get_rect(midbottom=(80, GROUND_Y)) score_surf = text.render('SCORE:', False, 'white') score_rect = score_surf.get_rect(center=(400,50)) enemy = pygame.image.load('enemy.png').convert_alpha() enemy_rect = enemy.get_rect(bottomright=(600,GROUND_Y)) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() elif event.type == pygame.KEYDOWN: # 仅在角色站在地面时响应空格跳跃 if event.key == pygame.K_SPACE and player_rect.bottom >= GROUND_Y: player_gravity = -18 # 给向上的起跳初速度 print('Jump') # 绘制背景 screen.blit(bg, (0,0)) pygame.draw.rect(screen, 'Pink',score_rect) screen.blit(score_surf,score_rect) # 敌人移动逻辑 enemy_rect.x -= 4 if enemy_rect.right <= 0: enemy_rect.left = 800 screen.blit(enemy,enemy_rect) # 玩家跳跃&重力逻辑 player_gravity += 1 # 每帧累加重力 player_rect.y += player_gravity # 落地判定 if player_rect.bottom >= GROUND_Y: player_rect.bottom = GROUND_Y player_gravity = 0 screen.blit(player, player_rect) pygame.display.update() clock.tick(60)
关键修改说明
- 修复核心报错:删除了错误的
move_ip()返回值赋值操作,从根源上避免player_rect被置为None的问题 - 实现物理跳跃效果:通过重力值累加模拟自然下落,起跳时给向上的负速度实现起跳动作,跳跃手感可以通过修改起跳初速度(当前为-18)、重力增量(当前为每帧+1)调整
- 增加落地校验:角色落到地面高度时自动校正位置,避免掉出屏幕
- 增加跳跃状态限制:只有角色处于地面时才响应空格,默认实现单段跳跃,需要多段跳可修改对应判定条件
内容的提问来源于stack exchange,提问作者Josh Wenner
相关产品推荐
相关产品推荐

