SDL обработка коллизий

У меня есть экземпляр, где SDL_Rect находится внутри большого SDL_Rect, и мне нужно, чтобы он сделал так, чтобы он не мог покинуть этот прямоугольник, но все еще может двигаться. Движение маленького прямоугольника должно быть похоже на движение настольной игры, когда вы нажимаете кнопку один раз, и она перемещает определенные шнуры. Вот мой код:

if( event.type == SDL_KEYDOWN) {
switch( event.key.keysym.sym ) {
case SDLK_UP:
yVel -= 10;
if (!check_collision(box,Cont))
{
std::cout<<"in the water"<<std::endl;
box.y -= yVel - 10;
}
break;
case SDLK_DOWN:

if (!check_collision(box,Cont))
{
std::cout<<"in the water"<<std::endl;
box.y -= yVel + 20;
}
else
{
yVel += 10;
}
break;
case SDLK_LEFT:
xVel -= 10;
if (!check_collision(box,Cont))
{
std::cout<<"in the water"<<std::endl;
}
break;
case SDLK_RIGHT:
xVel += 10;
if (!check_collision(box,Cont))
{
std::cout<<"in the water"<<std::endl;
}
break;
case SDLK_1:
return 2;
break;

}
}

0

Решение

У вас есть несоответствия в вашем SDLK_DOWN и остальные ваши входные данные — не происходит изменения скорости, если нет столкновений.

Ваш входной код меняет координаты, так не должно быть. Сделайте так, чтобы ваш входной код управлял «намерением», и сделайте так, чтобы игровой цикл применял скорость к объекту и к обнаружению столкновений.

Кроме того, ваши проверки столкновений должны проверить, если я в position и я двигаюсь deltaя столкнусь? Если я сталкиваюсь, какова реакция столкновения? Хотите ли вы, чтобы объект «скользил» по коллизиям или просто останавливался, как только коллизия обнаружена?

Учитывая, что вы играете в настольную игру, вам даже не нужно обнаруживать столкновения. Представьте свою доску в виде графика возможных положений, в которых может находиться ваш юнит, переведите щелчки мыши в координаты доски и рассчитайте кратчайший путь (используйте A* алгоритм) между вашей текущей позицией и пунктом назначения; недействительные щелчки (за пределами) не должны переводиться в команды движения.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector