AGS – Parte 5 – Programmazione e Esempi

AGS

passiamo ora alla parte piu’ difficile ma che una volta appresa rendera’ possibile creare qualsiasi cosa

Ogni volta che in un iterazione dle pannello Events (il simbolo col fulmine sopra alle tabelle di oggetti, personaggi, bottoni ecc.) viene aprta un afunzione o nel Global Script o nella Room specifica in caso di un elemento della Room stessa

questo perche’ tutto cio’ che e’ presente nel Global Script e’ presente in tutto il gioco mentre tutta la programmazione delle interazioni della stanza e’ limitata alla stanza stessa percio’ quando si scrive l’interazione di un personaggio (global script) non si puo’ influire su un elemento della stanza come un hotspot o un object (script della stanza in cui si trova)

La programmazione ha delle semplici regole di punteggiatura, ogni parentesi deve avere una chiusura e ogni frase deve finire con un punto e virgola ; per poter passare alla prossima riga

Ora elenchero’ gli script piu’ comuni, che useremo per creare la nostra avventure, sono faicli da memorizzare e facilmente reperibili nel caro DYNAMIC HELP

"script name personaggio".ChangeRoom(int room, int x, inty);

questo comando teletrasporta un personaggio (funziona su personaggi giocanti e non e in qualsiasi momento e luogo) nella stanza indicata tra parentesi e nelle coordinate x e y sempre indicate tra parentesi

"scriptnamepersonaggio".Say("");

Questo comando indica che il tale personaggio pronuncia la frase scritta tra le virgolette (in cas il perosnaggio non sia nella nostra stessa stanza, la frase appare al centro dello schermo)

"scriptname personaggio".AddInventory("scriptname oggetto");
"scriptname personaggio".LoseInventory("scriptnameroggetto");

Aggiunge/toglie un oggetto dall’inventario del personaggio scelto (protagonista o altro personaggio in caso di giochi come Maniac Mansion dove ci sono piu’ personaggi e piu’ inventari)

"scriptname musica".Play();

viene eseguita una musica o un suono

"scriptname dialogo".Start();

Parte il dialogo indicato

"script name gui".Visible = True;
"script name gui".Visible = false;

Rende visibile/invisibile una GUI

"script name object".Visible = True;
"script name object".Visible = false;

Rende Visibile/invisibile l’object di una mappa

"scriptname hotspot".Enable = true;
"scriptname hotspot".Enable = false;

Rende Visibile/invisibile un hotspot

Wait();

Pausa tra uno script e l’altro di un numero di fps a seconda del numero inserito tra parentesi

"scriptname personaggio".ChangeView();

Cambia la view di base di un personaggio (nel caso del protagonista e’ quella della camminata)

"scriptname personaggio".SpeechView = int ;

Cambia la talk view del personaggio

"script name perosnaggio".SetIdleView( int view, int delay);

Da a un personaggio una determinata dileview, ovvero una view che viene in caso di inattivita’ ripetuta ogni tot, la pausa e’ determinata dal numero inserito al posto di “int delay”

Un esempio puo’ essere Simon The Sorcere che se non viene mosso per un po’ inizia giochicchiare col cappello

object[0].Animate(2, 5);

Anima un oggetto della mappa contrassegnato dal suo numero, il primo numero tra parentesi indica la view mentre il secondo il loop

cMan.FollowCharacter(cEgo, 5, 80);

Il personaggio specifico seguira’ il personaggio tra parentesi (in questo caso il protagonista), 5 rappresenta la distanza in pixel trai due e 80 quanto aspetta il personaggio che segue a partire dopo che l’altro si e’ mosso
Un esempio dell’effetto di questo script e’ Max di Sam e Max o Bagaglio di DiscWorld

PlayVideo("intro.mpg", eVideoSkipEscKey, 1);

Indica il video da mostrare, come e se poter skippare il video (per vedere le varie opzioni usate il dynami help alla voce video)

ShakeScreen(5);

Scuote lo schermo creando un effetto terremoto per un tempo determinato dla numero tra parentesi

Ci sono molti altri script ma questi sono quelli basilari per avere un’avventura classica

Ora parlaimo di come creare una struttura per un enigma e delle condizioni

CONDIZIONI

le condizioni piu’ comuni sono due, usare un determinato oggetto e possdere un determinato oggetto

una condizione del tipo “possedere un oggetto” appare cosi’

if (player.HasInventory("script name dell'oggetto")){
}

else { }

dentro alla prima parentesi graffa andra quello che acacde se abbiamo l’oggetto specificato

mentre nella parentesi graffa dopo else (altrimenti) ci andra’ cosa succede se non lo abbiamo, dopo nel dettaglio vedremo un esempio

Mentre questa e’ una condizione del tipo “usare un oggetto”, funziona allo stesso modo ma e’ un po diversa nella prima riga


if (player.ActiveInventory == "scriptname dell'oggetto"){

}

else { }

Possiamo anche non mettere l’opzione else ma in quel caso se non rispettiamo l’esigenza della condizzione non succedera’ niente

Ora passiamo a qualche esmpio che potete provare a programmare come esercizio

ESEMPIO ZERBINO-CHIAVE-PORTA

Allora ci troviamo in una stanza con una porta chiusa e uno zerbino
il nostro protagonista vara’ lo script name cEGO come negli esempi di AGS

Creiamo un oggetto dell’inventario nell’apposita sezione e chiamiamolo come vogliamo, sara’ la nostra chiave, qui nel esempio lo chiameremo iKEY

Sia che lo zerbino sia un Hotspot (lo chiameremo hZERB) sia che sia un Object (lo chiameremo oZERB), andiamo nella sua pagina EVENTS (fulmine sopra la tabella dei suoi dati) e clicchiamo sull’interazione che vogliamo mettere per trovare la chiave nascosta sotto, direi o Look o Interact

Cliccato sul tasto […] vicino all’interazione apparira l’apposito spazio nel room script dove inseriremo

cEGO.AddInventory(iKEY);

ora guardando i spostando lo zerbino abbiamo agigunto la chiave all’inventario, il problema e’ che s elo rifacciamo otterremo un’altra chiave


ci sono tre modi per risolvere questo problema

se lo zerbino e’ un hotspot possiamo disabilitarlo
sempre subito dopo aver ottneuto l’oggetto nella setssa funzione

hZERB.Enabled = false;

Se e’ un oggetto possiamo creare un altro oggetto zerbino uguale e nell asetssa posizione ma che pero’ parte con Visibility “false” in questo modo quando avremo preso al chiave quello che da’ le chiavi scomparira’ e comparira’ quello invece che dara’ un messaggio del tipo “non c’e’ piu’ niente”

avremo una cosa simile quindi

cEGO.AddInventory(iKey);
oZERB.Visible = false;
oZERB2.Visible = true;

poi nella stessa funzione ma dello zerbino numero due metteremo

cEGO.Say("oltre alla chiave non c'era nient'altro");

Infine possiamo usare una condizione (sia che sia un hotspot che sia un object)

if (player.HasInventory(iKEY)) {

cEGO.Say("oltre alla chiave non c'era nient'altro");
}

else { cEGO.AddInventory(iKEY);
cEGO.Say("hey! c'e' una chiave sotto allo zerbino");}

in questo caso prima va messo cosa succede se l’abbiamo e quinid la frase d’ordinanza, e dopo l’else cosa succede se non l’abbiamo e quindi la raccolta della chiave.

Il problema di questo sistema e’ che una volta che abbiamo usato l’oggetto se c’e’ la possibilita’ di reinteragire lo possiamo riottenere

ora vediamo come si comporta la porta

creiamo due oggetti nella mappa uno e’ la porta apert oPOR2 e l’altro la porta chiusa oPOR

la porta chiusa parte visibile quella aperta no

Ora nella funzione della porta chiusa “Use inventory on object”

scriviamo

if (player.ActiveInventory == iKEY){
cEGO.Say("bene si e' aperta");
oPOR.Visible = false;
oPOR2.Visible = true;
}

else { cEGO.Say("non e' cosi' che si apre una porta);}

infine nell’object porta aperta, POR2 mettermo nella funzione “interact”

cEGO.ChangeRoom( 2, 100, 100);

e avremo creato il nostro sistema di porte (unilaterale)
fate in modo che il personaggio finisca in una walkablearea altrimenti rimarra’ bloccato, le coordinate fanno come sempre riferimento alla linea di terra dle personaggio

questo sistema puo’ essere riutilizztao per i personaggi e l’unione degli oggetti dell’inventario

Si ringrazia WarioPunk del forum di Arena80 per la guida.

Riguardo a Protagora

Vedi Anche

AGS – Parte 2 – colours, sprites, fonts

Seconda parte della nostra guida su AGS, su colours, sprites e fonts.