Benvenuto Visitatore(Log In|Registrati)

 
Reply to this topicStart new topic
> Puzzle-Combinazioni e Schermate
Gabarts
messaggio4 Jun 2014, 10:25
Messaggio #1





Gruppo: Gamer
Messaggi: 29
Iscritto il: 28 May 14
Utente Nr.: 20.437
BGE Indiana Jones and The Last Crusade (Lucasfilm Games-1989)

Playing Broken Sword 5 - La maledizione del serpente
SO Windows7




Non so se sono il primo a postare in questa sezione... comunque spero non sia troppo banale come aiuto blush.gif Sul forum ufficiale Khris si è sempre rivelato di grande aiuto ma spesso spiegare problemi di programmazione in inglese può risultare un po' intricato...

Non sono esperto di scripting avanzato su AGS, probabilmente non esperto neanche di scripting basico, eheh blush.gif Sicuramente qualcuno di voi mi saprà dare consigli diretti per questo tipo di puzzle:

-Il primo è il puzzle classico della combinazione (l'organo di teschi in Last Crusade)

Io faccio 4 o 5 hotspot o oggetti (con hotspot) a cui posso assegnare dei suoni. Poi creo una variabile INT e metto il codice quando carico la Room. Come imposto uno script di questo genere?

-Questo forse è più semplice, ma ahimè sono mesi che non uso AGS e devo ritrovare un po' di dimestichezza. Come faccio a gestire le proprietà visible o transparency di un hotspot, personaggio o oggetti tra le varie schermate. Mi spiego meglio: ho Room_1, Room_2, Room_3 e sono collegate tra loro da porte o simili.

Io sono su Room_3 e assegno al mio personaggio un azione. Alla fine dell'azione voglio che un dato hotspot o oggetto che si trova però in Room_2 diventi visible= true o transparency = 100 etc etc, non ricordo se devo usare _root o altro.
 
AprilSkies
messaggio4 Jun 2014, 11:04
Messaggio #2



Gruppo icone

Gruppo: Oldgame Editor
Messaggi: 516
Iscritto il: 16 May 12
Utente Nr.: 19.376
BGE The secret of Monkey Island
Playing The secret of Monkey Island
SO WinVista




Ciao Gab.

Ti rispondo al volo sulla seconda questione:
due soluzioni:
1) C'è un modulo chiamato "OtherRoom" che serve per fare esattamente quello (cioè manipolare oggetti in altre stanze).
(... ma io personalmente meno moduli esterni uso meglio sto)
2) come faccio io: creo una variabile nel global script a la importo nelle rooms in questione. Quando faccio l'azione nella room1 do un valore alla variabile. poi quando entro nella room2, in Room_Load imposto la visibilità dell'oggetto in base alla variabile.

Sulla prima domanda, spiegami bene: premendo i pulsanti in un certo ordine equivale ad una "combinazione", giusto? se becco la combinazione succede qualcosa se non la becco succede un'altra cosa, giusto?
Cmq se ho ben capito, l'ideale è creare un Array in cui registrare la combinazione e un array in cui registrare i valori immessi premendo i pulsanti o quello che siano e confrontare gli array.
Se vuoi possiamo scriverlo insieme passo passo

Messaggio modificato da AprilSkies il 4 Jun 2014, 11:09
 
Gabarts
messaggio4 Jun 2014, 11:41
Messaggio #3





Gruppo: Gamer
Messaggi: 29
Iscritto il: 28 May 14
Utente Nr.: 20.437
BGE Indiana Jones and The Last Crusade (Lucasfilm Games-1989)

Playing Broken Sword 5 - La maledizione del serpente
SO Windows7




CITAZIONE (AprilSkies @ 4 Jun 2014, 12:04) *
2) come faccio io: creo una variabile nel global script a la importo nelle rooms in questione. Quando faccio l'azione nella room1 do un valore alla variabile. poi quando entro nella room2, in Room_Load imposto la visibilità dell'oggetto in base alla variabile.

Sulla prima domanda, spiegami bene: premendo i pulsanti in un certo ordine equivale ad una "combinazione", giusto? se becco la combinazione succede qualcosa se non la becco succede un'altra cosa, giusto?
Cmq se ho ben capito, l'ideale è creare un Array in cui registrare la combinazione e un array in cui registrare i valori immessi premendo i pulsanti o quello che siano e confrontare gli array.
Se vuoi possiamo scriverlo insieme passo passo


Guarda, non mi sono mai soffermato a leggere le funzioni del global script e delle variabili, meno numeri uso meglio sto blush.gif Nel senso che sono andato a logica e mi sono limitato ad usare i parametri/proprietà base degli oggetti o delle sprites. Se vedi il mio script è un labirinto blush.gif Probabilmente per realizzare le animazioni che ho fatto bastava una riga di variabili... comunque è il risultato che conta blush.gif

Forse mi sono ricordato come si fa, ho qualcosa in un dialogo...

Se mi fai un esempio di script basilare poi ti dico se è più o meno quello che ho usato finora. Forse devo usare qualcosa tipo questo ma non riesco a decifrarlo bene blush.gif

Let's say you need to click four buttons in the correct order to open the door.
The buttons are:
A B C D

And the right combination is
C D A B

What you need to do now is declare an int, that we call "code."
Before any buttons are pushed, code is 0.
(at the top of room script)
int code;

Then you just start adding conditions.

For button C:
if (code == 0) code ++; //increase "code" by one
else code = 0; // otherwise reset "code"

For button D:
if (code == 1) code ++;
else code = 0;

For button A:
if (code == 2) code ++;
else code = 0;

For button B:
if (code == 3) code ++;
else code = 0;

So, whenever a button is pushed when it's not supposed to, the mechanism will be reset. If you keep pushing the buttons in the right order, the integer will increase.

You can use the repeatedly_execute to decide what will happen as soon as "code" is 4.

(Preso dal forum principale, un mio post)
 
AprilSkies
messaggio4 Jun 2014, 17:27
Messaggio #4



Gruppo icone

Gruppo: Oldgame Editor
Messaggi: 516
Iscritto il: 16 May 12
Utente Nr.: 19.376
BGE The secret of Monkey Island
Playing The secret of Monkey Island
SO WinVista




Sì così funziona.
Crea la variabile "code" e resettala (cioè ponila = 0) ogni volta che ricominci il puzzle e funziona.

Ovvio che quando Code diventa4 devi far partire lo script relativo al puzzle risolto.
 
Gabarts
messaggio6 Jun 2014, 17:28
Messaggio #5





Gruppo: Gamer
Messaggi: 29
Iscritto il: 28 May 14
Utente Nr.: 20.437
BGE Indiana Jones and The Last Crusade (Lucasfilm Games-1989)

Playing Broken Sword 5 - La maledizione del serpente
SO Windows7




CITAZIONE (AprilSkies @ 4 Jun 2014, 18:27) *
Sì così funziona.
Crea la variabile "code" e resettala (cioè ponila = 0) ogni volta che ricominci il puzzle e funziona.

Ovvio che quando Code diventa4 devi far partire lo script relativo al puzzle risolto.


Per il momento non devo farlo.

Però bisogna aggiungere codice nel Global Script oppure direttamente nello script della Room?

Casomai vi posto un'immagine o del codice così vedete + o - come orientarsi relativamente al mio gioco. Thanks
 
AprilSkies
messaggio7 Jun 2014, 07:44
Messaggio #6



Gruppo icone

Gruppo: Oldgame Editor
Messaggi: 516
Iscritto il: 16 May 12
Utente Nr.: 19.376
BGE The secret of Monkey Island
Playing The secret of Monkey Island
SO WinVista




Nella Room.

Crei gli hotspots (o gli oggetti, non so come intenti farlo) nella room.
Una volta creati crea (da menù a destra) la function relativa al click sull'hotspot.
per esempio

function hotspotA_AnyClick()

e scrivi nel corpo della funzione

if (code == 2) code ++;
else code = 0;
(o quello che sia)

poi fai lo stesso pr tutti gli altri hotspot (con il relativo script).

A questo punto, sempre nella room, crea una funzione a parte
che so chiamala function PUZZLE_RISOLTO()
e nel corpo metti ciò che deve avvenire (ad esempio un cambio di Room).
e ricordati di azzerate la variabile code dentro PUZZLE_RISOLTO.

a questo punto crea, nel menù della room, la funzione repeatedly_execute
(Importante: va creata DOPO la funzione PUZZLE_RISOLTO() )

e lì dentro scrivi semplicemente: if (code == 4) PUZZLE_RISOLTO();

se vuoi, quando stai codando, incolla qui lo script e te lo controllo.


P.S.
Qui ne parlano http://www.adventuregamestudio.co.uk/forum...p?topic=50553.0
e, piuttosto che usare questo metodo, che è un po' laborioso, c'è monkey424 che suggerisce il metodo degli Array (che ti dicevo io),
ma soprattutto Monkey_05_06 suggerisce un metodo geniale cui non avevo mai pensato! .. usando "AppendChar".
Dagli un'occhiata.



Messaggio modificato da AprilSkies il 7 Jun 2014, 07:48
 
Gabarts
messaggio8 Jun 2014, 09:53
Messaggio #7





Gruppo: Gamer
Messaggi: 29
Iscritto il: 28 May 14
Utente Nr.: 20.437
BGE Indiana Jones and The Last Crusade (Lucasfilm Games-1989)

Playing Broken Sword 5 - La maledizione del serpente
SO Windows7




CITAZIONE (AprilSkies @ 7 Jun 2014, 08:44) *
Qui ne parlano http://www.adventuregamestudio.co.uk/forum...p?topic=50553.0
e, piuttosto che usare questo metodo, che è un po' laborioso, c'è monkey424 che suggerisce il metodo degli Array (che ti dicevo io),
ma soprattutto Monkey_05_06 suggerisce un metodo geniale cui non avevo mai pensato! .. usando "AppendChar".
Dagli un'occhiata.


Grazie mille, fra poco mi servirà, appena lo provo ti faccio sapere se funziona o se c'è qualcosa da correggere. ciao.gif
 
Gabarts
messaggio8 Jun 2014, 23:54
Messaggio #8





Gruppo: Gamer
Messaggi: 29
Iscritto il: 28 May 14
Utente Nr.: 20.437
BGE Indiana Jones and The Last Crusade (Lucasfilm Games-1989)

Playing Broken Sword 5 - La maledizione del serpente
SO Windows7




Guarda, sto facendo delle prove per testare su un altro pc, ho scritto questo codice che di sicuro non va bene n9.gif

CODICE
// room script file

int code;

function room_Load()
{
RemoveWalkableArea(2);
}



function room_FirstLoad()
{
player.Move(120, 100, eBlock, eWalkableAreas);
player.Say("Eccomi nella famosa stanza dell'organo di teschi!");
Wait(60);
player.Say("Vediamo se funziona...");
}

function hMi_AnyClick() {
  
  if (UsedAction(eGA_Pull)) {
    
    aBip_1.Play();
    
    if (code == 0) code ++;
    else code = 0;
}
else Unhandled();
}

function hDo_AnyClick() {
  
  if (UsedAction(eGA_Pull)) {
    
    aBip_2.Play();
    
    if (code == 1) code ++;
    else code = 0;
}
else Unhandled();
}


function hSol_AnyClick() {
  
  if (UsedAction(eGA_Pull)) {
    
    aBip_3.Play();
    
    if (code == 2) code ++;
    else code = 0;
}
else Unhandled();
}


function hRe_AnyClick() {
  
  if (UsedAction(eGA_Pull)) {
    
    aBip_4.Play();
    
    if (code == 3) code ++;
    else code = 0;
}
else Unhandled();
}

function hLa_AnyClick() {
  
  if (UsedAction(eGA_Pull)) {
    
    aBip_5.Play();
    
    if (code == 4) code ++;
    else code = 0;
}
else Unhandled();
}


function hFa_AnyClick() {
  
  if (UsedAction(eGA_Pull)) {
    
    aBip_1.Play();
    
    if (code == 5) code ++;
    else code = 0;
}
else Unhandled();
}

function Puzzle_risolto() {
  
  code = 0;
  
  aOpensound.Play();
  oPorta1.SetView(17, 0);
  oPorta1.Animate(0, 8, eOnce, eBlock, eForwards);
}



function room_RepExec()
{
if (code == 6) Puzzle_risolto();
}
 
AprilSkies
messaggio10 Jun 2014, 09:33
Messaggio #9



Gruppo icone

Gruppo: Oldgame Editor
Messaggi: 516
Iscritto il: 16 May 12
Utente Nr.: 19.376
BGE The secret of Monkey Island
Playing The secret of Monkey Island
SO WinVista




secondo me funziona.
L'unica cosa è che, dato che il Mi è il primo, per star sicuro che lo prenda sempre metti un brutale
code = 1;
Senza if ecc.
 
Gabarts
messaggio10 Jun 2014, 13:53
Messaggio #10





Gruppo: Gamer
Messaggi: 29
Iscritto il: 28 May 14
Utente Nr.: 20.437
BGE Indiana Jones and The Last Crusade (Lucasfilm Games-1989)

Playing Broken Sword 5 - La maledizione del serpente
SO Windows7




CITAZIONE (AprilSkies @ 10 Jun 2014, 10:33) *
secondo me funziona.
L'unica cosa è che, dato che il Mi è il primo, per star sicuro che lo prenda sempre metti un brutale
code = 1;
Senza if ecc.


Ora mi sono incasinato con la funzione Rep_Ex, sto cercando di risolvere alcuni problemi, comunque ci provo, grazie blush.gif

Il problema di questo codice è che il personaggio (a parte Pull-Push che ho corretto...) va al tasto, lo preme e invece di sentire il suono mi dici il classico "Non sembra funzionare" [ovvero else Unhandled();] per questo m'è venuto qualche dubbio...
 
Procione
messaggio8 Oct 2014, 23:17
Messaggio #11





Gruppo: Gamer
Messaggi: 18
Iscritto il: 26 February 14
Utente Nr.: 20.320
SO Windows7




Azzarola mi dispiace aver visto solo adesso questa discussione. Lo script per gestire l'enigma può essere scritto in vari modi in base anche a cosa deve accadere nel gioco dopo la risoluzione di esso.
Per chi fosse ancora interessato ecco come ho risolto prendendo come base il post di Gabarts:

CODICE
// room script file
int code; //Variabile che tiene conto del codice;
bool enigmaRisolto = false; //Variabile che tiene conto se l'enigma è stato risolto o meno;

//Bottone A
function hA_Interact()
{
  if(enigmaRisolto == false) //Se l'enigma non è stato risolto possiamo continuare a cercare di risolverlo...
  {
    cEgo.Walk(140, 220);
    if(code == 2) code++;
    else code = 0;    
  }
  else //...altrimenti se è già stato risolto fa dire la frase ad Ego e non ci fa più accedere all'enigma
  {
    cEgo.Say("L'ho gia' risolto!");  
  }
}

//Bottone B
function hB_Interact()
{
  if(enigmaRisolto == false)
  {
    cEgo.Walk(240, 220);
    if(code == 3) code++;
    else code = 0;
  }
  else
  {
    cEgo.Say("L'ho gia' risolto!");  
  }
}

//Bottone C
function hC_Interact()
{
  if(enigmaRisolto == false)
  {
    cEgo.Walk(340, 220);
    if(code == 0) code++;
    else code = 0;  
  }
  else
  {
    cEgo.Say("L'ho gia' risolto!");
  }
}

//Bottone D
function hD_Interact()
{
  if(enigmaRisolto == false)
  {
    cEgo.Walk(440, 220);
    if(code == 1) code++;
    else code = 0;  
  }
  else
  {
    cEgo.Say("L'ho gia' risolto!");    
  }    
}

function room_RepExec()
{
  if(code == 4){ //Se code è uguale a 4...
    enigmaRisolto = true; //...enigmaRisolto diventa true
    Display("Enigma risolto.");
    
    //code rtorna a 0. Se rimarrebbe 4, dato che questo codice è posto in Repeatedly Execute, le due righe di cui
    //sopra verrebbero continuamente eseguite, il che farebbe continuamente apparire la scritta "Enigma risolto."
    //bloccando il gioco.
    //Settando code a 0, l'if posto in room_RepExec() non verrà più soddisfatto e AGS non ri-eseguirà  enigmaRisolto = true; e  Display("Enigma risolto.");
    //permettendoci così di proseguire il gioco.
    code = 0;
  }
}


Messaggio modificato da Procione il 9 Oct 2014, 22:13
 
Gabarts
messaggio27 Nov 2014, 22:48
Messaggio #12





Gruppo: Gamer
Messaggi: 29
Iscritto il: 28 May 14
Utente Nr.: 20.437
BGE Indiana Jones and The Last Crusade (Lucasfilm Games-1989)

Playing Broken Sword 5 - La maledizione del serpente
SO Windows7




CITAZIONE (Procione @ 9 Oct 2014, 00:17) *
Azzarola mi dispiace aver visto solo adesso questa discussione. Lo script per gestire l'enigma può essere scritto in vari modi in base anche a cosa deve accadere nel gioco dopo la risoluzione di esso.
Per chi fosse ancora interessato ecco come ho risolto prendendo come base il post di Gabarts:

CODICE
// room script file
int code; //Variabile che tiene conto del codice;
bool enigmaRisolto = false; //Variabile che tiene conto se l'enigma è stato risolto o meno;

//Bottone A
function hA_Interact()
{
  if(enigmaRisolto == false) //Se l'enigma non è stato risolto possiamo continuare a cercare di risolverlo...
  {
    cEgo.Walk(140, 220);
    if(code == 2) code++;
    else code = 0;    
  }
  else //...altrimenti se è già stato risolto fa dire la frase ad Ego e non ci fa più accedere all'enigma
  {
    cEgo.Say("L'ho gia' risolto!");  
  }
}

//Bottone B
function hB_Interact()
{
  if(enigmaRisolto == false)
  {
    cEgo.Walk(240, 220);
    if(code == 3) code++;
    else code = 0;
  }
  else
  {
    cEgo.Say("L'ho gia' risolto!");  
  }
}

//Bottone C
function hC_Interact()
{
  if(enigmaRisolto == false)
  {
    cEgo.Walk(340, 220);
    if(code == 0) code++;
    else code = 0;  
  }
  else
  {
    cEgo.Say("L'ho gia' risolto!");
  }
}

//Bottone D
function hD_Interact()
{
  if(enigmaRisolto == false)
  {
    cEgo.Walk(440, 220);
    if(code == 1) code++;
    else code = 0;  
  }
  else
  {
    cEgo.Say("L'ho gia' risolto!");    
  }    
}

function room_RepExec()
{
  if(code == 4){ //Se code è uguale a 4...
    enigmaRisolto = true; //...enigmaRisolto diventa true
    Display("Enigma risolto.");
    
    //code rtorna a 0. Se rimarrebbe 4, dato che questo codice è posto in Repeatedly Execute, le due righe di cui
    //sopra verrebbero continuamente eseguite, il che farebbe continuamente apparire la scritta "Enigma risolto."
    //bloccando il gioco.
    //Settando code a 0, l'if posto in room_RepExec() non verrà più soddisfatto e AGS non ri-eseguirà  enigmaRisolto = true; e  Display("Enigma risolto.");
    //permettendoci così di proseguire il gioco.
    code = 0;
  }
}


Grazie! Scusa se ho letto adesso la tua risposta, navigando tra un forum e l'altro, con cento cose da fare... mi sei stato di grande aiuto. Anche April mi sta aiutando in questo momento... blush.gif Si possono davvero fare tantissime cose se si è abili con la programmazione! Purtroppo io sono negato in questo senso (perlomeno ci arrivo ma per vie traverse, lunghe ed estremamente tortuose, eheh).

Messaggio modificato da Gabarts il 27 Nov 2014, 22:50
 
Gabarts
messaggio27 Nov 2014, 23:10
Messaggio #13





Gruppo: Gamer
Messaggi: 29
Iscritto il: 28 May 14
Utente Nr.: 20.437
BGE Indiana Jones and The Last Crusade (Lucasfilm Games-1989)

Playing Broken Sword 5 - La maledizione del serpente
SO Windows7




Un'altra piccola cosa ma fondamentale riguardo al Puzzle
------------------------------------------------------------------

Riprendendo l'enigma dell'organo in Indy:

c'è uno script dell'animazione della porta che non si apre "solo" dopo 6 note premute, ovvero la sequenza calcolata deve essere 6 tentativi. Come si dichiara questa variabile? Ok code = 0; ma per eseguire l'animazione dell'enigma non risolto (ovvero la porta che non si apre del tutto) solo dopo 6 note?

Spero di essere stato chiaro blush.gif old2.gif
 
Procione
messaggio10 Dec 2014, 20:57
Messaggio #14





Gruppo: Gamer
Messaggi: 18
Iscritto il: 26 February 14
Utente Nr.: 20.320
SO Windows7




CITAZIONE (Gabarts @ 28 Nov 2014, 00:10) *
Un'altra piccola cosa ma fondamentale riguardo al Puzzle
------------------------------------------------------------------

Riprendendo l'enigma dell'organo in Indy:

c'è uno script dell'animazione della porta che non si apre "solo" dopo 6 note premute, ovvero la sequenza calcolata deve essere 6 tentativi. Come si dichiara questa variabile? Ok code = 0; ma per eseguire l'animazione dell'enigma non risolto (ovvero la porta che non si apre del tutto) solo dopo 6 note?

Spero di essere stato chiaro blush.gif old2.gif


Premetto che non conosco l'enigma dell'organo azz.gif Però da come ho capito vuoi che l'animazione dell'enigma non risolto venga eseguita dopo 6 tentativi.
Potresti creare una variabile globale o anche solo visibile dall'intera pagina degli script della stanza nella quale si svolge l'enigma, dichiarandola prima di qualsiasi function nella pagina.

Tipo:
CODICE
int organoTentativi = 0;


Poi ne crei un'altra (sta volta booleana) che tiene conto del fatto che l'enigma sia stato risolto o meno.
CODICE
bool organoRisolto = false;


Ogni volta che l'utente preme il tasto la variabile viene incrementata di 1 e da Repeatedly Execute controlli se è arrivata a 6. Se sì, controlli se l'enigma è stato risolto o meno verificando il valore di organoRisolto.

Se organoRisolto è false esegui l'animazione della porta che non si apre del tutto.

CODICE
oPorta.SetView(4);
oPorta.Animate(0, 2, eOnce, eBlock, eForwards);


Dove oPorta è il nome dell'oggetto porta (quella che deve essere aperta), in SetView 4 è il numero della View. In oPorta.Anmate, 0 è il numero del Loop che vuoi far partire per l'animazione, 2 è il ritardo che intercorre tra un frame e l'altro , eOnce serve ad eseguire l'animazione una sola volta, eBlock a fermare il gioco mentre l'animazione viene eseguita e eForwards per eseguire l'animazione dal primo frame del Loop fino all'ultimo.

Ovviamente i tuoi numeri e il nome dell'oggetto possono essere diversi da quelli scritti nell'esempio.

Ora non posso andare nel dettaglio perchè non conosco bene l'enigma, ma spero di esserti stato di aiuto.

Messaggio modificato da Procione il 10 Dec 2014, 21:07
 

Reply to this topicStart new topic
1 utenti stanno leggendo questa discussione (1 visitatori e 0 utenti anonimi)
0 utenti:

 

Modalità di visualizzazione: Normale · Passa a: Lineare · Passa a: Outline


Versione Lo-Fi Oggi è il: 16th July 2019 - 23:31