C ++ SDL столкновение между спрайтами

0

Через 30 минут Googling, все, что я мог найти, это: http://www.sdltutorials.com/sdl-collision

Я думал, что название вводит в заблуждение, тогда я заметил, что это просто кошмар, способ обнаружить столкновение между двумя спрайтами. Все, что я хочу, это проверить, когда мой sprite-плеер касается чего-то другого (другого спрайта). Как я могу это сделать?

Я читал, что есть библиотека под названием SDL_collision.h, но она либо в Паскале, либо пуста.

Теги:
collision
sdl
sprite

1 ответ

2
Лучший ответ

Скорее всего, вы используете SDL_Rect для своей ограничивающей рамки. Где x и y - позиции вашего спрайта, а w и h - ширина и высота вашего спрайта. Тогда все, что вам нужно сделать, это использовать SDL_HasIntersection.

Вот простой пример:

SDL_Surface *Srfc1, *Srfc2;
Srfc1= IMG_Load("foo.png");
Srfc2= Srfc1;
Srfc2->refcount++;

SDL_Rect box1, box2;
box1.x = box1.y = 0;
box2.x = box2.y = 100;
box1.w = box2.w = Srfc1->w;
box2.h = box2.h = Srfc1->h;

// ... somewhere in your event handling logic
if (SDL_HasIntersection(&box1, &box2))
{
    printf("Collision.");
}
// ...

SDL_FreeSurface(Srfc1);
SDL_FreeSurface(Srfc2);

Поскольку у вас нет SDL_HasIntersection, вот небольшая небольшая функция, которая будет соответствовать вашим потребностям:

    bool IntersectRect(const SDL_Rect * r1, const SDL_Rect * r2)
    {
  return !(r2->x > (r1->x + r1->w) || 
           (r2->x + r2->w) < r1->x || 
           r2->y > (r1->y + r1->h) ||
           (r2->y + r2->h) < r1->y);
            );
    }

Для справки логика такова:

  return !(r2.left > r1.right || 
           r2.right < r1.left || 
           r2.top > r1.bottom ||
           r2.bottom < r1.top);

Где "правый" и "нижний" относятся к "x + width" и "y + height" соответственно. Используйте это, чтобы исправить функцию, я сделал опечатку.

  • 0
    Это решило бы мою проблему, если бы я не получил 'Ошибка: Идентификатор "SDL_HasIntersection" не определен ". Что я делаю не так сейчас?
  • 0
    @Yop Попробуйте включить SDL_rect.h
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню