class snake:
def __init__(self, x, y, width, height):
self.x = x
self.y = y
self.width = width
self.height = height
self.change_x = 0
self.change_y = 0
class food:
def __init__(self, food_x, food_y, food_width, food_height):
self.x = food_x
self.y = food_y
self.width = food_width
self.height = food_height
def collition_detection(self):
pass
我希望能够从蛇类到食品类访问位置(x,y),以便当我在食品类中执行“ collition_detection”功能时,不会对我说“ self.x”是一个错误没有定义的。谢谢。
答案 0 :(得分:3)
您可以在方法中采用参数:
class food:
def __init__(self, food_x, food_y, food_width, food_height):
self.x = food_x
self.y = food_y
self.width = food_width
self.height = food_height
def collition_detection(self, s):
""" Return whether this food particle collides with the object `s`. """
delta_x = math.abs(self.x - s.x)
delta_y = math.abs(self.y - s.y)
return (delta_x < (self.width + s.width) / 2) and (delta_y < (self.height + s.height) / 2)
更好的方法可能是定义一个对任何两个对象都有效的函数。这样,您可以将功能扩展到具有属性x
,y
,height
,width
的任何类。
def is_collision(obj1, obj2):
""" Return whether obj1 and obj2 collide. """
delta_x = math.abs(obj1.x - obj2.x)
delta_y = math.abs(obj1.y - obj2.y)
return (delta_x < (obj1.width + obj2.width) / 2) and (delta_y < (obj1.height + obj2.height) / 2)
然后可以按以下方式调用它:
s = Snake(...)
f_particle = food(...)
is_collision(s, f_particle)
答案 1 :(得分:2)
您必须实例化该类。然后,您可以使用其方法和功能,但不能使用其变量。在类中创建一个返回所需内容的函数,从另一个(或主程序)中实例化该类并获取返回的值。
这里有个例子:
class A:
def m(self, x, y):
return x + y
class B:
def __init__(self):
self.a = A()
def call_a(self):
a = self.a.m(1, 2)
return a
c = B()
result = c.call_a()
print(result)
答案 2 :(得分:2)
一个简单的解决方法是将位置设置为类变量(在蛇的所有实例之间共享)。您只需将其声明为:
class snake:
common_x = None
common_y = None
def __init__(self, x, y, width, height):
common_x = x
common_y = y
self.width = width
self.height = height
这些变量在蛇的所有实例之间共享,可以通过snake.common_x
或snake1 = snake(args); snake1.common_x
这回答了您关于如何从另一个类访问这些变量的问题。话虽如此,我建议您不要这样做,因为以后您可能会遇到问题。首先,这使您在游戏中只能有一条蛇。可以通过在班上列出一个位置来解决此问题,但我仍然不认为这是一种优雅的方法。我认为最好再开一个课,例如跟踪所有游戏对象的“游戏”。该课程将列出蛇,食物,敌人(?),以及您想要添加的内容。然后,您可以将所有元素连接到游戏实例,这就是它们能够进行通信的方式。
class game:
def __init__(snakes=[], food=[]):
self.snakes = snakes
self.food = food
class snake:
def __init__(x,y,game):
self.x = x
self.y = y
self.game = game
self.game.snakes.append(self)
class food:
def __init__(self,...):
....
def collide(self):
for snake in self.game.snakes:
if self.x == snake.x and self.y == snake.y:
# do collision handling
这只是如何解决此问题的一个示例,我不确定,如果通过食物对象完成碰撞处理确实是最好的方法,但是我想您会明白的。