Столкновение 2D Box - это правильно? - PullRequest
1 голос
/ 03 июля 2011

Что ж, у меня есть код столкновения 2D-блоков, который в основном проходит по всем блокам в списке, называемом «Блоки», и проверяет, не нахожусь ли я по бокам и еще много чего.

Работает очень хорошо, кромедля нижней части блока.Когда я прыгаю вниз, я хочу, чтобы мой игрок просто «отскочил».Это делает это, но это очень глючно.Это трудно объяснить, поэтому я надеялся, что вы, ребята, сможете определить, что не так с моим нижним кодом столкновения.

Вот и все:

for(unsigned int i = 0; i<blocks.size(); i++){
Block &b = blocks.at(i);
if(!b.passable==true){
    //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-2)
        {
         x = b.worldX + b.width; hspeed = 0;
        }
        //Left side    
        if(x + width + hspeed >= b.worldX +1 && x + width + hspeed <= b.worldX + hspeed + 2)
        {
         x = b.worldX - width; hspeed = 0;
        }
    }

    //Check if we are on the top or the bottom
    if(x + width + hspeed >= b.worldX+2 && x + hspeed <= b.worldX+b.width-2)
    {
        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;
        }

        }
    }
}

Ответы [ 2 ]

1 голос
/ 03 июля 2011

Я предполагаю, что вы должны установить vspeed = -vspeed; вместо vspeed = 0. Полностью упругое подпрыгивание означает, что скорость отражается в боксе коробки.

Если вы установите его на ноль, в зависимости от того, в каком порядке вы выполняете свои обновления, вы можете не двигаться в течение кадра. И поскольку вы используете <= и >= для проверки границ, вы все равно будете находиться внутри блока в следующем кадре, снова вызывать отскакивающее поведение и застревать, приклеив голову к блоку.

0 голосов
/ 03 июля 2011

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

y + vspeed <= b.worldY + b.height

всегда истинно.

Помимо этого, добавляя расстояние к скорости, выприняли магическое измерение за единицу времени.Это делает ваш код хрупким, потому что если вы измените это магическое число, то ваши уравнения будут неверными.

Попробуйте,

 y + vspeed*unit_time <= b.worldY + b.height

Если вы хотите обрабатывать единицы во время компиляции (а не платить за это умножение), тогда используйте boost.units.

Дополнительно

x + hspeed > b.worldX+b.width + hspeed-2

можно упростить до

x > b.worldX+b.width-2

И значение этого магического числа 2 можно догадаться.(почему, например, у вас есть

//Check if we are on the sides
if(y + vspeed <= b.worldY+b.height)

, но есть -2 in

//Check if we are on the top or the bottom
if( x + hspeed <= b.worldX+b.width-2)

)

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