父变量名与子变量名不同

2024-10-01 04:57:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个简单的乒乓球游戏。我希望我的padle和Ball对象都继承自DynamicObj,DynamicObj是一个父类,它有一个update方法,该方法使用基本的简单Euler积分来确定位置。问题是padle对象的位置存储在rect中(因此使用rect.x访问x位置),而Ball对象的位置存储在x和y值中。有没有办法让它们都继承自同一个类,这样就可以确定它们的位置?你知道吗

以下是我目前掌握的情况:

class DynamicObj:
    def __init__(self, vel):
        self.vel = vel
    def update(self, delta):
        self.x += self.vel.x * delta
        self.y += self.vel.y * delta

class Ball(DynamicObj):
    def __init__(self, x, y, radius, vel):
        self.x = x
        self.y = y
        self.radius = radius
        self.vel = vel

class Paddle(DynamicObj):
    def __init__(self, rect, vel):
        self.rect = rect
        self.vel = vel
        #what I want is to create self.x and self.y that respectively point to the same place as self.rect.x and self.rect.y

我在考虑用property做这个。你知道吗


Tags: to对象方法rectselfinitdefupdate
2条回答

是的,properties会有帮助:

class Paddle(DynamicObj):
    # ...
    @property
    def x(self):
        return self.rect.x

现在您的桨将有一个只读字段x。如果你想要一个setter,用@x.setter来装饰它。你知道吗

但我仍然认为你的想法是错误的。通常用矩形来操作要容易得多。如果您碰巧使用pygame,它有许多简洁的方法。只需使您的每个对象要么基于一个矩形类,要么有一个统一的方法来获取它(即,一个接口)。你知道吗

你会问,到底为什么要用长方形做圆球?这是因为使用矩形时,粗糙的碰撞检测成本很低(再次参见pygame的高效方法)。如果两个矩形不发生碰撞,那么由它们包围的形状复杂的对象也肯定不会发生碰撞。只有当包围的矩形发生碰撞时,才需要运行可能更昂贵的精确碰撞检查。你知道吗

你是说,这个?你知道吗

class Paddle(DynamicObj):
def __init__(self, rect, vel):
    self.x = rect.x
    self.y = rect.y
    self.vel = vel

编辑: 好吧,我留下这个“答案”作为澄清。。。你知道吗

相关问题 更多 >