2013-03-09 1 views
2

...плитки столкновение с раздвижными вдоль стен

Я получил мяч, что я могу передвигаться по карте, состоящей из одинакового размера плитки. Игрок не должен ходить над черепицей, которая темнее и имеет черную границу. У меня есть многомерный массив плиток, которые я использую, чтобы проверить, какие плитки являются сплошными.

Я хотел бы, чтобы игрок скользил по стене, если он двигается как по горизонтали, так и по вертикали. Проблема в том, что если он это делает, он приклеивается к стене. Мне удалось заставить его работать отлично на каждой оси, но отдельно. Вот мой код для горизонтальной проверки коллизий:

if (vx < 0) { 
    // checks for solid tiles left of the player 
    if (level.isBlocked(i, j) || level.isBlocked(i, jj)) { 
     x = side * (i + 1); // moves player to left side of tile 
     vx = 0; 
    } 
} else if (vx > 0) { 
    // checks for solid tiles right of the player 
    if (level.isBlocked(ii, j) || level.isBlocked(ii, jj)) { 
     x = (ii * side) - getWidth(); // moves player to right side of tile 
     vx = 0; 
    } 
} 

level.isBlocked() метод проверяет, что индекс массива занимает твердую плитку. i и j переменные - это индекс в массиве, в котором находится верхний правый угол игрока. ii и jj переменные - это индекс в массиве, в котором находится нижний правый угол игрока.

Это прекрасно работает, но если я добавить один и тот же кусок кода под но заменив х с у, Vx с иу и так далее проблема возникает. Поэтому я могу добавить горизонтальную или вертикальную обработку столкновений, и она работает, но не в одно и то же время. Я видел несколько статей, объясняющих, что я должен их отделять или что-то в этом роде, но я не очень разбирался в них. Как я могу проверить столкновение на обеих осях и сохранить эффект скольжения?

+0

Можете ли вы описать более подробно проблемное поведение) в зависимости от желаемого поведения? Похоже, игрок может двигаться (с инерцией) в любом направлении, и если игрок движется в верхний правый угол и сталкивается с вертикальной стеной, вы хотите, чтобы игрок продолжал двигаться вверх, но не правильно? Что происходит сейчас? – angelatlarge

+0

Если я двигаюсь влево и продолжаю двигаться после того, как я ударил стену, будет выполняться коллизионный код горизонтального кода и помешать мне пройти через стену. Если я тогда также перемещаю плеер, он выполняет горизонтальный и вертикальный коллизионный код, который заставляет игрока привязываться к верхнему левому углу плитки под тем, на котором он включен. То, что я хотел бы сделать, - это скользить по стене, чтобы он двигался вверх, точно так же, как вы описали. –

ответ

2

Я, наконец, получил его на работу. Ответ Angelatlarge был полезен для понимания проблемы, но я решил начать с нуля.Сначала я вычислил новую позицию x и y и сохранил их в отдельных переменных. Затем я проверил плитку под средним левым углом от игрока и тот же, что и средний справа. Затем я устанавливал логическое значение true, если игрок стоял на плитке из-за своей горизонтальной скорости. Если не было столкновения, я установил реальную переменную x в новую, которую я высчитал ранее. Затем я повторил то же самое для вертикального столкновения.

Это для горизонтальной проверки:

float newX = x + vx * delta; 
boolean xCollision = false; 
if (vx < 0) { 
    int i = level.toIndex(x); 
    int j = level.toIndex(y + getHeight()/2); 
    xCollision = level.isBlocked(i, j); 
} else if (vx > 0) { 
    int i = level.toIndex(x + getWidth()); 
    int j = level.toIndex(y + getHeight()/2); 
    xCollision = level.isBlocked(i, j); 
} 
if (!xCollision) x = newX; 
1

Проблема в том, что с настройкой у вас есть блок и позиция игрока, а также учитывая тот факт, что они перекрываются, вы не знаете, столкнулся ли игрок с вертикальной или горизонтальной стеной блока , Так увидеть это более четко рассмотреть следующий блок и два пути столкновения enter image description here

Верхний путь столкнется с левой стеной, и требует vx=0; (прекращения горизонтального движения), в то время как нижний путь сталкивается с нижней стенкой и потребуется vy=0; или остановка вертикального перемещения.

Я думаю, что для того, чтобы сделать вид обнаружения столкновения, который вам нужен, вам нужно будет вычислить пересечения пути игрока и стены блоков, а не только проверить, перекрывает ли игрок блок. Вы можете взломать желаемое поведение, вычислив перекрывающуюся прямоугольник прямоугольника игрока и прямоугольник блока. Рассмотрим следующую ситуацию:

enter image description here

, где красный seqare представляет плеер. Тот факт, что прямоугольник перекрытия (маленький прямоугольник, занятый, где игрок находится на вершине блока), шире, чем высокий предлагает, что это было вертикальное столкновение, а не горизонтальное. Однако это не является надежным. И по-прежнему требуется, чтобы вы имели доступ к форме , но не к простому, если часть прямоугольника игрока перекрывает блок.

+0

Хорошо, спасибо. Я поиграю с ним и посмотрю, смогу ли я заставить его работать. –