如何使用 pymunk 的碰撞处理程序调用函数?

How to call a function with pymunk's collision handler?

我正在尝试实现一个 AI 来解决一个简单的任务:从 A 移动到 B,同时避开障碍物。

到目前为止,我使用 pymunkpygame 来构建环境,而且效果很好。但现在我面临下一步:为了获得强化学习算法的奖励,我需要检测玩家与墙壁之间的碰撞。或者只是在 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