Skocz do zawartości

[C++] place_free


Rekomendowane odpowiedzi

Opublikowano

Napisałem sobie funkcję place_free, która sprawdza czy na danej pozycji X i Y nie znajduje się jakiś obiekt ( w tym wypadku jest to tablica obiektów-przeszkód :P ). No ale nie do końca działa, tzn wygląda na to że zwraca fałsz, gdyż nie mogę poruszyć się innym obiektem, ale do rzeczy:

 

bool place_free ( int _x, int _y, cBlock __objB[] )
{
   int bbox_left, bbox_right, bbox_top, bbox_bottom;
   
   for ( int i=0; i<blocks_number; i++ )
   {
       bbox_left = __objB[i].x;
       bbox_right = __objB[i].x+__objB[i].w;
       bbox_top = __objB[i].y;
       bbox_bottom = __objB[i].y+__objB[i].h;
       
       if ( !((bbox_left > _x || bbox_right < _x) && (bbox_top > _y || bbox_bottom < _y)) )
          return false;
   }
   return true;
}

 

Tak wygląda owa funkcja, a teraz wywołanie w kodzie:

 

__key_state = SDL_GetKeyState( NULL );
          
          if ( __key_state[SDLK_LEFT] )
          {
               if (place_free( objPlayer.x-1, objPlayer.y, *objBlocks )) {
               objPlayer.x -= 1;
               objPlayer.direction = 0; 
               }
          }
          if ( __key_state[SDLK_RIGHT] )
          {
               if (place_free( objPlayer.x+1, objPlayer.y, *objBlocks )) {
               objPlayer.x += 1;
               objPlayer.direction = 1; 
               }
          }

 

I jeszcze tworzenie obiektów objBlocks[]:

cBlock *objBlocks[100];

    objBlocks[0] = new cBlock( 64, 64, true, 16, 16 );   
    objBlocks[1] = new cBlock( 64, 80, true, 16, 16 );   
    objBlocks[2] = new cBlock( 80, 64, true, 16, 16 );    
    objBlocks[3] = new cBlock( 96, 64, true, 16, 16 );

 

Wydaje się być wszystko OK, ale muszę jeszcze przyznać żę miałem problem z przekazaniem tablicy obiektów objBlocks[] do owej funkcji udało mi się to podając ją tak jak jest teraz ( *objBlocks wtf? ).

 

jeżeli ktoś wie gdzie jest przyczyna i mógłby przybliżyć mi nieco zasady przekazywania tych tablic to byłbym wdzięczny ;)

 

Z góry dzięki!

Opublikowano
Wydaje się być wszystko OK, ale muszę jeszcze przyznać żę miałem problem z przekazaniem tablicy obiektów objBlocks[] do owej funkcji udało mi się to podając ją tak jak jest teraz ( *objBlocks wtf? ).

 

jeżeli ktoś wie gdzie jest przyczyna i mógłby przybliżyć mi nieco zasady przekazywania tych tablic to byłbym wdzięczny ;)

 

Z góry dzięki!

typ *wskaznik = &tab[0];

Wskazanie na tablicę odbywa się poprzez wskazywanie na jej pierwszy element.

Opublikowano

Dobra już widzę że wina jest w warunku sprawdzania kolizji :P

 

Hmm teraz czy ten będzie dobry?

 

if ( ((bbox_left < _x && bbox_right > _x && bbox_top < _y && bbox_bottom > _y)) )
          return false;

Opublikowano
Dobra już widzę że wina jest w warunku sprawdzania kolizji :P

 

Hmm teraz czy ten będzie dobry?

 

if ( ((bbox_left < _x && bbox_right > _x && bbox_top < _y && bbox_bottom > _y)) )
          return false;

Przy pionach znaki nierówności są odwrotnie tj. powinno chyba być:

bbox_top > _y && bbox_bottom < _y

Opublikowano

Hmmm tak czy siak teraz nie do końca działa, bo nie sprawdza wszystkich bloków :mellow: Tak jakby ta pętla nie jechała po wszystkich ;/

Opublikowano

Włóż wszystkie elementy do wektora z STL i przechodząc iteratorem masz pewność , że przejdzie po wszystkich elementach...

Opublikowano

Powodów może być wiele.. w zasadzie lepiej zawsze korzystać z STL w takich sytuacjach.. nie trzeba tak bardzo dbać o przepełnienie chociaż to też oczywiście jest możliwe kiedy wyczerpie się dostępna pamięć, łatwa obsługa wyjątków, łatwe operacje na obiektach.. a powodem nie działania twojej pętli może być np: w ogule nie zainicjowna wartość zawierająca informacje o ilości elementów w tablicy.. lub niewłaściwa jej wartość.. nie można wyczytać z kilku lini kodu błędu który może nawet tkwić w innym module.. p.s ty tworzysz 100 elementów wpisując do wszystkich konstruktorów ręcznie wartości?

Opublikowano
p.s ty tworzysz 100 elementów wpisując do wszystkich konstruktorów ręcznie wartości?

Nie :P Sam nie wiem czemu zainicjowałem tę tablicę na 100.

Opublikowano

Właśnie dlatego lepiej używac stl.. pozwala zaoszczędzić pracy i zająć się ważniejszymi rzeczami :] A te kilkanaście minut poświęcone na nauke szybko się zwróci..

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...