Wczytywanie i wyświetlanie BITMAP pętlą w bilbiotece ALLEGRO

0

Witam, chcę napisać grę w stylu arkanoida i mój problem polega na tym, że zatrzymałem się w momencie wczytywania BITMAP ( bloczkow do zbicia ). Chcę je wczytać petlą, bo są one takie same a różnią się tylko współrzędnymi. I tutaj moje zapytanie, czy jest to wgl możliwe ? Można BITMAPY wczytywać petlą czy należy każdą osobno, bo próbowałem rozwiązań które znalazłem na forum i tych które sam wymyśliłem ale nadal mam z tym problem.
Główna pętla gry

while(al_key[AL_KEY_ESC]=false) do
  begin


//ruch paletki
   if(al_key[AL_KEY_LEFT]) and (paletka_x>-42) then dec(paletka_x);
   if(al_key[AL_KEY_RIGHT]) and (paletka_x<480) then inc(paletka_x);
   if(al_key[AL_KEY_SPACE]) then
   begin

   moveball();

   end;
// tutaj chce wczytac moje bitmapy ( bloczki ktore mam zbijac )
       al_clear_to_color(bufor, al_makecol(150,150,150));
       al_masked_blit(pileczka,bufor,0,0, pileczka_x, pileczka_y, 200, 200);
       al_masked_blit(paletka,bufor,0,0, paletka_x, paletka_y, 200, 200);
      //
       al_masked_blit(prostokat,bufor,0,0, prostokat_x+w, prostokat_y+h, 200, 200); // bloczek do zbicia
      //
       al_blit(bufor, al_screen, 0,0,0,0, 640,480);


    end;
  

W który miejscu powinienem użyć pętli, a może zastosować jakieś inne rozwiązanie ? Próbowałem wczytywac bloczki najpierw do tablicy a później wyświetlać tablice na bufor ale wynik za każdym razem jest taki sam, albo wyświetla się tylko jeden bloczek, albo nic, albo wyświetlają się i bardzo szybko znikają.

0

Jeśli bloczki (klocki) różnią się jedynie grafiką (np. mają różne kolory), ale bloczków jednego koloru może być wiele (to raczej normalne w tej grze), to stwórz sobie macierz ze wszystkimi używanymi dla klocków bitmapami i zaindeksuj ją np. typem wyliczeniowym; Następnie przygotuj sobie macierz dwuwymiarową dla wszystkich klocków w danej planszy i wypełnij ją wartościami wspomnianego typu wyliczeniowego; Dzięki temu będziesz miał wczytane kilka bitmap (dla każdego typu/koloru jedna), ale wykorzystywane będą dla dziesiątek/setek klocków;

Poniżej zarys takiej konstrukcji (nie znam API biblioteki Allegro, więc tyle mogę napisać):

type
  { typ/kolor klocka }
  TBlockKind = (bkNone, bkBlue, bkRed, bkGreen, bkYellow, bkSteel);

type
  { bitmapy klocków }
  TBlockBitmapArr = array [TBlockKind] of TBitmap;

type
  { mapa klocków poziomu }
  TLevelBlocksMap = array [0 .. 2, 0 .. 3] of TBlockKind;

const
  { przykładowa mapa poziomu }
  LEVEL_1_BLOCKS_MAP: TLevelBlocksMap = (
    (bkBlue,  bkBlue,   bkBlue,   bkBlue),
    (bkRed,   bkYellow, bkYellow, bkRed),
    (bkGreen, bkSteel,  bkSteel,  bkGreen)
  );

Takie coś pozwoli Ci zaoszczędzić pamięć, przyspieszyć operację wykrywania kolizjii oraz kasowania klocków po ich zbiciu; Zawartość stałej LEVEL_1_BLOCKS_MAP wystarczy przepisać do zmiennej (która trzyma dane bieżącego poziomu), a po zbiciu klocka, w odpowiednie miejsce macierzy wpisać enum bkNone; Do tego dorobić należy procedurkę rysującą klocki na ekranie - wystarczy pętla sprawdzająca każdy element macierzy; Natomiast fizyczne namalowanie odpowiedniej dla danego klocka bitmapy to odczytanie enuma z macierzy i wykorzystanie go jako indeksu do elementu macierzy TBlockBitmapArr, przy czym element o indeksie bkNone powinien mieć pustą bitmapę, aby w miejscu zbitego klocka nic nie było wyświetlane (odpadnie sprawdzanie czy wartość pola jest różne od bkNone);

To taki mały przykład, wymyślony na szybko, w bardzo podstawowej wersji.

0

Dziękuje bardzo za pomoc.

0

Zrobiłem tak jak podpowiedział furious programming co znacznie ułatwiło sprawe i dało pomysł na dokończenie kodu. Problem rozwiązałem w sposób jaki widać w kodzie.Współrzędne wpisałem najpierw do tabel i dopiero wyświetlałem. ( nic innego nie zmieniałem )

for i:=0 to 3 do
  for j:=0 to 12 do
    al_masked_blit(BlocksBitmap[Level_1[i][j]],bufor,0,0, tablica1[j], tablica[i], 200, 200);

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