2D Box Collisions - Что я делаю не так? (C ++) - PullRequest
2 голосов
/ 25 апреля 2011

Я пытаюсь сделать платформерную игру на C ++, и я сделал вектор блоков, и я просто перебираю вектор и проверяю столкновение индивидуально:

//Pseudo code
class Block{
...int x
...int y
...int width
...int height
};

class Player{
int x
int y
int width
int height
int hsp //horizontal speed
int vsp //vertical speed
int facing //0 = no direction, -1 = left, 1 = right
...



void loop()
{

    if(keyboard_pressed(key_left) { x-=hsp; facing = -1;}
    if(keyboard_pressed(key_right) {x+=hsp; facing = 1;}
    if(keyboard_pressed(key_up) {y-=vsp;}
    if(keyboard_pressed(key_down) {y+=vsp;}
    if(keyboard_released(key_left | key_right) {facing = 0;}

    for(int i = 0; i < blocks.size(); i++)
    {
        Block b = blocks.at(i);
        check_Collision(b);
    }
}

};

Как видите, мой игрок просто движется в соответствии с hsp и vsp. Достаточно просто. Основная часть моего вопроса находится в check_Collision (). Сначала я проверяю, есть ли у игрока находится на вершине блока, и если он есть, пусть он останется там. Затем я проверяю, находится ли игрок по бокам блока. Но по какой-то причине есть проблема. По какой-то причине, когда я иду под верхней частью блока, он остается на вершине, но затем его смещают влево.

Честно говоря, я не знаю, куда идти с этим. Следующий код проверяет только верхнюю и левую стороны:

check_Collision(){
///////////////////////////////////
var myLeft, myRight, myTop, myBot;
var bLeft, bRight, bTop, bBot;
myLeft = x;
myRight = x + width;
myTop = y;
myBot = y + height;
/////////////////////
bLeft = b.x;
bRight = b.x + b.width;
bTop = b.y;
bBot = b.y + b.height;
//////////////////////////////////


//Check if we are at the top
if(myBot + vsp > bTop+1){
y = bTop - height;
}

//Check if we are at the sides
if(myBot > bTop+2){

    if(myRight + hsp > bLeft)
    {
        x = bLeft - width;
    }

}
}

Если кто-нибудь может подсказать мне какое-нибудь руководство по столкновению 2D-боксов, это было бы здорово.

1 Ответ

0 голосов
/ 25 апреля 2011

Логика, которую вы используете, не имеет смысла для меня. Недостаточно просто проверить, что игрок находится под блоком: вам также не нужно убедиться, что игрок стоит на нем, т. Е. Не слишком далеко направо или налево от блока? Точно так же, во второй проверке вы должны убедиться, что игрок не прыгает через блок (или не стоит на нем). Ваш if частично проверяет это, но не принимает во внимание тот факт, что первая проверка могла изменить положение игрока.

Можете ли вы предположить, что игрок никогда не может ходить под блоком? Можете ли вы предположить, что игрок никогда не будет двигаться достаточно быстро, чтобы полностью «туннелировать» через блок (hsp> b.width и т. Д.)?

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

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