【问题标题】:Parent has different variable name than child父级的变量名与子级不同
【发布时间】:2012-09-18 16:03:17
【问题描述】:

我正在编写一个简单的 Pong 游戏。我希望我的 Paddle 和我的 Ball 对象都继承自 DynamicObj,这是一个父类,它有一个 update 方法,它使用基本的简单欧拉积分来标记位置。问题是 Paddle 对象的位置存储在 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 一起做这件事。

【问题讨论】:

    标签: python default-arguments


    【解决方案1】:

    是的,properties 会有所帮助:

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

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

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

    到底为什么,你会问,一个圆形球应该使用矩形吗?这是因为 粗略 碰撞检测对于矩形来说很便宜(再次参见 pygame 的有效方法)。如果两个矩形不发生碰撞,那么由它们包围的形状复杂的对象也肯定不会发生碰撞。只有当边界矩形发生碰撞时,您才必须运行可能更昂贵的精确碰撞检查。

    【讨论】:

    • 感谢您的建议。是的,我知道一种解决方案是使用矩形来表示球的位置,但我觉得这会增加不必要的开销。此外,圆的碰撞检测比矩形更便宜(不必比较 4 个边,只需比较两个圆之间的距离)。
    【解决方案2】:

    你是说,这个?

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

    编辑: 好的,所以我会留下这个“答案”作为澄清......

    【讨论】:

    • 不行,因为我还需要rect对象的其他参数。
    • 人们通常讨厌多重继承,但我想说的是:Paddle 既是 DynamicObject 又是 rect。
    猜你喜欢
    • 1970-01-01
    • 2020-06-10
    • 2022-11-11
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    相关资源
    最近更新 更多