Skocz do zawartości

Prosta gra w allegro


Boro Casso

Rekomendowane odpowiedzi

Wszystko pisane było w devie bardzo dawno temu, odkopałem mój stary przykład więc publikuje, może komuś się przyda.

 

/*
  Przykład stworzony przez Boro casso
  Obrazuje on Praktycznie zastosowanie w stopniu podstawowym biblioteke allegro.
  Jeżeli masz jakieś pytania gg:6854542
                             E-mail borocasso[malpa]gmail.com
  Gra posiada wszystkie niezbedne opcje.
  Wszystkie funkcje zostały opisane za pomocą komentarzy.
*/
#include <allegro.h>
#include <string>
#include <iostream>
#include <ctime>

using namespace std;
volatile long speed = 0;
void increment_speed()
{
  speed++;
}
END_OF_FUNCTION(increment_speed);
LOCK_VARIABLE(speed);
LOCK_FUNCTION(increment_speed);

int main()
{
srand(static_cast<int>(time(NULL)));
  allegro_init(); //Deklaruje funkcje allegro
  install_keyboard(); //Deklaruje obsługę klawiatury
  set_color_depth(16); //Ustawia głębię kolorów, możliwe tryby to : 8, 15, 16, 24, 32 bity.
  set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,600,0,0); //Tym poleceniem włączamy tryb graficzny. liczby 800 i 600 to rozdzelczość
  install_timer(); //Uruchamia timer
  install_int_ex(increment_speed, BPS_TO_TIMER(80)); //Deklaruje timer
  BITMAP *bufor = NULL;           //
  BITMAP *postac_gora00 = NULL;   //Deklarowanie zmiennych
  BITMAP *monster = NULL;         //
  BITMAP *drzewo_spr = NULL;         //
   
bufor = create_bitmap(800,600);  //Tworzenie bufora.
postac_gora00 = load_bmp("gracz.bmp",default_palette); //Ładowanie zasobów graficznych.
monster = load_bmp("monster.bmp",default_palette);
drzewo_spr = load_bmp("drzewko.bmp",default_palette);

int ludek_x = 1, ludek_y = 1, ludek_hp = 100; //Zmienne dotyczące postaci gracza
int monster_hp[10], monster_x[10], monster_y[10], strona_mon = 1; //Tablice dotyczące przeciwników
int map[800][600]; //Tablica dotycząca mapy
int frame = 0; //Zmienne która będzie stosowana do zarządzania klatkami animacji.
string strona = "lewo"; //Zmienna łańcuchowa.

for (int i=1; i<=10; i++)//Pętla wypełniająca talice z potworami
{
    monster_hp[i]=100; //Zdrowie
    monster_x[i]=rand() % 800; //Połozenie na osi x
    monster_y[i]=rand() % 600; //Połozenie na osi y
}

for (int i=1; i<=800; i+=32)//Pętla wypełniająca talice z mapą
for (int j=1; j<=600; j+=32)
{
    map[i][j]=rand() % 10;
}


while( !key[KEY_ESC]) //Pętla, w środku niej podajemuwszystki akcje dot. gry.
{

//textprintf(screen,font,20,20,makecol(255,255,128),"HP: %d",ludek_hp);  //Rysuje napis hp: nasze zdrowie.

  while( speed > 0)
  {
    if( key[KEY_LEFT] && (map[ludek_x-32][ludek_y]!=8) && (frame==0 || frame==20)) {
                       
                        ludek_x-=32; strona = "lewo";
                        } //Poruszanie się lewo
                       
   
    if(key[KEY_RIGHT] && (map[ludek_x+32][ludek_y]!=8) && (frame==0 || frame==20)) {
                       ludek_x+=32; strona = "prawo";
                       } //Poruszanie się prawo
    if(key[KEY_UP] && (map[ludek_x][ludek_y-32]!=8) && (frame==0 || frame==20)) {
                    ludek_y-=32; strona = "gora";
                    } //Poruszanie się górę
    if(key[KEY_DOWN] && (map[ludek_x][ludek_y-32]!=8) && (frame==0 || frame==20)) {
                       ludek_y+=32; strona = "dol";
                       } //Poruszanie się dół
                       
                       
    speed--; frame++; if( frame > 39) frame=0;
  }
  clear_to_color(bufor, makecol(80,220,80)); //Rysuje tło.

//Rysowanie gracza \/

if( frame<20) { draw_sprite(bufor, postac_gora00, ludek_x, ludek_y); }
else if( frame>=20 && frame<40) { draw_sprite(bufor, postac_gora00, ludek_x, ludek_y); }
//Rysowanie gracza /\

for (int i=1; i<=10; i++) //Pętla obsługująca przeciwników.
{
strona_mon = rand() % 10; //Losowanie strony poruszania się przeciwnika
if (strona_mon == 0 && (frame==0 || frame==20) ){ monster_x[i]+=32;}
if (strona_mon == 1 && (frame==0 || frame==20)){ monster_y[i]+=32;}
if (strona_mon == 2 && (frame==0 || frame==20)){ monster_x[i]-=32;}
if (strona_mon == 3 && (frame==0 || frame==20)){ monster_y[i]-=32;}
draw_sprite(bufor, monster, monster_x[i], monster_y[i]); //Rysowanie przeciwnika
}



for (int i=1; i<=800; i+=32)//Pętla wypełniająca talice z mapą
for (int j=1; j<=600; j+=32)
{
   if (map[i][j]==8) {draw_sprite(bufor, drzewo_spr, i, j);}
}


for (int i=1; i<=10; i++) //Pętla odpowiedzalna za walkę
if (ludek_x>=monster_x[i]-15 && ludek_x<=monster_x[i]+15 && ludek_y>=monster_y[i]-14 && ludek_y<=monster_y[i]+14)
{ ludek_hp=ludek_hp - (rand() % 3);
  monster_hp[i]=monster_hp[i] - (rand() % 5);
  if (monster_hp[i]<=0) { monster_x[i]=-100; }
}
blit( bufor, screen, 0,0,0,0, 800,600); //Kopiowanie bufor na ekran

}
//Czyszczenie zasobów
remove_int( increment_speed);
destroy_bitmap(postac_gora00);
destroy_bitmap(monster);
destroy_bitmap(bufor);
allegro_exit(); //Wychodzenie z trybu allegro
return 0; //Program zwraca 0
}
END_OF_MAIN();

Odnośnik do komentarza
Udostępnij na innych stronach

Może i nie ma dużych możliwości, ale 90% amatorskich twórców gier nawet nie wykorzysta możliwości Allegro w 100% (: . A kod bardzo IMHO nieczytelny. Lepiej porobić sobie funkcje odpowiadające za przesunięcie, narysowanie itd. Kod jest czytelniejszy, no i nie trzeba potem powielać kodu, jak chcemy dodać drugą postać, która się porusza. Aczkolwiek, jak ktoś się uczy, to może się mu przydać, chociaż kod ten uczy trochę złych nawyków jak na mój gust. 4/5 ;P

Odnośnik do komentarza
Udostępnij na innych stronach

Kod nieczytelny, jeśli dobrze przejrzałem kod, potwory przechowujesz na tablicach? I to w dodatku jakoś egzotycznie, nie lepiej na structach? A no i std::list.

 

Pental, bo dodaje prędkość CO KLATKĘ? ; d - Jednak nie, bo to jest do jakiegoś timera podpięte. ;D

Odnośnik do komentarza
Udostępnij na innych stronach

Chodzi mi o to, że po cholerę robić funkcję, w której znajduje się JEDNA linia. Na dodatek nic nie zwracająca.

 

Czekam do 24 na odpowiedź...
Zdążyłem :)

 

Ed: Oj, wpadłem :P

Nie analizowałem całego kodu.

Myślałem, że używasz increment_speed() po prostu jako zamiennika speed++ xd...

 

Niech będzie, zwracam honor... :P

Odnośnik do komentarza
Udostępnij na innych stronach

Harry: Ja nie sądzę by allegro można by porównać do gm'a. Gm ma szereg wbudowanych funkcji i ma tryb 3D (słaby ale jest). Nie sugeruje że allegro nie obsługuje 3D ale jest to tylko rendering programowy, które ma dużo słabsze możliwosci od tego co oferuje nam gm. Ale jedynym dużym plusem allegro w walce z gm'em jest wydajność. ;]

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