2D Box-Collisions, Platformer, мой игрок "зависает" над блоками - PullRequest
2 голосов
/ 25 мая 2011

Если я установлю переменную hspeed (горизонтальная скорость) моего игрока на достаточно медленную скорость, затем, когда он преодолеет разрыв 16x16 блоков, он провалится, как и планировалось. Однако, если я установлю переменную «hspeed» достаточно высоко, он пойдет так быстро, что парит над ней. Несмотря на то, что он работает, когда я устанавливаю его на медленную скорость, он слишком медленный .

Вот пример: http://img199.imageshack.us/img199/2685/demondj.png

Вот мой код столкновения (просматривает список блоков):

for(unsigned int i = 0; i<blocks.size(); i++){
Block &b = blocks.at(i);
if(!b.passable){
    //Check if we are on the sides
    if(y + height + vspeed >= b.worldY+2 && y + vspeed <= b.worldY+b.height)
    {
        //Right side
        if(x + hspeed <= b.worldX+b.width+1  && x + hspeed > b.worldX+b.width + hspeed-1)
        {
         x = b.worldX + b.width; hspeed = 0;
        }
        //Left side    
        if(x + width + hspeed >= b.worldX +1 && x + width + hspeed <= b.worldX + hspeed + 1)
        {
         x = b.worldX - width; hspeed = 0;
        }
    }

    //Check if we are on the top or the bottom
    if(x + width + hspeed >= b.worldX+1 && x + hspeed <= b.worldX+b.width-1)
    {
        if(y + height + vspeed >= b.worldY && y + height + vspeed <= b.worldY + vspeed + 1 && jumpstate=="falling")
            {
            y = b.worldY - height; jumpstate.assign("ground"); vspeed = 0;
            }

        if(y + vspeed <= b.worldY + b.height && y + vspeed >= b.worldY + b.height + vspeed + 1 && jumpstate=="jumping")
        {
        y = b.worldY + b.height; jumpstate.assign("falling"); vspeed = 0;
        }
    }

}

}

У меня есть проблема в моем коде столкновения? Другая проблема в том, что когда я ударяю по нижней части блока, это немного сбивает с толку. Он должен отскочить от этого, и он делает, но он дрожит, если он движется, и он ударяет по нижней части блока.

1 Ответ

2 голосов
/ 25 мая 2011

Хорошо, здесь есть несколько вещей:

1) Слишком много магических чисел. Не уверен, что именно означают +2, +1 и т. Д. Я хотел бы видеть их как константы. Кроме того, я параноик по поводу порядка операций, поэтому я бы заключил все в круглые скобки, на всякий случай:)

2) Не знаете, какие у вас типы. Предполагается, что поплавки, но они чувствуются как целые.

3) Большая проблема, ваш код в том виде, в котором он разработан, не будет правильно обрабатывать "большую" скорость Что-то, движущееся быстрее, чем ширина / высота вашей зоны, где вы можете столкнуться, не будет надежно обнаружено. Вы не можете легко с этим типом кода столкновения. Это один из побочных эффектов, которые вы уже видите, и я думаю, что фактор помадки добавляет, что вы внесли свой вклад в остальное.

Попробуйте вместо этого использовать векторную систему столкновений. Рассматривайте каждый край поля как линейный вектор. Затем вы можете выполнить очень простую математику, чтобы определить, начинается ли точка с одной стороны линии и заканчивается на другой (знак перекрестного произведения), а знак точки скажет, находилась ли точка внутри отрезка. Кроме того, он позволяет вашим объектам столкновения иметь любую форму и даже делает математику легко расширяемой до 3D. Такая система также более удобна для параллельной обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...