Python 父变量名与子变量名不同
我正在写一个简单的乒乓球游戏。我希望我的桨和球对象都继承自DynamicObj,DynamicObj是一个父类,它有一个Python 父变量名与子变量名不同,python,default-arguments,Python,Default Arguments,我正在写一个简单的乒乓球游戏。我希望我的桨和球对象都继承自DynamicObj,DynamicObj是一个父类,它有一个update方法,该方法使用基本的简单Euler积分来确定位置。问题是桨对象的位置存储在一个rect中(因此使用rect.x访问x位置),而球对象的位置存储在一个x和y值中。有没有一种方法可以使它们都继承自同一个类,从而能够标记它们的位置 以下是我目前掌握的情况: class DynamicObj: def __init__(self, vel): se
update
方法,该方法使用基本的简单Euler积分来确定位置。问题是桨对象的位置存储在一个rect中(因此使用rect.x访问x位置),而球对象的位置存储在一个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
我正在考虑是否可以使用属性执行此操作 你是说,这个
class Paddle(DynamicObj):
def __init__(self, rect, vel):
self.x = rect.x
self.y = rect.y
self.vel = vel
编辑:
好的,我留下这个“答案”作为澄清…你是说,这个
class Paddle(DynamicObj):
def __init__(self, rect, vel):
self.x = rect.x
self.y = rect.y
self.vel = vel
编辑:
好的,我留下这个“答案”作为澄清…是的,会有帮助:
class Paddle(DynamicObj):
# ...
@property
def x(self):
return self.rect.x
现在,您的拨杆将有一个只读字段x
。如果你想要一个setter,用@x.setter
来装饰它
但我仍然认为你的想法是错误的。用矩形来操作通常要容易得多。如果您碰巧使用了pygame,它有许多简洁的方法。只需将每个对象都基于矩形类,或者使用统一的方法(即接口)即可
你会问,究竟为什么要用一个长方形来表示一个圆球?这是因为使用矩形进行粗略碰撞检测的成本很低(再次参见pygame的高效方法)。如果两个矩形没有碰撞,那么由它们包围的形状复杂的对象也肯定不会碰撞。只有当边界矩形发生碰撞时,您才需要运行可能更昂贵的精确碰撞检查。是,将有助于:
class Paddle(DynamicObj):
# ...
@property
def x(self):
return self.rect.x
现在,您的拨杆将有一个只读字段x
。如果你想要一个setter,用@x.setter
来装饰它
但我仍然认为你的想法是错误的。用矩形来操作通常要容易得多。如果您碰巧使用了pygame,它有许多简洁的方法。只需将每个对象都基于矩形类,或者使用统一的方法(即接口)即可
你会问,究竟为什么要用一个长方形来表示一个圆球?这是因为使用矩形进行粗略碰撞检测的成本很低(再次参见pygame的高效方法)。如果两个矩形没有碰撞,那么由它们包围的形状复杂的对象也肯定不会碰撞。只有当边界矩形发生碰撞时,您才需要运行可能更昂贵的精确碰撞检查。否,因为我仍然需要rect
对象的其他参数。人们通常讨厌多重继承,但我想说的是,事实就是这样:拨片既是动态对象又是矩形。否,因为我仍然需要rect
对象的其他参数。人们通常不喜欢多重继承,但我想说的是,事实就是这样:paile既是一个DynamicObject,也是一个rect。谢谢你的建议。是的,我知道一个解决方案是用矩形代表球的位置,但我觉得这会增加不必要的开销。此外,圆的碰撞检测比矩形便宜(不用比较4条边,只需比较两个圆之间的距离即可)。谢谢你的建议。是的,我知道一个解决方案是用矩形代表球的位置,但我觉得这会增加不必要的开销。此外,圆的碰撞检测比矩形便宜(不必比较4条边,只需比较两个圆之间的距离即可)。