【发布时间】:2020-04-24 10:51:57
【问题描述】:
我正在尝试构建一个需要用户绘制东西的应用程序。
为此,我创建了一个画布(一个 pygame.Surface 对象),在该画布上注册了绘图,然后将其粘贴到窗口上。我希望画布是 infinite,这样当用户滚动时他可以继续绘图(当然只有一小部分画布会显示在窗口上)。但是,实际上,pygame 中的 Surface 需要有限的宽度和高度,最重要的是,它并没有那么大! (我认为那是因为它实际上锁定了内存中的空间)。
所以,我尝试创建块:每个块都有固定的大小(例如,屏幕大小的两倍),并且为每个块分配了一个特定的表面。块是按需动态创建的,总体上运行良好。
我的问题是,当我尝试绘制跨越多个块的线时,需要付出很大的努力来计算该线实际上应该绘制到哪些块上,以及应该在哪些部分中断开。我什至没有尝试绘制矩形,因为真的让“画线”功能工作起来很痛苦。
那时我认为我所做的从根本上是错误的:与其尝试重写所有 pygame.draw 和 pygame.gfxdraw 函数以便它们基本上执行每个块的工作,我真的应该重载 pygame.Surface (例如,创建 Surface 的 MySurface 子类)因此,每当修改像素时,我都会在内部选择它所属的块并实际在该块上更改它,并将新的 Surface 对象传递给 pygame 函数。
我在the pygame doc 进行了很多搜索,但没有说明如何执行此操作。我什至不知道当我对它进行 blit/draw 时,内部调用了 Surface 对象的哪些方法!我也用谷歌搜索了它,但没有发现有人试图做那种事情(也许我走错路了?)。
所以,我的问题是:这是正确的方法吗?如果是,我应该如何实现?
我不发布代码,因为我需要更多的是解释在哪里可以找到我尝试做的文档,而不是代码审查。
【问题讨论】:
标签: python-3.x pygame pygame-surface