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

Pygame绘制图形调用screen.blit报TypeError的问题求助

解决Pygame中TypeError: argument 1 must be pygame.Surface, not pygame.Rect的问题

嘿,我来帮你搞定这个报错!你遇到的问题根源很清晰:pygame.draw.circle()这个函数返回的是一个pygame.Rect对象(它代表了绘制的圆所在的矩形区域),但screen.blit()方法的第一个参数要求必须是pygame.Surface类型——这就是为什么你用实际图片(图片加载后是Surface)没问题,但用draw.circle就报错啦。

下面给你两种可行的解决方案,你可以根据需求选:

方案一:直接在函数内绘制圆(最简单)

既然pygame.draw.circle是直接在目标Surface(比如你的screen)上绘制图形,那我们可以把绘制逻辑直接放到ball函数里,不需要用blit:

pygame.init()
clock = pygame.time.Clock()
width_display, height_display = 500, 500  # 补全你可能定义过的窗口尺寸变量
screen = pygame.display.set_mode((width_display, height_display))
pygame.display.set_caption("Ballzy")

def ball(x, y):
    # 直接在screen上绘制红色圆形,参数依次是:目标表面、颜色、圆心坐标、半径
    pygame.draw.circle(screen, (255, 0, 0), (x, y), 36)

# 示例主循环
running = True
while running:
    screen.fill((0, 0, 0))  # 每次循环先清屏,避免图形重叠
    ball(250, 250)  # 调用函数在(250,250)位置画球
    pygame.display.flip()
    clock.tick(60)

方案二:创建Surface承载圆形(适合复用或加特效)

如果你需要重复使用这个圆形(比如多个相同的球),或者要给圆形加透明、阴影等特效,可以先创建一个独立的Surface来绘制圆,之后再用blit把它放到屏幕上:

pygame.init()
clock = pygame.time.Clock()
width_display, height_display = 500, 500
screen = pygame.display.set_mode((width_display, height_display))
pygame.display.set_caption("Ballzy")

# 创建一个带透明通道的Surface,尺寸要能容纳整个圆(直径72,所以72x72)
ball_surface = pygame.Surface((72, 72), pygame.SRCALPHA)
# 在这个Surface的中心绘制红色圆形
pygame.draw.circle(ball_surface, (255, 0, 0), (36, 36), 36)

def ball(x, y):
    # 注意:blit的位置是Surface的左上角,所以要把圆心坐标(x,y)转换成左上角坐标(x-36, y-36)
    screen.blit(ball_surface, (x - 36, y - 36))

# 示例主循环
running = True
while running:
    screen.fill((0, 0, 0))
    ball(250, 250)  # 传入圆心坐标,函数自动调整Surface位置
    pygame.display.flip()
    clock.tick(60)

两种方案的区别:

  • 方案一简单直接,适合不需要复用图形、每次都要重新绘制的场景;
  • 方案二更灵活,适合需要多次使用同一个图形,或者要给图形添加特效的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:42:36