【发布时间】:2020-01-30 22:04:42
【问题描述】:
我为 Pygame 创建了一个名为 Thing 的类,稍后将对其进行子类化以开发更具体的类和对象。此类需要存储对象的位置和大小等属性。
然而,Pygame 有一个非常强大的名为Rect 的类,它已经可以做到这一点,并且有许多有用的内置方法和属性。我可以在我的Thing 类中使用单个Rect 属性,但它将位置存储在整数中,我希望将它存储在浮点数中(Thing 可能需要少移动每帧一个像素)。
这就是我的想法。
class Thing:
def __init__(self, pos, size):
self.x: float = pos[0]
self.y: float = pos[1]
self.size = size
@property
def rect(self):
return pygame.Rect((self.x, self.y), self.size)
@rect.setter
def rect(self, var: pygame.Rect):
self.x = var.x
self.y = var.y
self.size = var.size
这将允许我获取和设置Thing 的Rect,但我无法根据需要使用Rect 的内置设置器:
foo = Thing((10, 10), (20, 20))
foo.draw(win)
foo.x += 100
foo.draw(win)
# This has no effect
foo.rect.y += 100
foo.draw(win)
temp = foo.rect
temp.x -= 100
foo.rect = temp
foo.draw(win)
上述代码的期望行为是让方块向右移动,向下,然后向左移动。
有没有办法:
- 将
Rect用作Thing属性,但在更改时更新x和y? - 将方法应用于
Rect属性 - 您能想到的其他一些解决方案
TL;DR:如果我有 Rect 作为属性,我不能做 self.rect.center = (500,500)
提前致谢!
【问题讨论】:
-
您的属性有点奇怪,因为每次访问它时它都会返回一个新的
Rect实例,而不是返回Thing的现有 部分。 -
是的!那是因为我必须分别跟踪
x和y以便将位置存储在浮点数中。但我也想使用Rect方法来检测碰撞,获取和设置中心坐标等。 -
@SamuelCabrera 如果您只需要中心坐标,那么也可以创建一个
center属性。
标签: python methods properties pygame