У меня были замечательные забавные времена, связанные с 2D обнаружением столкновений. То, что кажется простой проблемой, может легко стать кошмаром, если вы не планируете ее заранее.
Лучший способ сделать это в ОО-смысле - создать общий объект, например classMapObject. Это имеет координату положения и наклон. Из этого вы можете расширить его, чтобы включить другие формы и т. Д.
Исходя из этого, давайте работать с столкновениями с объектом Solid. Предполагая только блок, скажем, 32x32, , вы можете ударить его слева, справа, сверху и снизу . Или, в зависимости от того, как вы кодируете, нажимайте на него сверху и слева одновременно. Так как же определить, каким образом персонаж должен идти? Например, если персонаж ударяет по блоку сверху, чтобы стоять на нем, закодированный неправильно, вы можете непреднамеренно оттолкнуть его в сторону.
Итак, что ты должен делать? Что я сделал для своей 2D-игры, я посмотрел на предыдущее положение человека, прежде чем решить, как реагировать на столкновение. Если позиция Y персонажа + Высота выше блока и движется на запад, то я бы сначала проверил верхнее, а затем левое. Однако, если позиция Y персонажа + высота ниже вершины блока, я бы проверил левое столкновение.
Теперь, допустим, у вас есть блок с наклоном. Ширина блока составляет 32 пикселя, высота 32 пикселя при x = 32, высота 0 пикселов при x = 0. При этом вы ДОЛЖНЫ предположить, что персонаж может ударить и столкнуться только с этим блоком сверху, чтобы стоять на нем. С этим блоком вы можете вернуть ЛОЖНОЕ столкновение, если это столкновение влево / вправо / вниз , но если это столкновение сверху, вы можете указать, что если символ находится в точке X = 0, вернуть точку столкновения Y = 0. Если X = 16, Y = 16 и т. Д.
Конечно, это все относительно. Вы будете проверять несколько блоков, поэтому вам нужно сохранить все возможные изменения направления персонажа во временную переменную. Таким образом, если персонаж перекрывает блок на 5 в направлении X, вычтите 5 из этой переменной. Соберите все возможные изменения в направлениях X и Y, примените их к текущей позиции персонажа и сбросьте их на 0 для следующего кадра.
Удачи. Я мог бы предоставить больше образцов позже, но я на своем Mac (мой код на WinPC). Это тот же тип обнаружения столкновений, который используется в классических играх Mega Man IIRC. Вот видео этого в действии также: http://www.youtube.com/watch?v=uKQM8vCNUTM