是否可以调整 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
我正在尝试使用 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