Dział zablokowany Ten wątek jest zablokowany. Nie możesz w nim pisać ani edytować postów.  [ Posty: 2 ] 
[ALLEGRO C] Wdzięczny byłbym za pomoc :D 
Autor Wiadomość

Dołączył(a): 23 paź 2012, o 22:56
Posty: 1
Post [ALLEGRO C] Wdzięczny byłbym za pomoc :D
Witam , jestem początkującym programistą i aby rozwinąć swoje umiejętności pomyślałem że spróbuje swoich sił z biblioteką allegro. Rozpocząłem projekt który ma na celu stworzenie remak'u kiedyś popularnej gry na pegasusa o tytule Tanks.

Mam jednak pewien problem przy zachowaniu pocisków. Gdy kule lecą to po przemieszczeniu sie ich poprzedni obrazek zostaje gdy uzywam clear bitmap to pozostaje czarny pasek i nawet obrazka nie widac wiec chyba trzeba uzyc timera aby usunac bitmape a potem na bufor spowrotem narysowac tlo ... tylko nie do konca wiem jak sie za to zabrac.

Kolejna prośba to o wyjaśnienie bądź odesłanie do dobrze napisanego tutoriala wyjaśniającego jak podzielić program na moduły. Ponieważ pomyślałem że przy dalszej pracy podzielenie tego programu znacznie ułątwiło by i przyśpieszyło pracę nad projektem.

Tutaj link do pliku .rar gdzie jest kod źródłowy oraz obrazki - projekt tworzyłem w dev c++ : http://www.sendspace.com/file/wvj5ye
Natomiast niżej jeżeli ktoś nie chce pobierać zamieszczam czysty kod:




Kod:

#include <stdio.h>
#include <stdlib.h>
#include <allegro.h>
#define NUM_BULLETS 100
               
     

struct bullet_t {

   int active;
   int x;
   int y;
   int face;
   
} ;
typedef struct bullet_t bullet_t;

int main(int argc, char *argv[])
{

    allegro_init();
    install_keyboard();
    set_color_depth(16);
    set_gfx_mode(GFX_AUTODETECT_WINDOWED,1024,768,0,0);
    clear_to_color(screen, makecol(128,128,128));

   
   
    //Wczytujemy BITMAP'y
    BITMAP *bufor = NULL;
    BITMAP *player[4];
    BITMAP *player_1_HPBAR[11];
    BITMAP *player_2_HPBAR[11];
    BITMAP *background = NULL;
    BITMAP *bullet = NULL;
    BITMAP *wyb1 = NULL;
    BITMAP *wyb2 = NULL;
    BITMAP * bullet_sprite = 0;  
                 
   
   
    bufor = create_bitmap(1024,768);
    background = create_bitmap(1024,768);
   

   
               //Sprawdzamy czy nie ma błędu z zainicjalizowaniem bufora                    
               if (!bufor)
               {
               set_gfx_mode(GFX_TEXT,0,0,0,0);
               allegro_message("Nie mogę utworzyć bufora !");
               allegro_exit();
               return 0;
               }
               
    //Wczytujemy obrazki          
    background = load_bmp("trawa.bmp",default_palette);
    wyb1 = load_bmp("wyb1.bmp",default_palette);
    wyb2 = load_bmp("wyb2.bmp",default_palette);
    player[0] = load_bmp("player_LEFT.bmp",default_palette);
    player[1] = load_bmp("player_DOWN.bmp",default_palette);
    player[2] = load_bmp("player_RIGHT.bmp",default_palette);
    player[3] = load_bmp("player_UP.bmp",default_palette);
    bullet_sprite = load_bitmap("bullet.bmp", default_palette);
    //Wczytywanie Paska HP tutaj wiele obrazkow ma zły adres bmp wiem wiem ale po prostu narazie sprawdzalem czy dziala i zastanawialem sie czy moze jest jakas mozliwosc podania folderu tam gdzie pliki programu bez podawania calej sciezki
    player_1_HPBAR[0] = load_bmp("hp bar0.bmp",default_palette);
    player_1_HPBAR[1] = load_bmp("player_UP.bmp",default_palette);
    player_1_HPBAR[2] = load_bmp("player_UP.bmp",default_palette);
    player_1_HPBAR[3] = load_bmp("player_UP.bmp",default_palette);
    player_1_HPBAR[4] = load_bmp("player_UP.bmp",default_palette);
    player_1_HPBAR[5] = load_bmp("player_UP.bmp",default_palette);
    player_1_HPBAR[6] = load_bmp("player_UP.bmp",default_palette);
    player_1_HPBAR[7] = load_bmp("player_UP.bmp",default_palette);
    player_1_HPBAR[8] = load_bmp("player_UP.bmp",default_palette);
    player_1_HPBAR[9] = load_bmp("player_UP.bmp",default_palette);
    player_1_HPBAR[10] = load_bmp("HP bar10.bmp",default_palette);
    player_2_HPBAR[0] = load_bmp("player_UP.bmp",default_palette);
    player_2_HPBAR[1] = load_bmp("player_UP.bmp",default_palette);
    player_2_HPBAR[2] = load_bmp("player_UP.bmp",default_palette);
    player_2_HPBAR[3] = load_bmp("player_UP.bmp",default_palette);
    player_2_HPBAR[4] = load_bmp("player_UP.bmp",default_palette);
    player_2_HPBAR[5] = load_bmp("player_UP.bmp",default_palette);
    player_2_HPBAR[6] = load_bmp("player_UP.bmp",default_palette);
    player_2_HPBAR[7] = load_bmp("player_UP.bmp",default_palette);
    player_2_HPBAR[8] = load_bmp("player_UP.bmp",default_palette);
    player_2_HPBAR[9] = load_bmp("player_UP.bmp",default_palette);
    player_2_HPBAR[10] = load_bmp("player_UP.bmp",default_palette);
   
   
   
               //Sprawdzamy czy da sie wczytac wszystkie obrazki  
               if (!wyb1)
               {
               set_gfx_mode(GFX_TEXT,0,0,0,0);
               allegro_message("Nie mogę utworzyć wby 1 !");
               allegro_exit();
               return 0;
               }
               
               if (!wyb2)
               {
               set_gfx_mode(GFX_TEXT,0,0,0,0);
               allegro_message("Nie mogę utworzyć wyb 2 !");
               allegro_exit();
               return 0;
               }
         
              if (!background)
              {
               set_gfx_mode(GFX_TEXT,0,0,0,0);
               allegro_message("nie mogę załadować tlo !");
               allegro_exit();
              return 0;
              }

              if (!player[4])
              {
              set_gfx_mode(GFX_TEXT,0,0,0,0);
              allegro_message("Blad przy wczytywaniu gracza!");
              allegro_exit();
              return 0;
              }
             
              if (!bullet_sprite)
              {
              set_gfx_mode(GFX_TEXT,0,0,0,0);
              allegro_message("Blad przy wczytywaniu pocisku!");
              allegro_exit();
              return 0;
              }
             
             
    //deklarujemy zmienne oraz podajemy ich startowe wartości        
    int player_x = 350, player_y = 250;
    int bullet_x , bullet_y;  
    int face = 3;
    bullet_t bullets[NUM_BULLETS] = {0};
    int i;
    int HP=10;
    int licz_gracz =1;
   
    //Życie gracza
    if(licz_gracz == 1)
    {  
        textout_ex(screen,font,"Zycie gracza:",5,6 ,makecol(0,0,0),-1);
        blit( player_1_HPBAR[HP], screen, 0,0, 120,5,100,10);
    }
    if(licz_gracz == 2)
    {
         textout_ex(screen,font,"Zycie gracza nr1:",5,6 ,makecol(0,0,0),-1);
         blit( player_1_HPBAR[HP], screen, 0,0, 150,5,100,10);
         
         textout_ex(screen,font,"Zycie gracza nr2:",500,6 ,makecol(0,0,0),-1);
         blit( player_2_HPBAR[HP], screen, 0,0, 650,5,100,10);        
    }  
   
    //Głowna pętla programu
    while( !key[KEY_ESC])

    {
       
           //Poruszanie się czołgu
           if( key[KEY_LEFT])
                {
                player_x--;
                face =0;
                }
                 
           else if( key[KEY_RIGHT])
                {
                player_x++;
                face = 2;
                }
           else if( key[KEY_UP])
                {
                player_y--;
                face = 3;
                }
           else if( key[KEY_DOWN])
                {
                player_y++;
                face = 1;
                }
     
               
                         //kolizje czołgu ze ścianą
                         if(player_x>=28 && player_x<=28 && player_y>=0 && player_y<=600) {player_x=30; player_y=player_y;} //lewa sciana ekranu
                         if(player_x>=700 && player_x<=700 && player_y>=0 && player_y<=600) {player_x=699; player_y=player_y;} // prawa sciana ekranu
                         if(player_x>=0 && player_x<=800 && player_y>=33 && player_y<=33) {player_x=player_x; player_y=35;} // gorna sciana ekranu
                         if(player_x>=0 && player_x<=800 && player_y>=500 && player_y<=500) {player_x=player_x; player_y=498;} // dolna sciana ekranu
               
        bullet_t * bullet = &bullets[i];
               
       for(i=0; i<=NUM_BULLETS; i++)
            {
           
                   //poruszanie pociskow  
                   if(bullets[i].active==1)
                   {
                           
                             draw_sprite(
                                background,        
                                bullet_sprite,
                                bullets[i].x,
                                bullets[i].y);  
                                                   
                             if(bullets[i].face==0)
                                          bullets[i].x --;
                             if(bullets[i].face==1)
                                          bullets[i].y ++;        
                             if(bullets[i].face==2)
                                          bullets[i].x ++;
                             if(bullets[i].face==3)
                                          bullets[i].y --;


                         //kolizje pocisku ze sciana:    
                        if(bullets[i].x >=28 && bullets[i].x <=28 && bullets[i].y >=0 && bullets[i].y <=600) {bullets[i].active =0;} //lewa sciana ekranu
                        if(bullets[i].x >=700 && bullets[i].x <=700 && bullets[i].y >=0 && bullets[i].y <=600) {bullets[i].active =0;} // prawa sciana ekranu
                        if(bullets[i].x >=0 && bullets[i].x <=800 && bullets[i].y >=33 && bullets[i].y <=33) {bullets[i].active =0;} // gorna sciana ekranu
                        if(bullets[i].x >=0 && bullets[i].x <=800 && bullets[i].y >=500 && bullets[i].y <=500) {bullets[i].active =0;} // dolna sciana ekranu
                       

                       //Tutaj pojawia sie najwazniejszy problem ...
                       //clear_bitmap(bullet_sprite);
                       //masked_blit( background, bufor , 0,0, bullet[i].x, bullet[i].y, bullet_sprite ->w, bullet_sprite ->h);                                                                    
                   }
             }  
           
            //Jesli wykrywa spacje    
               if( key[KEY_SPACE])
               {            
                     
          // Szukaj wolnego pocisku
           for(i=0; i<=NUM_BULLETS; i++)
            {        
                  // Jak jest wolny to go uzyj, jak nie to szukaj dalej
                  if( bullets[i].active == 0)
                   {
                        bullets[i].active = 1;
                       

                        bullets[i].x = player_x;
                        bullets[i].y = player_y;
                                                 
                         
                               
                        if(face==0)
                               bullets[i].face = 0;
                                             
                        if(face==1)
                               bullets[i].face = 1;
                                           
                        if(face==2)
                               bullets[i].face = 2;                              
                                       
                        if(face==3)
                               bullets[i].face = 3;
                       
                        // Deaktywacja spacji
                        ///////key[KEY_SPACE] = false;
                        // Koniec pętli for
                       break;


                     }
               
                                             
                 }    
                 }
           
           
    clear_to_color(bufor, makecol(150,150,150));

    blit( background, bufor,0,0, 0,0, 1024,744);
    masked_blit( player[face], bufor, 0,0, player_x, player_y, player[face]->w, player[face]->h);
    blit( bufor, screen, 0,0,0,24, 1024,768);

    }






//Niszczymy wszystkie BITMAP'y
destroy_bitmap(bullet_sprite);
destroy_bitmap(player[0]);
destroy_bitmap(player[1]);
destroy_bitmap(player[2]);
destroy_bitmap(player[3]);
destroy_bitmap(player_1_HPBAR[0]);
destroy_bitmap(player_1_HPBAR[1]);
destroy_bitmap(player_1_HPBAR[2]);
destroy_bitmap(player_1_HPBAR[3]);
destroy_bitmap(player_1_HPBAR[4]);
destroy_bitmap(player_1_HPBAR[5]);
destroy_bitmap(player_1_HPBAR[6]);
destroy_bitmap(player_1_HPBAR[7]);
destroy_bitmap(player_1_HPBAR[8]);
destroy_bitmap(player_1_HPBAR[9]);
destroy_bitmap(player_1_HPBAR[10]);
destroy_bitmap(player_2_HPBAR[0]);
destroy_bitmap(player_2_HPBAR[1]);
destroy_bitmap(player_2_HPBAR[2]);
destroy_bitmap(player_2_HPBAR[3]);
destroy_bitmap(player_2_HPBAR[4]);
destroy_bitmap(player_2_HPBAR[5]);
destroy_bitmap(player_2_HPBAR[6]);
destroy_bitmap(player_2_HPBAR[7]);
destroy_bitmap(player_2_HPBAR[8]);
destroy_bitmap(player_2_HPBAR[9]);
destroy_bitmap(player_2_HPBAR[10]);
destroy_bitmap(bufor);
destroy_bitmap(background);


allegro_exit();

return 0;

}

END_OF_MAIN();  
 


23 paź 2012, o 23:12
Zobacz profil

Dołączył(a): 13 paź 2011, o 09:39
Posty: 3
Post Re: [ALLEGRO C] Wdzięczny byłbym za pomoc :D
Jeżeli chodzi o poprawne wyświetlanie, jedno z rozwiązań polega na uporządkowaniu grafik w odpowiedniej kolejności 'od spodu'. W każdej iteracji wszystkie grafiki 'spod spodu' mają być ponownie wyświetlone, o ile obiekt nad nimi się przesunął. Pociąga to ponowne wyświetlanie kolejnych grafik 'z wierzchu'. Radzę robić to najpierw na bitmapie roboczej, którą ostatecznie przesyłamy na monitor.
Proponowane bywa drzewo wyświetlania grafik.

Odpowiedź na drugie pytanie dotyczące podziału na moduły bardzo dobrze podpowiadają porządne podręczniki opisujące podejście obiektowe. Podział na obiekty jest zarazem podziałem na moduły.


3 lis 2012, o 09:55
Zobacz profil
Wyświetl posty nie starsze niż:  Sortuj wg  
Dział zablokowany Ten wątek jest zablokowany. Nie możesz w nim pisać ani edytować postów.  [ Posty: 2 ] 


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group. Forum style based on STSoftware Hestia.
Przyjazne użytkownikom polskie wsparcie phpBB3 - phpBB3.PL