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,因此触发报错
具体修复
- 区分图像与矩形变量:将
main里的player矩形重命名为player_rect,避免和全局图像变量冲突 - 修改绘制函数参数:
draw_windows需要同时接收图像Surface和位置Rect - 修正跳跃逻辑:移除未定义的
playery变量,改用player_rect.y控制位置,并补充地面碰撞逻辑 - 清理冗余代码:移除同色的
pygame.draw.rect调用,以及重复的pygame.display.update() - 优化按键检测:将按键检测移出事件循环,避免重复触发
修复后的完整代码
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
相关产品推荐
相关产品推荐

