Я потратил много разочаровывающих часов и не могу понять это, я понимаю столкновение и работаю до тех пор, пока не попытаюсь реализовать гравитацию. Кажется, я не могу определить положение игрока после того, как он достигнет карты тайлов, падение через землю — моя проблема, ось х вариант следующего кода работает нормально
if (background.colMap[tiles[i].y][tiles[i].x] == 1)
{
playerSpeed.y = -0.f;
playerSprite.setPosition(playerSprite.getPosition().x, playerSprite.getPosition().y - 1);
inAir = false;
}
Я, хотя, уменьшив скорость до 0 и отбросив игрока на 1 пиксель, сработал бы, но все, что он делает, это спрайт игрока отскакивает вверх и вниз
Учитывая вышеприведенную информацию, я предполагаю, что вы играете в игру с боковой прокруткой, и ваш персонаж сталкивается с вершиной плитки.
Тем не менее, первое, что вам нужно понять, это то, что вы не должны корректировать положение персонажа после его перемещения, но до его перемещения. Никогда не предполагается, что персонаж находится в «нелегальном» положении в вашей игре. Даже на долю секунды.
У вас есть возможность видеть будущее (по крайней мере, в вашей собственной игре), используйте его по своему желанию! Всегда будь на шаг впереди.
Основная алгебра!
Вот ситуация.
Цель в том, чтобы найти, где зеленая и красная пунктирная линия пересекают маленькую синюю пунктирную линию (которая представляет землю).
Сначала нам нужно найти уравнение траектории нашего символа (черная точка), которая должна выглядеть следующим образом: y = ax + b
,
Где склон a = (Y2 - Y1)/(X2 - X1)
а также b = y - ax
,
В нашем примере, уравнение y = -2x + 10
, Нам просто нужно знать, каково значение X, когда Y = 3
, который мы можем найти с x = (y - b) / a
и в нашем случае x = (3 - 10) / (-2) = 3.5
,
Итак, теперь мы знаем, что наш персонаж будет пересекаться с полом в (3.5, 3)
и вот куда мы поместим персонажа.
Когда вы сталкиваетесь, вы поднимаете символ на 1 пиксель, если я правильно понимаю ваш код.
Представьте, что ваш персонаж движется очень быстро, и за одно обновление своей позиции он переходит из действительной позиции в недопустимую, на 25 пикселей ниже уровня земли. С вашей текущей техникой потребуется не менее 25 обновлений позиции, чтобы вернуться на землю или, может быть, всего 25 петель обнаружения столкновений, но, тем не менее, это не очень эффективно.
Другое дело, что вы, кажется, зацикливаете все возможные тайлы на уровне, так что это, вероятно, в основном пустые тайлы и / или тайлы с полной землей (недоступные), что сильно увеличивает затраты на то, что вам действительно нужно.
Лучшим вариантом будет сохранить координаты встречных плиток и просто перебрать их.
Если у вас есть экран, скажем, 50 x 50 плиток, и есть только 25 встречных плиток, вы все еще проверяете 50 * 50 - 25 = 2475
плитки, и это 2475 ненужных проверок. Но очевидно, что это не причина, по которой у вас возникают проблемы, даже эти 2475 ненужных проверок не сломают логику.
И просто поиграть с числами, так как наш персонаж на 25 пикселей ниже, мы зациклим 25 раз 2500 плиток, что составляет 62500 проверок вместо 25 * 25 = 625
с коллекцией коллекционных плиток, или только 25 проверок с математическим материалом.
Других решений пока нет …