PDA

View Full Version : Beta Software production.... presents...


Banglit
03-09-2002, 11:48
Ebbene vi uppo un piccolo giochino che ho programmato in una notte (questa notte) con le Allegro. E' molto semplice come gioco i lfatto è che è nato come svago. Epppoi usa l'algoritmo di gestione delle collisioni di Nuitari!

Eccolo :) A presto vi uppo pure Pac-Man e un gioco top-secret che sto realizzando =)

http://members.xoom.it/betasoftware/setup.exe

Nuitari
03-09-2002, 18:09
Ehmmmm... mi sembra che abbia qualche problemuzzo... A parte che la musica s'interrompe quando spari, il puntatore ha diversi "glitches" grafici e mi è crashato improvvisamente senza che avessi fatto nulla di strano :eek:
Che ne dici di postare i sorgenti così che lo si possa correggere?

Banglit
03-09-2002, 22:23
Originally posted by Nuitari
Ehmmmm... mi sembra che abbia qualche problemuzzo... A parte che la musica s'interrompe quando spari, il puntatore ha diversi "glitches" grafici e mi è crashato improvvisamente senza che avessi fatto nulla di strano :eek:
Che ne dici di postare i sorgenti così che lo si possa correggere?

Ehehehe ottima idea =)

Banglit
04-09-2002, 11:47
Eccovi i sorgenti ^^


#include <allegro.h>
#include <winalleg.h>
#include <time.h>
#include <sys/timeb.h>


//Evento principale
main()
{

//Dichiarazione dei puntatori e variabili
PALETTE pal;
BITMAP *puntatore, *nemico, *crediti, *vittoria, *buffer, *immagine, *galleria;
SAMPLE *sparo;
MIDI *theme;
int ammo, score, errori, flag, flag_2, caricatore; //Logica di gioco var
int nemico_x, nemico_y, nemico_x2, nemico_y2; //Coordinate nemici
clock_t tempo = clock();
//Fine dichiarazione dei puntatori e variabili


//Inizializzazioni
allegro_init(); //Inizializza allegro
install_mouse(); //Inizializza mouse
install_timer(); //Inizializza timer indispensabili x il mouse
install_keyboard(); //Inizializza tastiera
install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT, NULL); //Inizializza suoni
//Fine inizializzazioni



//Scelta modalità grafica
set_color_depth(16);
set_gfx_mode(GFX_DIRECTX, 640, 480, 0, 0);
//Fine Scelta modalità grafica

//Inizializzazione buffer
buffer=create_bitmap_ex(16,640,480);

//Carico suoni in memoria
sparo=load_sample("sparo.wav");
theme=load_midi("theme.mid");

//Carico in memoria le bmp
puntatore=load_bitmap("puntatore.bmp", pal);
nemico=load_bitmap("nemico.bmp",pal);
crediti=load_bitmap("credits.bmp", pal);
vittoria=load_bitmap("vittoria.bmp", pal);
immagine=load_bitmap("immagine.bmp", pal);
galleria=load_bitmap("galleria.bmp",pal);

//Gestione degli errori (in caso mancasse qualche oggetto)
if (!sparo || !theme || !puntatore || !nemico || !crediti || !vittoria)
{
allegro_message("Errore nel caricamento delle bmp e nel caricamento dei MIDI!");
exit(1);
}

//Dichiarazione variabili logica di gioco
ammo = 20; //Totale pallottole
score = 0; //Setta punteggio a 0
errori = 10; //Numero massimo di errori consentiti
caricatore = 6;

//Posizione iniziale nemici
nemico_x=50;
nemico_y=50;

nemico_x2=640;
nemico_y2=200;


masked_blit(crediti,screen,0,0,0,0, crediti->w,crediti->h); //Stampa i crediti
readkey();

//Dichiaro che il puntatore del mouse è la bmp di puntatore
set_mouse_sprite(puntatore);

//Mostra il mouse sullo schermo
show_mouse(screen);

while (!key[KEY_ESC]) //Inizio ciclo while
{

//Stampo prima i nemici in modo che scompaiano se entrano in contatto coi bordi
masked_blit(nemico,buffer,0,0,nemico_x,nemico_y,ne mico->w,nemico->h); //Stampa il nemico sul buffer
masked_blit(nemico,buffer,0,0,nemico_x2,nemico_y2, nemico->w,nemico->h); //Stampa il nemico sul buffer

//Ora blitto la "galleria di tiro"
masked_blit(galleria,buffer,0,0,0,0,galleria->w,galleria->h); //Stampa il contorno sul buffer
if (key[KEY_X])
{
clear(screen);
masked_blit(immagine, screen, 0,0, 10,10, immagine->w, immagine->h);
}

if (!(mouse_b & 1)) flag = 1;
if (!(key[KEY_R])) flag_2 = 1;

if (key[KEY_M])
{
play_midi(theme, 0);
}

//Controllo per blittare con costanza il mouse ed evitare spiacevoli effetti grafici
if (mouse_x == mouse_x && mouse_y == mouse_y)
{
masked_blit(puntatore, buffer, 0, 0, mouse_x, mouse_y, puntatore->w, puntatore->h);
}

//Controllo per verificare che ammo sia diverso da 0
if (ammo != 0 || caricatore != 0)
{
//Controllo per sapere se il pulsante sinistro del mouse è premuto, esegue effetto sonoro e toglie i colpi
if ((mouse_b & 1) && flag && caricatore != 0)
{
play_sample(sparo, 255, 100, 100, 0);
caricatore--;
flag = 0;
}


//Controllo per sapere se il nemico è morto
if (mouse_b & 1 && caricatore != 0 && flag == 0 && mouse_x+puntatore->w <= nemico_x + nemico->w && mouse_y+puntatore->h <= nemico_y+nemico->h && mouse_x >= nemico_x && mouse_y >= nemico_y)
{
nemico_x=0;
nemico_y=50;
score=score+10;
play_sample(sparo, 255, 100, 100, 0);
caricatore--;
flag = 0;
}

if (mouse_b & 1 && caricatore != 0 && flag == 0 && mouse_x+puntatore->w <= nemico_x2 + nemico->w && mouse_y+puntatore->h <= nemico_y2+nemico->h && mouse_x >= nemico_x2 && mouse_y >= nemico_y2)
{
nemico_x2=640;
nemico_y2=200;
score=score+10;
play_sample(sparo, 255, 100, 100, 0);
caricatore--;
flag = 0;
}
}

textprintf(buffer, font, 20, 5, makecol( 35 , 125 , 87 ), "Ammo: %d", ammo);
textprintf(buffer, font, 150, 5, makecol( 35 , 125 , 87 ), "Caricatore: %d", caricatore);
textprintf(buffer, font, 420, 5, makecol( 35 , 125 , 87 ), "Score: %d", score);
textprintf(buffer, font, 540, 5, makecol( 35 , 125 , 87 ), "Errori: %d", errori);
textprintf(buffer, font, 400, 470, makecol( 35 , 125 , 87 ), "Programmato da: Matteo Bleggi");


//Funzione per prendere gli screenshots
if (key[KEY_F12])
{
save_bitmap("screen.bmp", buffer, pal);
}

if (score == 100)
{
textprintf(buffer, font, 20, 460, makecol( 35 , 125 , 87 ), "Inizi ad essere stanco...");
textprintf(buffer, font, 20, 470, makecol( 35 , 125 , 87 ), "Il gestore del tiro a segno ti regala 50 cartucce");
ammo = ammo + 50;
set_mouse_speed(5,5);
}

if (score == 250)
{
textprintf(buffer, font, 20, 460, makecol( 35 , 125 , 87 ), "Sei stanco...");
textprintf(buffer, font, 20, 470, makecol( 35 , 125 , 87 ), "Il gestore del tiro a segno ti regala 25 cartucce");
ammo = ammo + 25;
set_mouse_speed(9,9);
}

if (score == 400)
{
textprintf(buffer, font, 20, 470, makecol( 35 , 125 , 87 ), "Hai appena battuto il record del poligono... eccoti 100 cartucce");
ammo = ammo + 100;
}

if (score == 650)
{
textprintf(buffer, font, 20, 460, makecol( 35 , 125 , 87 ), "Sei veramente stanco...");
textprintf(buffer, font, 20, 470, makecol( 35 , 125 , 87 ), "Il gestore del tiro a segno ti regala 15 cartucce");
ammo = ammo + 15;
set_mouse_speed(8,8);
}

if (score == 700)
{
textprintf(buffer, font, 20, 470, makecol( 35 , 125 , 87 ), "Hai sfondato il record italiano di tiro a segno... eccoti 150 cartucce");
ammo = ammo + 150;
}

if (score == 1050)
{
textprintf(buffer, font, 20, 460, makecol( 35 , 125 , 87 ), "Sei sfinito...");
textprintf(buffer, font, 20, 470, makecol( 35 , 125 , 87 ), "Il gestore del tiro a segno ti regala 5 cartucce");
ammo = ammo + 5;
set_mouse_speed(6,6);
}


if (score == 1200)
{
textprintf(buffer, font, 20, 470, makecol( 35 , 125 , 87 ), "Hai polverizzato il record europeo di tiro a segno... eccoti 200 cartucce");
ammo = ammo + 150;
}

if (score == 1650)
{
textprintf(buffer, font, 20, 460, makecol( 35 , 125 , 87 ), "Sei esausto...");
textprintf(buffer, font, 20, 470, makecol( 35 , 125 , 87 ), "Il gestore del tiro a segno ti regala 5 cartucce");
ammo = ammo + 5;
set_mouse_speed(2,2);
}

if (score == 1800)
{
textprintf(buffer, font, 20, 470, makecol( 35 , 125 , 87 ), "Hai polverizzato il record mondiale di tiro a segno... eccoti 300 cartucce");
ammo = ammo + 150;
}


if (score == 2550)
{
textprintf(buffer, font, 20, 450, makecol( 35 , 125 , 87 ), "Nonostante la stanchezza hai vinto...");
textprintf(buffer, font, 20, 460, makecol( 35 , 125 , 87 ), "In base ai colpi risparmiati ti daremo un punteggio...");
set_mouse_speed(10,10);
score = score + ammo;
clear(screen);
remove_mouse();
masked_blit(vittoria,screen,0,0,100,50,screen->w,screen->h); //Stampa la scritta "Vittoria"
textprintf(buffer, font, 20, 470, makecol( 35 , 125 , 87 ), "Hai totalizzato %d punti!", score);
readkey();
exit(1);
}


if ((int)(clock () - tempo) / (int) CLOCKS_PER_SEC >= 4)
{

nemico_x++;
nemico_x2--;

if (nemico_x >= 640)
{
nemico_x=0;
errori--;
}

if (nemico_x2 <= 0)
{
nemico_x2=640;
errori--;
}

}

//Se errori o ammo arriva a 0 game over esce dal gioco
if (errori == 0) exit(1);
if (ammo <= 0) exit(1);

if (caricatore >= 0)
{
if (key[KEY_R] && caricatore <= 6)
{
if (flag_2 == 1)
{
caricatore = 6 - caricatore;
ammo = ammo - caricatore;
caricatore = 6;
flag_2 = 0;
}
}
}

//Blitta tutto il buffer sullo schermo
masked_blit(buffer,screen,0,0,0,0, buffer->w,buffer->h);
clear(buffer); //Pulisce il buffer

} //Fine ciclo while

destroy_bitmap(puntatore);
destroy_bitmap(nemico);
destroy_sample(sparo);
destroy_midi(theme);
}
END_OF_MAIN();

DM Ilweran
04-09-2002, 19:04
Mi spieghi anche cos'è ? :)
Credo di intuire ma non conoscendo le allegro e non sapendo cos'è il programma la vedo grigia :)
In ogni caso la prima cosa che mi salta all'occhio è che main non ritorna un intero, è undefined behavior.
Compila perchè supporta il l'ANSI89 o ancora prima il K&R ma ANSI dice int main (void) :)
Ciao

TC
04-09-2002, 19:32
giusto una cosa veloce veloce... invece di tutti quegli if score un bel case? piu' pulito e piu' ottimizzabile dal compilatore

Banglit
05-09-2002, 00:21
Gahhh =) Ora eseguo tutte le modifiche al codice che mi dite e vedo =)


Cmq DM (scusa è che il nome è complesso =) e sono le 1 di notte =PPP) Sono i sorgenti di un semplice giochino. Gira only sotto Windows ma se vuoi puoi convertirlo per sistemi UNIX =). Basta che ti scarichi le allegro per Unix, e le configuri col tuo compilatore fai copia/incolla e mi mandi un pm in cui mi chiedi la parte grafica ed è fatta =)

DM Ilweran
05-09-2002, 01:35
Ilwe va bene, anche DM, anche 'tu'.
Banglit io sono fottutamente pigro ......
Quando lo farò vedrò ti farti anche un porting se c'è qualcosa che non va.