Questo esempio mini gioco, non utilizza una mappa per gli spostamenti della nostra lumaca

PROGRAM esempio_4;

GLOBAL
memoria;
musica;
suono1,suono2,suono3;
numero_colonne[15];
colonne[15];
frutta;
frequenza;
caduta;
punti;
livello;
superato;
cubi;
cuore;
BEGIN
set_fps(25, 0);
set_mode(320, 240, 16);
load_fpg("lezioni\lezione-4\esem-4.fpg");
load_fnt("lezioni\lezione-4\esem-4.fnt");
musica = load_song("lezioni\lezione-4\badmoon.mod",1);
suono1 = load_wav("lezioni\lezione-4\slam.wav");
suono2 = load_wav("lezioni\lezione-4\bloink.wav");
suono3 = load_wav("lezioni\lezione-4\beep1.wav");
Menu();

END

//************************************************************************//
// PROCESSO MENU' //
//************************************************************************//

PROCESS Menu()
BEGIN
delete_text(0);
for(x=0;x<=15;x++)numero_colonne[x] = 226; end
for(x=0;x<=15;x++)colonne[x] = 0; end
cubi=0;
punti=0;
cuore=0;
let_me_alone();
fade_on();
play_song(musica);
write (1, 100, 60, 3, "Difficoltà:");
write (1, 100, 90, 3, "1. Facile");
write (1, 100, 120, 3, "2. Normale");
write (1, 100,150, 3, "3. Difficile");
write (1, 100,180, 3, "Esc. Esci");


graph = write_in_map (1, "Slug", 4); // Pone il titolo
size = 200;
x = 160;
y = 20;
timer=0;

LOOP // finisce se viene selezionato un livello
FRAME;

if(key(_esc) and timer>=50)
fade_off();
exit("www.gemixstudio.it",0);
end

// stabilisce le varie opzioni di difficoltà

IF (key(_1))
livello_selezionato(1);

BREAK;
END
IF (key(_2))
livello_selezionato(2);

BREAK;
END
IF (key(_3))
livello_selezionato(3);

BREAK;
END
END

delete_text(0);
Inizio();
END

//************************************************************************//
// PROCESSO LIVELLO_SELEZIONATO //
//************************************************************************//

PROCESS livello_selezionato(l)
BEGIN

// assegna le varie opzioni in base al livello selezionato
IF (l == 1)
frequenza = 150;
frutta = 6;
caduta = 4;
livello=2;
superato=48;
END
IF (l == 2)
frequenza = 120;
frutta = 4;
caduta = 8;
livello=4;
superato=80;
END
IF (l == 3)
frequenza = 70;
frutta = 2;
caduta = 10;
livello=6;
superato=112;
END


END

//************************************************************************//
// PROCESSO INIZIO //
//************************************************************************//

PROCESS Inizio()
BEGIN
put_screen(0,20);
size = 50;
WRITE_INT(1,10,0,0,OFFSET punti);
WRITE_INT(1,280,0,0,OFFSET cuore);
put(0,11,260,15);
Slug(100,200,100);
Vita(120,8);
Vita(100,8);
Vita( 80,8);
Attore1();
END

//************************************************************************//
// PROCESSO VITA //
//************************************************************************//

PROCESS Vita(x, y)
BEGIN
size = 50;
timer[1] = 0;


//WRITE(0,10,35,0,"MEMORIA LIBERA:");
//WRITE_INT(0,100,35,0,OFFSET memoria);

LOOP
//memoria=Memory_Free(); // questa funzione ci occore durante la progettazione dei giochi
// in quanto ci da sempre la memoria disponibile del computer

IF ((timer[1] % 50) > 25)
graph = 1;
ELSE
graph = 2;
END
IF (timer[1] > 120)
flags = 1; // gira a sinistra
x--; // cammina
ELSE
flags = 0; // gira a destra
x++;
END
FRAME ;
IF (timer[1] > 240) timer[1] = 0; END
if(key(_esc))fade_off(); clear_screen(); Menu(); end
END
END

//************************************************************************//
// PROCESSO SLUG //
//************************************************************************//

PROCESS Slug(x, y, size)
PRIVATE
prex;
salto;
altezza_a;
a;b;c;
x2;
BEGIN
z=-10;

LOOP


IF (size < 100) size += 2; END

IF ((timer[1] % 50) > 25) // Anima il grafico
graph = 1;
ELSE
graph = 2;
END

c=0; // correggiamo la posizione del nostro personaggio nelle colonne
b=0;

for(a=0;a<=x;a++)
b++;
if(b==20) b=0;c++;end
end
if(b<=19 and a==x)c++; end
altezza_a=colonne[c];
altezza_a*=20;
altezza_a=206-altezza_a;

IF (salto > 0) // salto in curso
y -= salto;
salto--;

ELSE
IF (y < altezza_a )
y+=5;
ELSE
IF (collision(TYPE Mattoni))

if(flags == 0) x=c*20+10; else x=c*20+9; end end // correggiamo la posizione del nostro personaggio nelle colonne
y = altezza_a;
IF (key(_up)) salto = 7; END // e possibile saltare solo se ha il suolo

IF (key(_SPACE) and cuore>=1) cuore--; salto=14; END // e possibile saltare solo se ha il suolo e la disponibilità
END
END

prex=x;

IF (key(_left)) x-=5; flags = 1; END
IF (key(_right)) x+=5; flags = 0; END

IF (x < 9) x = 9; END
IF (x > 310) x = 310; END
IF (collision(TYPE Mattoni)) x = prex; END


if (cubi==superato)
frame(5000);
flags = 0;
from x2=1 to 340 step+1;
x+=x2;
frame;
end
end

FRAME;

END
END

//************************************************************************//
// PROCESSO ATTORE 1 //
//************************************************************************//

PROCESS Attore1()
PRIVATE
a;
b;
cade[15];
img;
BEGIN

x=30;
y=0;
//graph = 3;// il nostro attore fantasma se gli assegniamo un grafico verrà visualizzato
b=1;

LOOP

IF (a)

b++;
x+=20;

ELSE

b--;
x-=20;
END

IF(rand(0,200)> frequenza AND cade[b]<=livello)
IF(cubi>=25 )frequenza--;END

img=rand(3,11);
if(img<=5)
cade[b]+=1;
Mattoni(x,y,b,img);
else
Doni(x,y,b,img);
end

frame(2000);
END


if (cubi==superato)
WRITE(1,110,10,0,"*HURRA!*");
frame(20000);
fade_off();
clear_screen();
menu();
break;
end

IF (x>=310) a=false; END
IF (x<=10) a=true; END


FRAME;
END
END

//************************************************************************//
// PROCESSO MATTONI //
//************************************************************************//

PROCESS Mattoni(x,y,altezza,graph)
PRIVATE
b_y;
r=20;

BEGIN

b_y=numero_colonne[altezza]-=20;
z=10;

WHILE (r>0)
r--;
y ++;
FRAME;
END

LOOP
IF (collision(TYPE Slug) AND (graph<=5))
Morto();
END
IF (y<b_y)
y += caduta;

else
y=b_y;
sound (suono3, 64, 512);

colonne[altezza]+=1;
cubi++;

BREAK;

END

FRAME;

END


loop
frame;
end

END

//************************************************************************//
// PROCESSO DONI //
//************************************************************************//

PROCESS Doni(x,y,altezza,graph)
PRIVATE
b_y;
r=20;
tempo;
BEGIN


b_y=numero_colonne[altezza];
b_y-=20;
z=100;

WHILE (r>0)
r--;
y ++;
FRAME;
END

LOOP
IF (collision(TYPE Slug))if(graph==11)cuore++;end sound (suono1, 64, 512);graph=21;punti+=10; break;END

IF (y<b_y)

y += caduta;

else
y=b_y;
sound (suono3, 64, 512);

BREAK;
END

FRAME;

END

tempo=0;
loop
tempo++;
if(size>=1 and tempo>60)size-=10;end
IF (collision(TYPE Slug))if(graph==11)cuore++;end sound (suono1, 64, 512);graph=21;punti+=10; END

frame;
end

END
//************************************************************************//
// PROCESSO MORTO //
//************************************************************************//

PROCESS Morto()
PRIVATE
proc;
BEGIN
sound (suono2, 64, 256);
// ottiene ID del protagonista
proc = get_id(TYPE Slug);

// scomponi in varie miniature il protagonista
Slugx (proc.x, proc.y, -30, -10);
Slugx (proc.x, proc.y, 30, -10);
Slugx (proc.x, proc.y, -20, -0);
Slugx (proc.x, proc.y, 20, -20);
Slugx (proc.x, proc.y, -10, -40);
Slugx (proc.x, proc.y, 10, -40);
Slugx (proc.x, proc.y, -10, 0);
Slugx (proc.x, proc.y, 10, 0);
signal (proc, S_KILL); // elimina il protagonista


WHILE (get_id(TYPE Slugx)) // attende che non vi siano miniature nello schermo
FRAME;
END


proc = get_id(TYPE Vita);
IF (proc);

FROM x = 0 TO 20; FRAME; END
Slug(proc.x, proc.y, 50);
signal (proc, S_KILL); // elimina una vita
ELSE

FROM x = 0 TO 40; FRAME; END // aspetta un poco
fade_off();
clear_screen();
Menu(); // Ricomincia il gioco
END
END

//************************************************************************//
// PROCESSO SLUGX //
//************************************************************************//


PROCESS Slugx (x, y, vel_x, vel_y)
BEGIN
graph = 1;
size = 25;


resolution = 10;
x *= 10; y *= 10;

WHILE (y < 20000)
y += vel_y;
x += vel_x;
vel_y += 10;
angle += 2000;
FRAME;
END
END

IndietroTutorialAvanti