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

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

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

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

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

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

https://github.com/ellmo/castellvania

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

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

1 ответ

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

Вот и все. Координаты формы добавляются в положение тела, а не вычитаются из него. В вашем 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)

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

Другие вопросы по тегам