You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 23:06:27