如何使用 pymunk 的碰撞处理程序调用函数?
How to call a function with pymunk's collision handler?
我正在尝试实现一个 AI 来解决一个简单的任务:从 A 移动到 B,同时避开障碍物。
到目前为止,我使用 pymunk
和 pygame
来构建环境,而且效果很好。但现在我面临下一步:为了获得强化学习算法的奖励,我需要检测玩家与墙壁之间的碰撞。或者只是在 wall/obstacle 被击中时重新启动环境。
设置 c_handler.begin
函数等于 Game.restart
函数帮助我打印出玩家实际击中了东西。
但是除了 print()
之外,我无法访问有关玩家位置的任何其他功能,而且我真的不知道下一步该做什么。
那么如何使用pymunk collision来重启环境呢?还是有其他方法可以重置甚至其他库来构建合适的环境?
def restart(self, arbiter, data):
car.body.position = 50, 50
return True
def main(self):
[...]
c_handler = space.add_collision_handler(1,2)
c_handler.begin = Game.restart
[...]
一般来说,阅读一下 classes 在 python 中的工作原理似乎对您很有用,尤其是 class 实例变量的工作原理。
无论如何,如果您已经知道要操作 car 变量,则可以将其存储在 class 本身中。然后,由于您在重启方法中可以使用自己,因此您可以在那里做任何事情。
或者,另一种选择是从传递给回调的仲裁器中找出要更改的正文。
选项 1:
class MyClass:
def restart(self, space, arbiter, data):
self.car.body.position = 50,50
return True
def main(self):
[...]
self.car = car
c_handler = space.add_collision_handler(1,2)
c_handler.begin = self.restart
[...]
选项 2:
def restart(space, arbiter, data):
arbiter.shapes[0].body.position = 50,50
# or maybe its the other shape, in that case you should do this instead
# arbiter.shapes[1].body.position = 50,50
我正在尝试实现一个 AI 来解决一个简单的任务:从 A 移动到 B,同时避开障碍物。
到目前为止,我使用 pymunk
和 pygame
来构建环境,而且效果很好。但现在我面临下一步:为了获得强化学习算法的奖励,我需要检测玩家与墙壁之间的碰撞。或者只是在 wall/obstacle 被击中时重新启动环境。
设置 c_handler.begin
函数等于 Game.restart
函数帮助我打印出玩家实际击中了东西。
但是除了 print()
之外,我无法访问有关玩家位置的任何其他功能,而且我真的不知道下一步该做什么。
那么如何使用pymunk collision来重启环境呢?还是有其他方法可以重置甚至其他库来构建合适的环境?
def restart(self, arbiter, data):
car.body.position = 50, 50
return True
def main(self):
[...]
c_handler = space.add_collision_handler(1,2)
c_handler.begin = Game.restart
[...]
一般来说,阅读一下 classes 在 python 中的工作原理似乎对您很有用,尤其是 class 实例变量的工作原理。
无论如何,如果您已经知道要操作 car 变量,则可以将其存储在 class 本身中。然后,由于您在重启方法中可以使用自己,因此您可以在那里做任何事情。
或者,另一种选择是从传递给回调的仲裁器中找出要更改的正文。
选项 1:
class MyClass:
def restart(self, space, arbiter, data):
self.car.body.position = 50,50
return True
def main(self):
[...]
self.car = car
c_handler = space.add_collision_handler(1,2)
c_handler.begin = self.restart
[...]
选项 2:
def restart(space, arbiter, data):
arbiter.shapes[0].body.position = 50,50
# or maybe its the other shape, in that case you should do this instead
# arbiter.shapes[1].body.position = 50,50