Benvenuto Visitatore(Log In|Registrati)
![]() ![]() |
4 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
Non sono esperto di scripting avanzato su AGS, probabilmente non esperto neanche di scripting basico, eheh -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. |
|
|
|
4 Jun 2014, 11:04
Messaggio
#2
|
|
|
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 |
|
|
|
4 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 |
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 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 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) |
|
|
|
4 Jun 2014, 17:27
Messaggio
#4
|
|
|
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. |
|
|
|
6 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 |
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 |
|
|
|
7 Jun 2014, 07:44
Messaggio
#6
|
|
|
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 |
|
|
|
8 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 |
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. |
|
|
|
8 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
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(); } |
|
|
|
10 Jun 2014, 09:33
Messaggio
#9
|
|
|
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. |
|
|
|
10 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 |
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 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... |
|
|
|
8 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 |
|
|
|
27 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 |
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... Messaggio modificato da Gabarts il 27 Nov 2014, 22:50 |
|
|
|
27 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 |
|
|
|
10 Dec 2014, 20:57
Messaggio
#14
|
|
Gruppo: Gamer Messaggi: 18 Iscritto il: 26 February 14 Utente Nr.: 20.320 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 Premetto che non conosco l'enigma dell'organo 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 |
|
|
|
![]() ![]() |
| Versione Lo-Fi | Oggi è il: 22nd October 2026 - 16:00 |