Autor Wątek: Kolizje 2D problem  (Przeczytany 977 razy)

Offline Santor

  • Użytkownik

# Listopad 05, 2011, 23:45:52
Witam,
zawsze starałem się robić wszystko samemu i samemu także rozwiązywać swoje "koderskie" problemy ale teraz mnie troszkę przerosło. Napisałem prosty silnik kolizji 2 ruchomych obiektów do swojej gierki. Mapę mam podzieloną na 16 części (4 główne i każda ma 4 podrzędne). Kolizje staram się wykryć na podstawie prostokątów jeżeli obiekty są w tej samej części.  No i  kolizje w ogóle nie działają i nie mogę znaleźć błędu czy przeoczenia w kodzie. A oto i on:
Bezpośrednio sprawdzający kolizje:
 {
        gracza.okreslrodzine(polozenie1.x,polozenie1.y);
        graczb.okreslrodzine(polozenie2.x,polozenie2.y);
        if(gracza.rodzina1==graczb.rodzina1)
        {
            if(gracza.rodzina2==graczb.rodzina2)
            {
                if(gracza.x<=graczb.x && (gracza.x+19)>=graczb.x && gracza.y>=graczb.y && (gracza.y+19)<=graczb.y) // te 19stki stąd ze obiekty mają wymiary 20x20px
                {
                    kolizja = 1;
                }

                if(gracza.x<=(graczb.x+19) &&gracza.x>=graczb.x && gracza.y<=graczb.y && (gracza.y+19)<=graczb.y)
                {
                    kolizja = 1;
                }
                 if(gracza.x<=(graczb.x+19) &&gracza.x>=graczb.x && gracza.y>=graczb.y && gracza.y<=(graczb.y+19))
                {
                    kolizja = 1;
                }
                 if((gracza.x+19)>=graczb.x &&gracza.x<=graczb.x && gracza.y>=graczb.y && gracza.y<=(graczb.y+19))
                {
                    kolizja = 1;
                }
            }
        }
        }

klasa i metoda:

class kolizje{
  public:
  int rodzina1;
  int rodzina2;
  int x;
  int y;
  public:
  void okreslrodzine(int x, int y);


};
//mapa gry 800x600 stąd te podziały
void kolizje::okreslrodzine(int x,int y){
 if(x>=0 && x<400 && y>=0 && y<300)
 rodzina1 = 1;
 if(x>=400 && x<800 && y>=0 && y<300)
 rodzina1 = 2;
 if(x>=0 && x<400 && y>=300 && y<600)
 rodzina1 = 3;
 if(x>=400 && x<800 && y>=300 && y<600)
 rodzina1 = 4;

 if(rodzina1 =1)
  {if(x>=0 && x<200 && y>=0 && y< 150)
 rodzina2 =1;
  if(x>=200 && x<400 && y>=0 && y< 150)
 rodzina2 =2;
  if(x>=0 && x<200 && y>=150 && y<300)
 rodzina2 =3;
  if(x>=200 && x<400 && y>=150 && y< 300)
 rodzina2 =4;
  }
  if(rodzina1 =2)
  {if(x>=400 && x<600 && y>=0 && y< 150)
 rodzina2 =1;
  if(x>=600 && x<800 && y>=0 && y< 150)
 rodzina2 =2;
  if(x>=400 && x<600 && y>=150 && y<300)
 rodzina2 =3;
  if(x>=600 && x<800 && y>=150 && y< 300)
 rodzina2 =4;
  }
  if(rodzina1 =3)
  {if(x>=0 && x<200 && y>=300 && y< 450)
 rodzina2 =1;
  if(x>=200 && x<400 && y>=300 && y< 450)
 rodzina2 =2;
  if(x>=0 && x<200 && y>=450 && y<600)
 rodzina2 =3;
  if(x>=200 && x<400 && y>=450 && y< 600)
 rodzina2 =4;
  }
  if(rodzina1 =4)
   {if(x>=400 && x<600 && y>=300 && y< 450)
 rodzina2 =1;
  if(x>=600 && x<800 && y>=300 && y< 450)
 rodzina2 =2;
  if(x>=400 && x<600 && y>=450 && y<600)
 rodzina2 =3;
  if(x>=600 && x<800 && y>=450 && y< 600)
 rodzina2 =4;
  }

 Może mam  jakieś błędy związane z klasą, dopiero wczoraj zacząłem czaić klasy i ich używanie. Będę wdzięczny za każdą pomoc. A teraz spróbuje jeszcze porobić sobie graficzne sygnały przedstawiające działanie kodu, może uda mi się coś znaleźć:)

A i pytanko na przyszłość: w jakiej postaci przechowywać współrzędne obiektów statycznych  na mapie żeby później łatwo można było obliczyć czy wystąpiła kolizja.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych