Skocz do zawartości

Prosta gra w allegro


Rekomendowane odpowiedzi

Opublikowano

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();

Opublikowano

Eh, myślałem, że to będzie coś lepszego... ;P ja się bawię w allegro i takie coś zrobiłem, no ale dla początkujących programistów, którzy korzystają z Allegro na pewno się przyda :)

Bardzo ładnie opisane.

Opublikowano

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

Opublikowano
void increment_speed()

{

speed++;

}

Padłem.

 

Po primo to allegro moim zdaniem zwykły badziew, a po drugie primo to zgadzam się z poprzednikiem - złych nawyków to uczy.

Opublikowano

Wiem wiem, jak już pisałem, wszystko tworzone było dawno temu.

A increment_speed jest odzelną funkcją z racji ze prócz samego speed miało być tam więcej kodu.

Opublikowano

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

Opublikowano

Mi się przyda bo akurat uczę się Allegro i hawkNL =)

Co do increment_speed i "Padłem" - tak działają timery w allegro =/ a moim zdaniem allegro to dobry lib i ma funkcje porównywalne z gmem.

Opublikowano

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

Opublikowano

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ść. ;]

Opublikowano

Harry, Allegro jest gorsze wydajnościowo pewnie od GM, bo ponieważ w Allegro jest grafika renderowana przez procesor, w GMie przez Directa na karcie, jest róznica? : D

Opublikowano

Dla niewtajemniczonych, Allegro korzysta z DDrawa ( pod wine ofc. ). Dlatego Allegro ssie :)

E: Natomiast można go połączyć z inną biblioteką ( np OGL ), wtedy warto użyć takiej biblioteki ( Multiplatformowość ) ;p

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