2014-02-04 1 views
1

Я потратил много разочаровывающих часов и не могу понять это, я понимаю столкновение и работаю до тех пор, пока я не попытаюсь реализовать силу тяжести, я не могу настроить позицию игрока после того, как он попадает на карту плитки, падая через землю моя проблема, ось х вариацией следующего кода работает отличноTilemap Collision SFML C++

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 пиксель будет работать, но все это делает игрок спрайт отскочит вверх и вниз

+2

Это недостаточно информации или кода, чтобы рассказать вам, в чем проблема, но вы, вероятно, либо возвращаетесь в падающее состояние, либо имеете одноразовую проблему. –

+0

dauphic прав, нам действительно нужен рабочий минимальный пример кода, чтобы действительно решить проблему, но я все же дал ему попробовать, надеюсь, что это поможет! –

+0

Возможный дубликат [Collision C++ 2d game, предотвращающий вход игрока в плитку] (http://stackoverflow.com/questions/20777875/collision-c-2d-game-preventing-player-from-entering-tile) –

ответ

2

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

Тем не менее, первое, что вам нужно понять, это то, что вы не должны регулировать положение персонажа после его перемещения, но до его перемещения. Персонаж никогда не должен находиться в положении, «незаконном» в вашей игре. Даже на долю секунды.

У вас есть сила видеть будущее (по крайней мере, в вашей собственной игре), использовать его по своему усмотрению! Всегда будьте на шаг впереди.

Как найти нужное место?

Базовая алгебра!

Прошлая ситуация.

Collision Algebra

Цель здесь, чтобы найти, где зеленый и красный пунктир пересекают небольшую голубую пунктирную линию (которые представляют землю).

Во-первых, нам нужно найти уравнение траектории нашего персонажа (черная точка), которое должно выглядеть так: 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 проверок с помощью математики вещи.

+0

мой плеер размер составляет 64px в высоту 32px в ширину, каждая плитка 32x32px. Im только проверка столкновения плит, которые игрок касается, получая четыре угла игрока и видя, какие плитки он касается. что я не могу понять, как вычислить, если игрок касается плитки столкновения, прежде чем он это сделает. Я ценю ваш пример, но я стараюсь его понять. – Mystic

+0

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