如何使用pymunk的冲突处理程序调用函数?

时间:2019-01-01 16:10:56

标签: python pygame artificial-intelligence pymunk

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

到目前为止,我已经使用pymunkpygame来构建环境,并且效果很好。但是现在我面临下一步:要获得我的强化学习算法的奖励,我需要检测玩家与墙壁之间的碰撞。或者只是在碰到墙壁/障碍物时重新启动环境。

设置c_handler.begin功能等于Game.restart功能可以帮助我打印出玩家实际上击中了东西。

但是除了print()之外,我无法访问任何其他与玩家位置有关的功能,而且我真的不知道下一步该怎么做。

那么我该如何使用pymunk碰撞重新启动环境?还是有其他重置方式甚至其他库来构建适当的环境?

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
[...]  

1 个答案:

答案 0 :(得分:0)

通常来说,阅读一下类在python中的工作方式,特别是类实例变量的工作方式,似乎对您很有用。

无论如何,如果您已经知道要操纵car变量,则可以将其存储在类本身中。然后,由于您可以在重新启动方法中使用自助服务,因此您可以在那里执行任何操作。

或者,另一个选择是从传递给回调的仲裁器中找出要更改的主体。

选项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