2013-04-08 9 views
0

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

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

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

enter image description here

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

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

https://github.com/ellmo/castellvania

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

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

ответ

0

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

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

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