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

自制Pygame游戏引擎渲染方块时遇pygame.Surface类型错误求助

问题解决:Pygame渲染方块时的TypeError错误

错误根源

你遇到的TypeError: argument 1 must be pygame.Surface, not Scene,核心原因有三个:

  1. Scene类未保存Surface引用:start()方法里创建的screen是局部变量,Scene实例无法对外提供渲染用的Surface对象。
  2. Block初始化参数缺失/错误:Block类的构造函数需要传入pygame.Surface类型的窗口对象,但测试代码里创建MrBox时要么没传这个参数,要么错误传入了Scene实例。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 02:45:36