(anche se nel frattempo propongo una cosa: perchè non contatti un moderatore e magari gli chiedi di spostare questa discussione in un topic creato a parte, magari con titolo: Adventure Games Studio ecc. ecc. così anche altri possono capire di cosa si parla, anzichè lasciarlo in "sviluppo multipiattaforma?)
Come aggiornare lo stato degli eventi globali? Ad esempio un personaggio mi ha dato una chiave a seguito di un dialogo. Come faccio ad aggiornare lo stato della chiave? Devo crearlo come oggetto nascosto da qualche parte della stanza e trattarlo come un normale oggetto? E se si, l'evento dove lo ficco, in mezzo al dialogo è possibile?
Qui innanzitutto bisogna fare un distinguo: si parla di "variabili globali" o di "oggetti dell'inventario"?
Mi spiego meglio: un personaggio che ti da una chiave si potrebbe configuare come mi da un "oggetto" da mettere nell'inventario. Per fare ciò bisogna innanzitutto creare un inventario: per crearlo (ammesso che tu non abbia utilizzato un "modello" di gioco già parzialmente strutturato) devi creare una GUI in cui posizionare un inventory window, magari acessibile premendo un pulsante sempre presente nello schermo mediante un'altra gui (ad esempio "inventory button). Una volta creata l'interfaccia grafica dell'inventario, crea un "item" nell'apposito menù: ad esempio iChiave (con la sua icona grafica, la sua icona puntatore, ecc.). A questo punto bisogna associare ad un determinato evento (ad esempio nel dialogo, Pippo chiede "mi dai la chiave" Topolino risponde: "certo eccola!") lo script: cPippo.AddInventory(iChiave).
Nell'inventory window comparirà l'item "iChiave"
Ora hai la chiave nell'inventario.
Se ora hai una porta e la vuoi aprire con la chiave hai due strade: o fai "usare" l'item iChiave sull'oggetto (o su hotspot) porta, oppure fai in modo che quando il personaggio clicchi sulla porta il programma verifichi che hai la chiave e, se ce l'hai, la apre:
facciamo un esempio concreto:
Dialogo:
cPippo.say("Hai la chiave?");
cTopolino.say("Certo!, eccola!");
cTopolino.LockView(12); //toplino cambia vista, assume ad es. la vista N.12 che è quella contente l'animazione di topolino che porge la chiave.
cTopolino.Animate(1, 7, eOnce, eBlock, eForwards); //animazione di topolino che porge la chiave (è solo un esempio)
Wait(5); //pausa di 5 cicli (40 cicli = circa 1 secondo)
cTopolino.UnlockView();
cTopolino.ChangeView(2); // topolino riassume la sua "forma normale" ad es. la vista N.2
cPippo.Addinventory(iChiave); // ora hai la chiave in inventario
Ora vediamo la funzione in caso tu voglia far usare la chiave sulla porta; supponiamo che la porta sia un object e supponiamo che tu voglia creare una funzione richiamata se il giocatore clicca sulla porta con un oggetto in inventario selezionato. la funzione sarà del tipo:
function oPorta_UseInv()
{
if (cPippo.ActiveInventory == iChiave) // se l'oggetto selezionato è proprio la chiave
{
if (porta_aperta == 0) // se la porta è chiusa
{
cPippo.Walk(200, 200, eBlock); //pippo si avvicina alla porta, ad esempio in x=200 y=200
cPippo.FaceLocation(800, cDonald.y, eBlock); //pippo si gira verso destra
cPippo.LockView(20); //pippo cambia vista, assume ad es. la vista N.20 che è quella contente l'animazione di pippo che apre la porta con la chiave.
cPippo.Animate(1, 5, eOnce, eBlock, eForwards); //animazione di pippo che gira la chiave (è solo un esempio)
//qui ci sarebbe da far sentire il suono della serratura
porta_aperta = 1; //variabile porta aperta è posta pari ad uno
cPippo.UnlockView();
cPippo.ChangeView(1); // pippo riassume la sua "forma normale" ad es. la vista N.1
}
else //la porta è già aperta
{
cPippo.say("La porta è già aperta!");
}
else // ho selezionato un altro oggetto dall'inventario
{
cPippo.say("Non è l'oggetto giusto!");
}
}
In alternativa, se vogliamo semplicemente far interagire pippo con la porta e, solo se ha la chiave, questi la apre (senza usare l'oggetto dell'inventario) si fa così:
function oPorta_Interact()
{
if (cPippo.HasInventory(iChiave)) // se la chiave è presente nell'inventario
{
cPippo.Walk(200, 200, eBlock); //pippo si avvicina alla porta, ad esempio in x=200 y=200
cPippo.FaceLocation(800, cDonald.y, eBlock); //pippo si gira verso destra
cPippo.LockView(20); //pippo cambia vista, assume ad es. la vista N.20 che è quella contente l'animazione di pippo che apre la porta con la chiave.
cPippo.Animate(1, 5, eOnce, eBlock, eForwards); //animazione di pippo che gira la chiave (è solo un esempio)
//qui ci sarebbe da far sentire il suono della serratura
porta_aperta = 1; //variabile porta aperta è posta pari ad uno
cPippo.UnlockView();
cPippo.ChangeView(1); // pippo riassume la sua "forma normale" ad es. la vista N.1
}
else // non ha la chiave
{
cPippo.say("La porta è chiusa a chiave, ho bisogno della chiave!");
}
}