Kolizja w allegro

0

Po wstawieniu tego kodu:

:
bool kolizja(int x1,int y1,int s1,int w1,int x2,int y2,int s2,int w2)
{
     if( x2<=x1+s1 && x2>x1 && y2>=y1 && y2<=y1+w1) return true; else
     if( x2<=x1+s1 && x2>x1 && y2+w2>=y1 && y2+w2<=y1+w1) return true; else
     if( x2+s2<=x1+s1 && x2+s2>x1 && y2>=y1 && y2<=y1+w1) return true; else
     if( x2+s2<=x1+s1 && x2+s2>x1 && y2+w2>=y1 && y2+w2<=y1+w1) return true;
     else return false;
}; 

kiedy skompiluję kolizja nadchodzi zaraz po włączeniu gry, nie wiem czemu tak się dzieje

1
  1. Znacznik code trzeba zamknąć.

  2. Zrób sobie strukturę opisującą rozmiar i pozycję gracza (i nie tylko, bo możesz tego użyć też dla np. innego obiektu, jak NPC czy kafelek), np.

struct Rect
{
    float x;
    float y;
    float width;
    float height;
};

Albo przynajmniej sensownie ponazywaj zmienne. Jak na to patrzę, to nie dość, że nie rozumiem co z czym porównujesz, to jeszcze dostaję raka gałek ocznych.

0

x1,x2-wspórządne x lewego górnego boku
x2,y2-współrzędne y lewego górnego boku
s1,s2-szerokość obiektów
w1,w2-wysokość obiektów
A do czego przyda mi się struktura opisująca rozmiar?

1

Czytelniejszy zapis.

Najprostszym sposobem na sprawdzenie, czy jeden Rect znajduje się w drugim, jest osobne sprawdzenie, czy każdy jego wierzchołek znajduje się w nim, np.

bool checkCollision(const Rect &player, const Rect &object)
{
    if(player.x >= object.x && player.x  <= object.x + object.width &&  player.y >= object.y && player.y <= object.y + object.height)
        return true;
    // reszta wierzchołków
    else
        return false;
}

Nie mam pojęcia jak wygląda układ współrzędnych w Allegro, więc być może ten zapis będzie niepoprawny, ale powinien cię odpowiednio nakierować.

Edit: już wiem co namieszałem. Przydało by się jeszcze sprawdzić tę kolizję w drugą stronę, na wypadek gdyby jeden obiekt był większy od drugiego.
user image

Jeśli gracz będzie czerwonym kwadratem, to kolizja nie zostanie wykryta.

0
:  if( object.x<=player.x+player.width    && object.x>player.x    && object.y>=player.y    && object.y<player.y+player.height   ) return true; else <code>
Tak ma wyglądać w drugą stronę ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1