Как вызвать функцию с обработчиком столкновений pymunk? - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь реализовать ИИ для решения простой задачи: переходить от А к В, избегая при этом препятствий.

До сих пор я использовал pymunk и pygame для создания среды, и это работает довольно хорошо.Но теперь я стою перед следующим шагом: чтобы получить награды за мой алгоритм обучения подкреплению, мне нужно обнаружить столкновение между игроком и, например, стеной.Или просто перезапустить среду, когда на стену / препятствие попадет.

Установка функции c_handler.begin равна функции Game.restart, которая помогла мне распечатать, что игрок действительно что-то ударил.

Но кроме print() я не могу получить доступ ни к какой другой функции, касающейся положения игрока, и я действительно не знаю, что делать дальше.

Так, как я могу использовать столкновение пимунка, чтобы перезапустить среду?Или есть другие способы сброса настроек или даже другие библиотеки для создания правильной среды?

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 голосов
/ 01 января 2019

В целом кажется, что вам было бы полезно немного прочитать о том, как классы работают в python, особенно о том, как работают переменные экземпляра класса.

В любом случае, если вы уже знаете, что хотите манипулировать переменной машины, вы можете сохранить ее в самом классе.Тогда, так как у вас есть self в методе restart, вы можете просто делать что угодно.

Или другой вариант - найти тело, которое вы хотите изменить, от арбитра, который передается в обратный вызов.

опция 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
...