是否可以调整 class 继承 pygame Surface 的实例的大小?

Is it possible to resize an instance of a class inheriting pygame Surface?

我正在尝试使用 pygame 制作 GUI 个元素(我知道这很奇怪,但它们将在 pygame 制作的游戏中使用)。这是一段非常简化的代码,说明 UI 元素 class 在我的代码中的样子:


import pygame
from typing import Tuple


class UIElement(pygame.Surface):

    def __init__(self, size: Tuple[int, int]) -> None:
        super().__init__(size)

        self.children = {}

    def draw(self) -> None:
        ...

请注意 class 只是 pygame.Surface class 的扩展。现在,我想做的是使这些元素可调整大小,例如,如果大小不是先验知识,则实现具有此签名的方法:


def resize(self, size: Tuple[int, int]) -> None:
    ...

但是,pygame 不允许就地调整 Surface 对象的大小,这迫使我创建一个具有正确大小的新 UIElement 实例。我希望这个新实例是我的第一个实例的副本,除了 pygame.Surface 的大小,这个新实例应该替换第一个实例。我如何使用我的 resize 方法从第一个实例中做到这一点?

我查看了 copy 模块,但它似乎不适合我的问题。

此外,我知道向我的 class 添加一个 surface 属性似乎更简单,它会保存 pygame.Surface 对象,并为此设置一个新值在需要时添加属性,但这会迫使我进行大量的架构重新设计工作,我宁愿避免它。

如果您对如何解决我的问题有任何想法,我将不胜感激。

不,你不能。我建议使用简单的方法。 UIElement 不应是 pygame.Surface 的子类。 pygame.Surface 对象应该只是 UIElement 的一个属性。你所有的问题都是遗传造成的。

A pygame.Surface object cannot be resized. A Surface is just a proxy object for an internally managed, SDL surface object with immutable size. PyGame has no API to change the object under the hood. All you can do is to create a new Surface with a different size and use pygame.transform.scale()设置缩放后的内容 Surface:

class UIElement(pygame.Surface):
    # [...]

    def resize(self, size):
        scaled_element = UIElement(size)
        pygame.transform.scale(self, size, scaled_element) 
        scaled_element.children = self.children
        return scaled_element