(*Nome modulo: entita*)
(*Versione: 0.7-beta*)
(*Licenza: GNU GPL*)
(*Rilascio: 08/07/2010*)
(*Autore: Francesco Marrone (alias Giarados)*)
(*Descrizione: in questo modulo viene descritta la classe entita da cui
ereditano ghosts e pacmen. Si è preferito raggruppare i campi
in comune tra le due classi in modo tale da non vederli
ripetuti nelle loro dichiarazioni. *)
unit entita;
interface
{queste variabili vengono utilizzate nel main delle classi
ghosts e pacmen per regolare i propri stati}
{quando pacman mangia un supercibo setta questa variabile a true. Di conseguenza tutti i fantasmi fuggono e sono "commestibili"}
var fuga:boolean;
{se pacman riceve ESC setta questa variabile a true. allora il ciclo principale del main del gioco viene terminato}
var uscita:boolean;
{Quando pacman viene mangiato setta questa variabile true. Tutti i fantasmi e pacman stesso vengono reinizzializzati
alle loro posizioni iniziali}
var killato:boolean;
{Quando pacman viene killato con 0 vite setta questa variabile true. Si esce in automatico dal main del gioco}
var gameover:boolean;
{Se pacman mangia tutto il cibo allora setta vittoria a true. Ciò fa reinizzializzare tutte le entità in gioco
e aumenta di 1 le vite di pacman}
var vittoria:boolean;
{Rappresenta il livello di gioco. Ogni volta che vittoria=true questa variabile viene incrementata di 1.}
var livello:byte;
{Funzione che restituisce l'orario attuale espresso in secondi
a partire dalla mezzanotte}
function tempo:real;
{utilizzando la funzione tempo la procedura pausa è un'alternativa
a delay (contenuta in crt)
NOTA: va sostituita in tutti i moduli a delay}
procedure pausa(t:real);
{Definizione della classe entita.}
type
_entita=object
protected
{rappresentato l'ascissa e l'ordinata corrente
dell'entità}
x:byte;
y:byte;
{sono le coordinate da cui sbucano fuori le entita}
x_iniziale:byte;
y_iniziale:byte;
{Descrivono il movimento in x e y.}
vettore_x:shortint;
vettore_y:shortint;
nospace:boolean;
{il campo colore era utilizzato nelle prime versioni
dato che ancora il gioco non utilizzava le bitmaps.
Come è facilmente intuibile rappresentano il colore
delle entita.
PS: ancora è utile codesto campo}
colore:byte;
{Se settata a true allora i ghosts fuggono e pacman sa che
i ghosts stanno fuggendo}
infuga:boolean;
{Sarebbe il contatore che dice:
"-3 secondi e torni allo stato normale"
"-2 secondi e torni allo stato normale"
"-1 secondi e torni allo stato normale"
anche pacman la usa:
"-3 secondi e non li posso più mangiare"
"-2 secondi e non li posso più mangiare"
"-1 secondi e non li posso più mangiare"}
contatore_fuga:byte;
{le entità tengono conto della traslazione del
campo per la loro rappresentazione grafica}
traslazione_x:byte;
traslazione_y:byte;
{avete mai fatto caso all'ondulamento della gonnellina
dei fantasmi? oppure al fatto che un attimo pacman
ha la bocca aperta e l'attimo dopo è chiusa?
beh, tutto è regolato da stato_immagine e dal suo alternare
tra TRUE e FALSE}
stato_immagine:boolean;
{se immagine_caricata è TRUE allora significa
che l'inizializzazione delle bitmaps è andata
a buon fine, altrimente qualcuna era mancante.
In questo caso si fa uso della vecchia modalità grafica
con un cursore di dimensione dimensione_cella*dimensione_cella
di colore colore}
immagine_caricata:boolean;
{array contenente gli indirizzi alle bitmaps caricate in
memoria}
immagini:array[1..5] of pointer;
{accendi_cursore è ancora presente.
Primo: per oscurare la cella in cui l'entità si trovava
in precedenza
Secondo: nel caso in cui una o più bitmaps siano mancanti}
procedure accendi_cursore(ascissa,ordinata,color:byte);
public
{Il distruttore è lo stesso per tutte e due le classi
dato che di memoria da liberare vi è solo quella di immagini}
destructor free;
end;
implementation
uses wingraph,mura,dos;
{Libera la memoria occupata dalle immagini}
destructor _entita.free;
begin
if not nospace then
begin
freemem(immagini[1]);
freemem(immagini[2]);
freemem(immagini[3]);
freemem(immagini[4]);
freemem(immagini[5]);
end;
end;
{Procedura che accende un cursore colorato di dimensione dimensione_cella*dimensione_cella
NOTA: da eliminare il case of. In fin dei conti i colori sono dichiarati nella wingraph
come delle costanti di tipo longword. Basta passare quelle}
procedure _entita.accendi_cursore(ascissa,ordinata,color:byte);
var a:integer;
begin
if not nospace then
begin
case color of
1: setcolor(yellow);
2: setcolor(red);
3: setcolor(white);
4: setcolor(blue);
5: setcolor(green);
6: setcolor(orange);
7: setcolor(pink);
else setcolor(black);
end;
for a:=ascissa*dimensione_cella+1 to ascissa*dimensione_cella+dimensione_cella-1 do
line(a,ordinata*dimensione_cella+1,a,ordinata*dimensione_cella+dimensione_cella-1);
end;
end;
{Calcola l'ammontare di secondi trascorsi dalla mezzanotte}
function tempo:real;
var h,m,s,s100:word;
begin
GetTime(h, m, s, s100);
tempo:=3600*(h+0.0) + 60*m + s + 0.01*s100;
end;
{Utile alternativa a delay
NOTA: da sostituirsi a tutti i delay nei moduli}
procedure pausa(t:real);
var t0:real;
begin
t0:=tempo;
while tempo-t0<t do;
end;
end.