自制Pygame游戏引擎渲染方块时遇pygame.Surface类型错误求助
问题解决:Pygame渲染方块时的TypeError错误
错误根源
你遇到的TypeError: argument 1 must be pygame.Surface, not Scene,核心原因有三个:
- Scene类未保存Surface引用:
start()方法里创建的screen是局部变量,Scene实例无法对外提供渲染用的Surface对象。 - Block初始化参数缺失/错误:Block类的构造函数需要传入
pygame.Surface类型的窗口对象,但测试代码里创建MrBox时要么没传这个参数,要么错误传入了Scene实例。 - Update方法定义错误:Block类的
Update()方法没有self参数,无法作为实例方法调用,且显示更新逻辑不属于单个Block,应该放在全局或Scene层面。
修正后的代码
1. 引擎代码(Mgine.py)
import pygame pygame.init() class Scene: def __init__(self, winwid, winhei, title): self.winwid = winwid self.winhei = winhei self.title = title self.screen = None # 提前初始化screen属性 def start(self): # 将screen保存为实例属性,方便外部访问 self.screen = pygame.display.set_mode((self.winwid, self.winhei)) pygame.display.set_caption(self.title) class Block: def __init__(self, color, x, y, width, tallness, win_surface): self.color = color self.x = x self.y = y # 若你需要初始y轴偏移可保留0-y,这里先修正为正常赋值 self.width = width self.tallness = tallness self.win_surface = win_surface # 明确接收Surface对象 def draw_block(self): # 直接用元组定义矩形区域,比pygame.Rect更简洁(效果一致) pygame.draw.rect(self.win_surface, self.color, (self.x, self.y, self.width, self.tallness)) # 全局的显示更新函数,负责刷新画面 def update_display(): pygame.display.flip() # flip和update选一个即可,flip是全屏幕刷新
2. 测试程序代码
import Mgine # 初始化场景 SceneA = Mgine.Scene(330, 430, "Tutorial 2 - A Box?") SceneA.start() # 创建方块时传入Scene的screen(正确的pygame.Surface对象) MrBox = Mgine.Block((100, 100, 50), 0, 0, 30, 30, SceneA.screen) # 游戏主循环(必须添加,否则窗口会瞬间关闭) running = True while running: # 处理退出事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 填充背景(避免绘制残留) SceneA.screen.fill((255, 255, 255)) # 绘制方块 MrBox.draw_block() # 更新显示 Mgine.update_display() # 退出Pygame pygame.quit()
关键说明
- 必须在
Scene类中保存screen属性,这样外部对象才能获取到正确的渲染Surface。 - 创建
Block时一定要传入Scene.screen,确保draw_block方法使用的是正确的Surface类型。 - 游戏必须包含主循环,处理事件、刷新画面,否则窗口会直接关闭。
内容的提问来源于stack exchange,提问作者charlee vonlinsowe
相关产品推荐
相关产品推荐

