#c #graphics #block #collision
#c #графика #блок #столкновение
Вопрос:
Я пытаюсь создать игру-платформер на 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:
Логика, которую вы используете, не имеет смысла для меня. Недостаточно просто проверить, что игрок находится под блоком: разве вам также не нужно убедиться, что игрок стоит на нем, т. Е. не слишком далеко справа или слева от блока? Аналогично, при вашей второй проверке вы должны убедиться, что игрок не перепрыгивает через блок (или не стоит на нем). Ваш if
частично проверяет это, но не учитывает тот факт, что первая проверка могла изменить позицию игрока.
Можете ли вы предположить, что игрок никогда не сможет пройти под блоком? Можете ли вы предположить, что игрок никогда не будет двигаться достаточно быстро, чтобы полностью «проложить туннель» через блок (hsp> b.width и т.д.)?
Если ответ на любой из этих вопросов отрицательный, вам потребуется значительно более сложное обнаружение столкновений.