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
相关产品推荐
相关产品推荐

