Skocz do zawartości

[C++] place_free


Yoda

Rekomendowane odpowiedzi

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!

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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

Odnośnik do komentarza
Udostępnij na innych stronach

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?

Odnośnik do komentarza
Udostępnij na innych stronach

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ę...