Я пытаюсь сделать платформерную игру на 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-боксов, это было бы здорово.