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

В последнее время я пытаюсь создать то, что всегда хотел, но никогда не имел ни навыков, ни времени - компьютерную игру. Если быть точнее, дань уважения/клон одной из многих моих любимых игр. Чтобы начать с чего-то простого, я решил создать классическую 2D-платформу на основе серии Castlevania.

Будучи программистом на Ruby, я решил использовать Gosu. Затем я решил, что не хочу изобретать велосипед, поэтому я собираюсь использовать Chipmunk.

Через несколько дней у меня возникли необъяснимые проблемы с обнаружением столкновений. Я добавил функции рисования граничных рамок, просто чтобы посмотреть, что, черт возьми, происходит.

введите здесь описание изображения

Как видите, Бельмонт сталкивается с блоками стен, которых он и близко не касается. Поскольку демонстрационная игра, включенная в gosu gem, работает нормально, должно быть, я делаю что-то не так, я, вероятно, не совсем понимаю, как определяется и добавляется в пространство полигон Shape. Я почти уверен, что на самом деле это не то место, где я его рисую.

В игре есть общедоступный репозиторий, так что вы можете увидеть, как определены стены (Brush < Entity) и игрок (Player < Entity), и что они действительно имеют простую форму прямоугольного многоугольника. Стены не добавляются в пространство (они разбойничьи), добавляется только игрок. Я пытался отладить игру и посмотреть, где находится body, но все выглядело нормально.

https://github.com/ellmo/castellvania

Игрок падает медленно, но вы можете управлять им стрелками вверх/влево/вправо. Кнопка с тильдой (~) показывает ограничивающие поля, а поля столкновений должны быть всегда видны.

Мне нужна помощь, чтобы понять, что я делаю неправильно.


person ellmo    schedule 08.04.2013    source источник


Ответы (1)


Я, вероятно, действительно не понимаю, как многоугольник Shape определяется и добавляется в пространство. Я почти уверен, что на самом деле это не то место, где я его рисую.

Вот и все. Координаты формы добавляются к положению тела, а не вычитаются из него. В вашем Entity.boundaries замените строку

verts << CP::Vec2.new(@shape.body.p.x - @shape[vert].x, @shape.body.p.y - @shape[vert].y)

с участием

verts << CP::Vec2.new(@shape.body.p.x + @shape[vert].x, @shape.body.p.y + @shape[vert].y)

и вы получите правильное изображение. (рисунок все равно будет нарушен, но ограничивающие рамки будут правильными.

person kipar    schedule 16.05.2013