allegro , cpu-żerna pętla

0

piszę prostą grę z wykorzystaniem allegro
oto kod:

/*
   zlo destructor
   autor: major
   e-mail: [email protected]
*/

bool kolizja(int x1,int y1 , int x2,int y2,int s2,int w2)

{

     if     ( x1>=x2 && x1<=x2+s2 && y1>=y2 && y1<=y2+w2) return true;

     else return false;

};


#include <allegro.h>

int main()

{
  int opcja = 1;
  int czy_enter = 5;
  int kre_y = 710;


  allegro_init();

  install_keyboard();

  set_color_depth(32);

  set_gfx_mode(GFX_AUTODETECT,1280,1024,0,0);

  clear_to_color(screen,  makecol(128,128,128));



  BITMAP *lu1 = NULL;
  BITMAP *lu3 = NULL;
  BITMAP *lu5 = NULL;
  BITMAP *tlo = NULL;
  BITMAP *title = NULL;
  BITMAP *tlo2 = NULL;
  BITMAP *bufor = NULL;
  BITMAP *kursor =NULL;
  BITMAP *goo = NULL;

  bufor = create_bitmap(1280,1024);
  lu1 = load_bmp("1.bmp",default_palette);
  lu3 = load_bmp("2.bmp",default_palette);
  lu5 = load_bmp("3.bmp",default_palette);
  tlo= load_bmp("tlo.bmp",default_palette);
  tlo2= load_bmp("tlo2.bmp",default_palette);
  title= load_bmp("title.bmp",default_palette);
  kursor = load_bitmap("kursor.bmp",NULL);
  goo= load_bmp("goo.bmp",default_palette);


  if (!lu1  && !lu3 && !lu5 && !tlo && !title && !tlo2 && !kursor && !goo )

  {

    set_gfx_mode(GFX_TEXT,0,0,0,0);

    allegro_message("nie mogę załadować obrazka krótejś grafiki!");

    allegro_exit();

    return 0;

  }


  blit( tlo, bufor, 0,0,0,0 , tlo->w, tlo->h);
  masked_blit( lu1, bufor, 0,0, 80,700, lu1->w, lu1->h);
  masked_blit( lu3, bufor, 0,0, 80,800, lu3->w, lu3->h);
  masked_blit( lu5, bufor, 0,0, 80,900, lu5->w, lu5->h);
  masked_blit( title, bufor, 0,0, 300,100, title->w, title->h);
  blit( bufor, screen, 0,0,0,0, 1280,1024);

  install_mouse();
  show_mouse(screen);

  while(1)
  {
  rest(1);
  if( kolizja( mouse_x,mouse_y,80, 700, lu1->w, lu1->h)==true)
    {
        if(mouse_b == 1)
        {
        remove_mouse();
        install_mouse();
        int ilosc_goo = 5;
        int goo_vis[] = {1,1,1,1,1};
        int score = 0;
 
        while(!key[KEY_ESC])
        { 
          rest(10);
           clear_to_color(bufor, makecol(150,150,150));

           blit( tlo2, bufor, 0,0,0,0 , tlo2->w, tlo2->h);
           if(goo_vis[0] == 1) { masked_blit( goo, bufor, 0,0,300,800 , goo->w, goo->h); }
           if(goo_vis[1] == 1) { masked_blit( goo, bufor, 0,0,700,700 , goo->w, goo->h); }
           if(goo_vis[2] == 1) { masked_blit( goo, bufor, 0,0,900,700 , goo->w, goo->h); }
           if(goo_vis[3] == 1) { masked_blit( goo, bufor, 0,0,100,900 , goo->w, goo->h); }
           textprintf_ex(bufor,font,20,200,makecol(0,0,0),-1,"Myszka x = %d, y = %d, klawisz = %d ! , mouse_z = %d", mouse_x,mouse_y,mouse_b,mouse_z);
           textprintf_ex(bufor,font,20,100,makecol(0,0,0),-1,"score = %d", score);

        if(goo_vis[0] ==1)
        {
           if( kolizja( mouse_x+22,mouse_y+22,300, 800, goo->h, goo->w)==true)

           { 
              textout_ex(bufor,font,"Kolizja !",20,20 ,makecol(0,0,0),-1);
              if(mouse_b == 1)
              { 
                 goo_vis[0] = 0;
                 score ++;
               }
           }
        } 
        if(goo_vis[1] ==1)
          {
             if( kolizja( mouse_x+22,mouse_y+22,700, 700, goo->h, goo->w)==true)
             { 
                textout_ex(bufor,font,"Kolizja !",20,20 ,makecol(0,0,0),-1);
                 if(mouse_b == 1)
                 {
                    goo_vis[1] = 0;
                    score ++;
                 }
             }
           } 
           if(goo_vis[2] ==1)
            {
               if( kolizja( mouse_x+22,mouse_y+22,900, 700, goo->h, goo->w)==true)
              { 
                 textout_ex(bufor,font,"Kolizja !",20,20 ,makecol(0,0,0),-1);
                 if(mouse_b == 1)
                 {
                    goo_vis[2] = 0;
                    score ++;
                 }
              }
            } 
            if(goo_vis[3] ==1)
           {
               if( kolizja( mouse_x+22,mouse_y+22,100, 900, goo->h, goo->w)==true)
               { 
                  textout_ex(bufor,font,"Kolizja !",20,20 ,makecol(0,0,0),-1);
                  if(mouse_b == 1)
                  {
                     goo_vis[3] = 0;
                     score ++;
                   }
                }
           } 
           masked_blit( kursor, bufor, 0,0,mouse_x,mouse_y , kursor->w, kursor->h);
           blit( bufor, screen, 0,0,0,0, 1280,1024);

           }
      }
  }
  if( kolizja( mouse_x,mouse_y,80, 800, lu1->w, lu1->h)==true)
  {
       if(mouse_b == 1)
        {
           while(!key[KEY_ESC])
           {
              clear_to_color(bufor, makecol(150,150,150));
              blit( tlo, bufor, 0,0,0,0 , tlo->w, tlo->h);
              masked_blit( title, bufor, 0,0, 300, 100, title->w, title->h);  
              blit( bufor, screen, 0,0,0,0, 1280,1024); 
              show_mouse(screen);
           } 
        }
    }
   if( kolizja( mouse_x,mouse_y,80, 900, lu5->w, lu5->h)==true)
   {
      if(mouse_b == 1)
      {
         break; 
      }
    }
    else
    {
        blit( tlo, bufor, 0,0,0,0 , tlo->w, tlo->h);
        masked_blit( lu1, bufor, 0,0, 80,700, lu1->w, lu1->h);
        masked_blit( lu3, bufor, 0,0, 80,800, lu3->w, lu3->h);
        masked_blit( lu5, bufor, 0,0, 80,900, lu5->w, lu5->h);
        masked_blit( title, bufor, 0,0, 300, 100, title->w, title->h);
        blit( bufor, screen, 0,0,0,0, 1280,1024); 
        show_mouse(screen);
    }
}
//---------------------------------------------#############

allegro_exit();

return 0;
}

END_OF_MAIN();


i pętla, która sprawdza, czy został naciśnięty klawisz nad przyciskiem zajmuje cały czas procesora, próbowałem to rozwiązać przez rest(); , tylko że te funkcja także zużywa cały czas cpu...

w jaki inny sposób moge sprawdzić czy przycisk został naciśnięty ?

0

Nie przeglądałem tego do końca, ani nie kompilowałem, ale to:

           while(!key[KEY_ESC])
           {
              clear_to_color(bufor, makecol(150,150,150));
              blit( tlo, bufor, 0,0,0,0 , tlo->w, tlo->h);
              masked_blit( title, bufor, 0,0, 300, 100, title->w, title->h);  
              blit( bufor, screen, 0,0,0,0, 1280,1024); 
              show_mouse(screen);
           }

To użytkownik ma przy każdej kolizji walić w esc?</cpp>

0
krstk napisał(a)

Nie przeglądałem tego do końca, ani nie kompilowałem, ale to:

           while(!key[KEY_ESC])
           {
              clear_to_color(bufor, makecol(150,150,150));
              blit( tlo, bufor, 0,0,0,0 , tlo->w, tlo->h);
              masked_blit( title, bufor, 0,0, 300, 100, title->w, title->h);  
              blit( bufor, screen, 0,0,0,0, 1280,1024); 
              show_mouse(screen);
           }

To użytkownik ma przy każdej kolizji walić w esc?</cpp>

po naciśnięciu esc przechodzi się do poprzedniego menu

0

Przepraszam Cię, masz rację. Zalecam bardziej zrobić interfejs w WinApi, bo to w allegro jest dosyć toporne.

0
krstk napisał(a)

Przepraszam Cię, masz rację. Zalecam bardziej zrobić interfejs w WinApi, bo to w allegro jest dosyć toporne.

Ok, jak zaimplementujesz WinApi w Linuksie [browar] :-)

0

Aaa. Spoko.
A jakby tak sprawdzać współrzędne dopiero wtedy gdy przycisk myszy zostanie naciśnięty? Wtedy odpadnie wykonanie kilku instrukcji warunkowych na każde wykonanie pętli.

0

wtedy powstanie pętla sprawdzająca czy przycisk jest wciśnięty ;/ , a to nie zmniejszy zajętości czasu cpu przez program ( a jeśli już tak to bardzo niewiele ;/ , ) , a nie o to tu chodzi, bo teoretycznie, można by zredukować jakieś (bardzo na oko :p ) 95% tej zajętości

0

No właśnie. Po co sprawdzać czy kursor jest nad przyciskiem, skoro klawisz myszy nie jest wciśnięty?

0
krstk napisał(a)

No właśnie. Po co sprawdzać czy kursor jest nad przyciskiem, skoro klawisz myszy nie jest wciśnięty?

tego jeszcze nie ma w programie, ale będzie to do wyróżnienia przycisku ( tak jak masz np w normalnych buttonach w WinApi, jak najedziesz kursorem na przycisk to robi się jaśniejszy )

0

Dodaj do pętli usleep'a to nie będzie zarzynać procesora.

Poza tym namnożyłeś strasznie tych if'ów, nie tędy droga, użyj tablic i pętli, tyc if'ów powinno być 4x mniej.
Poza tym funkcje nie gryzą, podziel program na funkcje odpowiedzialne za pewne czynności, jak np. zainicjowanie grafiki, ustawienie początkowych parametrów gry, menu gry, sprawdzanie kolizji ...

0

usleep() nic nie zmienia..

przerzucam się na SDL :> , tam na eventach bedę mógł to zrobić bez żadnych pętli itp.

0
majorek napisał(a)

usleep() nic nie zmienia..
Zmienia, zmienia, tylko źle zastosowałeś. Teraz zauważyłem, że masz 'rest' na początku pętli, ale 1 milisekunda to za mało, daj kilkadziesiąt.

majorek napisał(a)

przerzucam się na SDL :> , tam na eventach bedę mógł to zrobić bez żadnych pętli itp.
W allegro też możesz sobie zainstalować timer'ka: http://alleg.sourceforge.net/stabledocs/en/alleg005.html

Poza tym nie narzekaj na pętle tylko naucz się najpierw z nich korzystać. W połączeniu z tablicami.
Naucz się programować proceduralnie, a na even'ty i programowanie obiektowe przyjdzie czas.
W kodzie jaki napisałeś powinno być 5x mniej if'ów i 5x więcej funkcji.
np.

if(goo_vis[0] ==1)
{
if( kolizja( mouse_x+22,mouse_y+22,300, 800, goo->h, goo->w)==true)

       {
          textout_ex(bufor,font,"Kolizja !",20,20 ,makecol(0,0,0),-1);
          if(mouse_b == 1)
          {
             goo_vis[0] = 0;
             score ++;
           }
       }
    }
    if(goo_vis[1] ==1)
      {
         if( kolizja( mouse_x+22,mouse_y+22,700, 700, goo->h, goo->w)==true)
         {
            textout_ex(bufor,font,"Kolizja !",20,20 ,makecol(0,0,0),-1);
             if(mouse_b == 1)
             {
                goo_vis[1] = 0;
                score ++;
             }
         }
       }

// itd ...
powinieneś zamienić na:

const int n = 4;
const int tabX[n] = { 300, 700, 900, 100 };
const int tabY[n] = { 800, 700, 700, 900 };
//powyższe stałe zadeklaruj na początku programu

for(int i = 0; i < n; i++)
{
           if( kolizja( mouse_x+22,mouse_y+22,tabX[i], tabY[i], goo->h, goo->w))
           {
              textout_ex(bufor,font,"Kolizja !",20,20 ,makecol(0,0,0),-1);
              if(mouse_b == 1)
              {
                 goo_vis[i] = 0;
                 score ++;
               }
           }
}

Pisz tak, aby w kodzie nie było podobnych powtarzających się fragmentów. To co miałoby się powtarzać pakuj w pętlę albo w nową funkcję.

0

tylko w tym przykładzie dałem rest(1) ... funkcje rest , usleep , sleep , gdy działają , to na wykresie w gnome-system-monitor mam maksymalne wykorzystanie cpu, polecenie ps też to pokazuje...

w tym kodzie jest tyle if'ów tylko dlatego że pisałem go na wszybko, widać to myślę na pierwszy rzut oka ( nierówne odstępy itp. )

teraz jak już "poukładałem kod" to racja, mam u mnie z 3x if'ów mniej...

A co do timerów, to przyznam że jeszcze na to nie patrzyłem ( dopiero się uczę allegro )

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