allegro kolizje

0

a więc napisałem kolizje i mój problem jest taki że gdy program wykryje kolizje to ma odpychac ludzika no i tak też robi ale niekiedy robi tak ze jak nacine prawy kursor i jest kolizja i wtedy nacisne lewy zeby odunac sie od obiektu to czasami ludzik zawraca przechodzi przez obiekt na ktorym jest kolizja i przechodzi na lewa strone tak jest ze wszystkimi kierunkami

 
if( kolizja( ludek_x,ludek_y,ludek_s, ludek_w, postac_x- mapa_x, postac_y-mapa_y, postac_s, postac_w)==true)
{ if (key[KEY_RIGHT]) {ludek_x-=2;} 
  if (key[KEY_LEFT]){ludek_x+=2;}  
  if (key[KEY_DOWN]){ludek_y-=2;} 
  if (key[KEY_UP]){ludek_y+=2;} 
}
0

Pomogę jak wytłumaczysz poprawnie gramatycznie w jęz. polskim, bo teraz z tej jednozdaniowej wypowiedzi to nic nie zrozumiałem.

BTW. W jakim ty układzie współrzędnych działasz skoro strzałka w prawo odejmuje wartość na osi X czyli się cofa?

0

to jest kolizja zeby mi nie przechodzil ludzik przez obiekt to musze go minusowac. A wiec do rzeczy kiedy pochodze do obiektu i mam np wcisniety prawy kursor to kolizja dziala i odpycha moja postac. Lecz czasami gdy mam wcisniety prawy przycisk i kolizja sie spelni i chce aby ludzik sie odsunal od obiektu to naciskam lewy kursor. No i przejdzmy do meritum gdy naciskam ten lewy to ludzik zamiast isc w lewo przechodzi mi przez obiekt na druga strone . I problem w tym zeby mi tego nie robil

0

Pokaż no jeszcze tą funkcję "kolizja".

0
 bool kolizja( float x1, float y1, float s1, float w1, float x2, float y2, float s2, float w2 )
{
    if( x1 + s1 >= x2 && x1 <= x2 + s2 && y1 + w1 >= y2 && y1 <= y2 + w2 ) return( true );
   
    return( false );
};
0
Mateusz napisał(a)
 bool kolizja( float x1, float y1, float s1, float w1, float x2, float y2, float s2, float w2 )
{
    if( x1 + s1 >= x2 && x1 <= x2 + s2 && y1 + w1 >= y2 && y1 <= y2 + w2 ) return( true );
   
    return( false );
};

za taki kod powinni kulki obrywać ;) Spróbuj umieścić współrzędne w jakiejś strukturze lub klasie żeby nabrało to przejrzystości.

Mała uwaga ode mnie:

warunki typu

if(warunek) cos tam;
else cos tam;

w c++ można zapisywać operatorem:

(warunek) ? cos tam : cos tam;

a kod typu:

bool example(int a, int b)
{
     if(a > b) return true;
     return false;
} 

lepiej zapisać tak:

inline bool example(int a, int b) { return a > b; }
0

to jak pomoże ktoś?

0

To jeszcze wytłumacz tą funkcję, bo nie chce mi się rozszyfrowywać jak to działa.

0

po prostu jest to sprawdzanie czy krawędzie się na siebie nakładają i tyle

0

To jest gra na kafelkach czy można je potraktować, że obiekty mają obwód typu okrąg lub prostokąt?

0

mapa jest kafelkowa ale obiekty to prostokąty

0

Sprawdzanie czy bohater styka się z każdym obiektem podczas renderowania, byłoby czasochłonne dlatego musisz ograniczyć widzenie. W przypadku gdy obiekt jest ograniczony okregiem (a robi się tak dla wiekszości obiektów) wystarczy sprawdzić, czy odległość między dwoma obiektami jest mniejsza niż suma ich promieni, jeżeli tak to mamy zderzenie. Dla obiektów kafelkowych, jest to jeszcze łatwiejsze, bo poruszamy się tylko po ustalonych kafelkach. Sprawdzasz czy na kaflu do którego chcesz przejść istnieje jakiś przedmiot, jeżeli tak, to nie zezwalasz na poruszanie się, jeżeli nie, to dopiero teraz wykonujesz ruch.

Nie wytłumaczyłem tego do końca:
Pobierasz jeden punkt kafelka (może to być domyślnie lewy górny róg)

if(hero.getX() + length >= block.getX())
     return /*kolizja*/ true;
else if(hero.getX() <= block.getX() + length) // zakladam że dlugosc kafla blokady jest tak samo dluga jak dlugosc kafla bohatera, tak powinno byc w domysle)
     return true;
else if(hero.getY() >= block.getY() - length)
     return true;
else if(hero.getY() - length <= block.getY())
     return true;
else
     return false;

Dla małej ilości obiektów opłaca się sprawdzać każdy obiekt podczas renderowania, natomiast dla większej, najpierw ustal w jakiej odległości od bohatera będziesz sprawdzał kolizję obiektów

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