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

Pygame报错TypeError:参数应为Surface而非Rect,求修复方案

Pygame报错:TypeError: argument 1 must be pygame.Surface, not pygame.Rect 修复方案

运行代码时返回错误:

TypeError: argument 1 must be pygame.Surface, not pygame.Rect

卡壳在player = pygame.Rect(450, 100, ogplayerx, ogplayery)这部分,原代码如下:

import pygame
import os

pygame.init()

width, length = 900, 500
MAX = pygame.display.set_mode((width, length))

FPS = 60
vel = 5
grav = 3


player = pygame.image.load(os.path.join("first rpg game", "player.png")).convert_alpha()
ogplayerx = 450
ogplayery = 450

def draw_windows(player):
    MAX.fill((0,0,0))
    pygame.draw.rect(MAX, (0,0,0), player)
    
    MAX.blit(player, (player.x, player.y))
    pygame.display.flip()
    
    pygame.display.update()


def main():
    player = pygame.Rect(450, 100, ogplayerx, ogplayery)
    

    clock = pygame.time.Clock()
    run = True
    while run:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
                
            keys_pressed = pygame.key.get_pressed()
            if keys_pressed[pygame.K_a]: # left
                player.x -= vel
            if keys_pressed[pygame.K_d]: # right
                player.x += vel
            if keys_pressed[pygame.K_SPACE]: #jump
                player.y -= grav
                if player.y >= playery + 13:
                    player.y += grav
                    if playery >= 450:
                        playery = 450
            

        keys_pressed = pygame.key.get_pressed( )
        draw_windows(player)
    
    pygame.quit()
    
if __name__ == "__main__":
    main()

修复思路与步骤

核心问题

你混淆了pygame.Surface(玩家图像)和pygame.Rect(玩家位置/碰撞区域)的角色:

  • 全局变量player是加载的图像(Surface类型)
  • main函数里重新定义了同名的player变量,类型是Rect
  • 调用draw_windows(player)时传入的是Rect,而MAX.blit()要求第一个参数必须是Surface,因此触发报错

具体修复

  1. 区分图像与矩形变量:将main里的player矩形重命名为player_rect,避免和全局图像变量冲突
  2. 修改绘制函数参数:draw_windows需要同时接收图像Surface和位置Rect
  3. 修正跳跃逻辑:移除未定义的playery变量,改用player_rect.y控制位置,并补充地面碰撞逻辑
  4. 清理冗余代码:移除同色的pygame.draw.rect调用,以及重复的pygame.display.update()
  5. 优化按键检测:将按键检测移出事件循环,避免重复触发

修复后的完整代码

import pygame
import os

pygame.init()

width, length = 900, 500
MAX = pygame.display.set_mode((width, length))

FPS = 60
vel = 5
grav = 3
# 玩家图像(Surface)
player_img = pygame.image.load(os.path.join("first rpg game", "player.png")).convert_alpha()
# 获取图像原始尺寸,用来创建矩形
ogplayerx = player_img.get_width()
ogplayery = player_img.get_height()

def draw_windows(player_img, player_rect):
    MAX.fill((0,0,0))
    # 绘制玩家图像,直接传入矩形作为位置参数
    MAX.blit(player_img, player_rect)
    pygame.display.flip()


def main():
    # 玩家位置矩形,用图像尺寸初始化宽高
    player_rect = pygame.Rect(450, 100, ogplayerx, ogplayery)
    # 地面高度,限制玩家下落范围
    ground_y = length - ogplayery

    clock = pygame.time.Clock()
    run = True
    while run:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

        # 按键检测放在事件循环外,保证持续响应
        keys_pressed = pygame.key.get_pressed()
        if keys_pressed[pygame.K_a]: # 左移
            player_rect.x -= vel
        if keys_pressed[pygame.K_d]: # 右移
            player_rect.x += vel
        if keys_pressed[pygame.K_SPACE]: # 跳跃
            player_rect.y -= grav * 2
        # 重力下落,限制在地面以上
        player_rect.y += grav
        if player_rect.y >= ground_y:
            player_rect.y = ground_y

        draw_windows(player_img, player_rect)
    
    pygame.quit()
    
if __name__ == "__main__":
    main()

内容的提问来源于stack exchange,提问作者Jayr Stephen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:27:24