resettare le room persistenti

Hai una curiosità o un problema con Game Maker? Domanda e ti sarà risposto!
Rispondi
Tommy_sp
Membro
Messaggi: 56
Iscritto il: 28/08/2006, 19:25
Uso: GM:Studio 2
Località: spésa town
Contatta:

resettare le room persistenti

Messaggio da Tommy_sp »

ciao
volevo chiedervi come si fa a resettare i parametri iniziali di una room, cioè:
io ho un gruppo di room persistenti, dunque quando vado da una all'altra all'interno di esse rimangono come le ho lasciate (es: se nella room1 c'è un'arma, la prendo, vado nella room2, poi torno nella room1 l'arma non c'è più).
io voglio creare però una room nella quale (quando ci vado) vengano resettati i parametri delle altre room (es, quando tornerò nella room1 l'arma sarà stata creata di nuovo.)
come si può fare?

Mauro
Membro d'elite
Messaggi: 1421
Iscritto il: 07/09/2004, 11:37
Uso: GM:Studio 2
Località: Melfi
Contatta:

Messaggio da Mauro »

Esempio crei un controller persistente e nell' evento create metti
if room=room1
{
instance_create(x,y,arma)
}
(NON testato) :(

:D

Ruj89
Admin
Messaggi: 605
Iscritto il: 18/05/2003, 16:25
Contatta:

Messaggio da Ruj89 »

All'inizio della prima room imposti un oggetto persistente con un array che ha come indici le room da resettare. Quindi nel create event di questo oggetto metti

Codice: Seleziona tutto

reset[nome_room0] = 1
reset[nome_room1] = 1
reset[nome_room2] = 1
ecc...
Quando entri nella room che deve azzerare imposti l'array con tutti i valori a 1. Questo codice o va messo nel room start event dell'oggetto persistente o, senza if e aggiungendo prima di "reset" il nome dell'oggetto seguito dal ".", nel creation code della room che azzera.

Codice: Seleziona tutto

if room = roomazzerante
{
 reset[nome_room0] = 1
 reset[nome_room1] = 1
 reset[nome_room2] = 1
 ecc...
}
Infine nel creation code delle room resettabili, togliendo il primo if e mettendo prima di "reset" il nome dell'oggetto, o nel room start event dell'oggetto persistente metti:

Codice: Seleziona tutto

if room = nome_room0 || room = nome_room1 || room = nome_room2 ecc...
{
 if reset[room] = 1
 {
  reset[room] = 0
  room_restart()
 }
} 
Così dovrebbe andare!

Tommy_sp
Membro
Messaggi: 56
Iscritto il: 28/08/2006, 19:25
Uso: GM:Studio 2
Località: spésa town
Contatta:

Messaggio da Tommy_sp »

hm, nonostante di GML non me ne intendo per niente :roll: mi sa di aver capito!!
adesso smanetto un po', se ci sono problemi vi faccio sapere
grazie mille, ciao!

Tommy_sp
Membro
Messaggi: 56
Iscritto il: 28/08/2006, 19:25
Uso: GM:Studio 2
Località: spésa town
Contatta:

Messaggio da Tommy_sp »

come sospettevo, le mie scarse conoscenze del GML mi complicano la vita.. :(
qui sotto scriverò una breve lista di ciò che ho scritto per capire bene dov'è l'errore
dunque:
1) io creo un oggetto persistente chiamato "resettalo" nella prima stanza, e nell'evento "room start" metto il codice :

Codice: Seleziona tutto

if room=room8
{
reset[room0]=1
reset[room10]=1
reset[room3]=1
reset[room9]=1
}
2) nel "creation code" delle varie room da resettare scrivo:

Codice: Seleziona tutto

{
if resettalo.reset[room] =1
{
resettalo.reset[room]=0
room_restart()
}
}
il problema è che quando torno alla room8 (che è la room "resettante") e poi torno ad una room che dovrebbe essere resettata, essa è tale e quale a prima: non succede niente!! :o

io ho la sensazione di sbagliare non scrivendo qualcosa (le ho copiate ed incollate pari pari), ad esempio nelle linee di codice del "creation code" delle room devo scrivere i nomi delle room da qualche parte?? poi non ho capito tra le parentesi del comando room_restart() cosa ci va messo??
scusate, ma mi affaccio al GML solo ora!!! :roll:

Tommy_sp
Membro
Messaggi: 56
Iscritto il: 28/08/2006, 19:25
Uso: GM:Studio 2
Località: spésa town
Contatta:

Messaggio da Tommy_sp »

inoltre c'è un altro problema molto importante (e forse è proprio questo che crea il problema che vi ho descritto sopra)
settando le room persistenti le variabili globali perdono il loro valore: se in un room persistente una variabile globale ha valore 100, enella room successiva viene settata a 200, s si torna nella room precedente il valore viene settato nuovamente a 100 anche se non si vorrebbe...... c'è un modo per risolverlo?

Agamemnon
Membro super
Messaggi: 948
Iscritto il: 16/04/2006, 15:10
Uso: GM:Studio 2
Località: Aprilia (LT)
Contatta:

Messaggio da Agamemnon »

Guarda ho capito il tuo problema, ma non so se posso aiutarti....
Vediamo...

Prova a fare un oggetto di controllo che sta nella stanza e se ha una variabile a=1 un determinato oggetto viene aggiunto alla stanza, poi prendendo l'oggetto la variabile a diventa uguale a 0...e sempre nell'oggetto di controllo all'evento "room end" rimetti a=1.

Ruj89
Admin
Messaggi: 605
Iscritto il: 18/05/2003, 16:25
Contatta:

Messaggio da Ruj89 »

Tommy_sp ha scritto:come sospettevo, le mie scarse conoscenze del GML mi complicano la vita.. :(
qui sotto scriverò una breve lista di ciò che ho scritto per capire bene dov'è l'errore
dunque:
1) io creo un oggetto persistente chiamato "resettalo" nella prima stanza, e nell'evento "room start" metto il codice :

Codice: Seleziona tutto

if room=room8
{
reset[room0]=1
reset[room10]=1
reset[room3]=1
reset[room9]=1
}
2) nel "creation code" delle varie room da resettare scrivo:

Codice: Seleziona tutto

{
if resettalo.reset[room] =1
{
resettalo.reset[room]=0
room_restart()
}
}
il problema è che quando torno alla room8 (che è la room "resettante") e poi torno ad una room che dovrebbe essere resettata, essa è tale e quale a prima: non succede niente!! :o

io ho la sensazione di sbagliare non scrivendo qualcosa (le ho copiate ed incollate pari pari), ad esempio nelle linee di codice del "creation code" delle room devo scrivere i nomi delle room da qualche parte?? poi non ho capito tra le parentesi del comando room_restart() cosa ci va messo??
scusate, ma mi affaccio al GML solo ora!!! :roll:
Da quello che vedo hai fatto tutto correttamente :(
room_restart non accetta parametri: riavvia la room in corso.
La soluzione al tuo problema dovrebbe essere usare variabili nella maniera corretta insieme al room_restart... se fosse possibile riavviare una room persistente da un'altra room sarebbe tutto più semplice!

TellyAbba
Membro super
Messaggi: 801
Iscritto il: 12/02/2004, 10:05
Uso: GM:Studio 2
Località: Roma
Contatta:

Messaggio da TellyAbba »

Una soluzione potrebbe essere quella di (tramite un oggetto dedicato, persistente) oscurare lo schermo temporaneamente (oppure mascherarlo con un foreground), passare alle room con gli oggetti da resettare, resettare gli oggetti, ripassare alla room corrente, togliere l'oscuramento o il mascheramento. Non credo che occorrano più di alcuni secondi per l'intera operazione.
TellyAbba

tellyabba at yahoo.it

Tommy_sp
Membro
Messaggi: 56
Iscritto il: 28/08/2006, 19:25
Uso: GM:Studio 2
Località: spésa town
Contatta:

Messaggio da Tommy_sp »

ho provato in 100 modi, e anche quello che tu mi dici tellyabba è un'idea giusta, purtroppo non mi può aiutare, perchè il mio problema (e l'ho messo a fuoco nitidamente solo oggi) non consiste nel settare le variabili, bensì nel fatto che le room persistenti "scavalcano" le variabili globali.
mi piego meglio:
le variabili globali le riesco a settare a mio piacimento in ogni room che voglio (persistente o meno), il problema è che la caratteristica fondamentale delle room persistenti è che quando ci rientri esse sono ESATTAMENTE come le hai lasciate, variabili (globali e non) comprese!!

vi faccio un esempio pratico di uno dei vari problemi che questa incongruenza causa: io ho un oggetto "uomo" e gli ordino che quando esso collide con un altro oggetto posto all'estremità della stanza (che si chiama "fineroom") setti una variabile globale global.posizione=y e vada nella room sucessiva. "uomo" all'evento "room start" ha il comando di saltare alla posizione y=global.posizione.
questo fa si che al passare da una room all'altra "uomo" sia allo stesso livello della room precedente.
questo sistema funziona benissimo con le room NON persistenti, mentre con le room persistenti no: se nella room1 "uomo" collide con l'oggetto "fineroom" in y=2000, poi va in room2, se torno indietro collidendo con "finelivello" in y=1000, quando torno in room1 y è = a 2000 , come torno nella room2 y è = a 1000, cioè esattamente le 2 posizioni uguali di quando ero uscito dalla room la volta precedente!!!!

spero di non avervi confuso le idee col mio esempio pratico!! :roll:

TellyAbba
Membro super
Messaggi: 801
Iscritto il: 12/02/2004, 10:05
Uso: GM:Studio 2
Località: Roma
Contatta:

Messaggio da TellyAbba »

A mio avviso le soluzioni posso esserci; dovresti dirci qual'è il problema specifico. Nell'esempio che hai fatto, relativo alla posizione, una soluzione può essere quella di assegnare immediatamente al personaggio che transita da una room all'altra la nuova posizione, rendendolo però previamente invisibile.
Esempio pratico:
il personaggio esce dalla room1 ad x = 2000 e y=1000 e nella room2 deve trovarsi ad x= 10 e y= 2000 (e se rientra deve avere le posizioni precedenti)

crei due oggetti, che chiamiamo objNext1 e objPrevious1

objNext1 lo posizioni nella room1, nel punto in cui il personaggio deve uscire;
objPrevious1 lo posizioni nella room2, nel punto in cui il personaggio deve rientrare nella room1, vicino alla posizione in cui è entrato, cioè vicino a x=10 e y=2000 (attento a non piazzare questo oggetto esattamente nella posizione di destinazione dalla room1 altrimenti crei un loop fra le due room)

in objNext1, nel collision event con il personaggio, inserisci questo pezzo di codice:
other.visible=0; other.x=10; other.y=2000; room_goto(room2)
in objPrevious1, nel collision event con il personaggio, inserisci questo pezzo di codice: other.visible=0; other.x=2000; other.y=1000; room_goto(room1)
//abbiamo creato due oggetti che a contatto con il personaggio lo rendono invisibile, gli fanno cambiare posizione e quindi passano alla nuova room. Volendo, oltre al room_goto, puoi aggiungere un effetto di transizione.

nello step event del personaggio inserisci: if visible=0 alarm[0]=1
e in alarm0 inserisci: visible=1
//facciamo in modo che il personaggio torni visibile dopo alcuni istanti

In questo modo il personaggio passa da una room all'altra rispettando le posizioni definite dagli oggetti Next e Previous (chiaro che ne dovrai fare tanti quante sono le room di passaggio) e l'unico inconveniente che puoi avere è che nel passaggio immediato di posizione, il personaggio venga a collidere per un istante (cioè prima che cambi room) con un altro oggetto che produce effetti (ad esempio, su una fiamma che toglie punti vita). Ma anche questo è facilmente risolvibile inserendo un controllo nell'oggetto in collisione, che applica l'effetto solo se il personaggio è visibile.
TellyAbba

tellyabba at yahoo.it

Tommy_sp
Membro
Messaggi: 56
Iscritto il: 28/08/2006, 19:25
Uso: GM:Studio 2
Località: spésa town
Contatta:

Messaggio da Tommy_sp »

ti ringrazio tellyabba ma purtroppo questo metodo l'avevo già usato:
a differenza di come dicevi te ho creato un solo oggetto di collisione per il passaggio di room in room inserendo come events "keyboard left" e "keyboard right" e ad entrambi questi eventi ho ordinato che solo se c'era una collisione col mio oggetto omino pasavano da room a room ; con "if room=room2" o "if room=room34" ecc. decido in che room andare senza creare due oggetti per room!!
ma a parte questo....
nell'esempio che ti ho fatto della posizione non era poprio come tu l'hai riportato, forse mi ero spiegato male....
se io collido col mio oggetto "omino" la barriera"finelivello" posto all'estremità di room1 nelle coordinate x=2000 e y=850, ho bisogno che quando passo a room2 "omino" salti nelle coordinate X=20 e y=850;
se faccio un po di giri all'interno di room2, e devo passare nuovamente a room1, se collido col mio oggetto "finelivello" in x=20 e Y=60, ho bisogno che stavolta quando viene lanciata room1 "omino salti a x=2000 e Y=60....
questo l'avevo risolto con le famose variabili globali che ti dissi la scorsa volta.
questo non vale con le room persistenti:
siccome al contatto con gli oggetti in questione queste variabili globali vengono settate a un valore, quando la room viene rilanciata, siccome è persistente (e dunque lascia inalterati i valori di posizioni, variabili, insomma tutto) le vaiabili globale di ogni room riassumono il valore precedente:
s collido "fineroom" in y=1000, quando passo a room2 , faccio i miei giri, se torno a collidere "fineroom" in y=300 per tornare a room1, quando room1 viene rilanciata omino salta a y=1000 invece che a y=300 (questo perchè la room siccome persistente, aveva memorizzto il valore della variabil globale che mi segna y nel momento in cui essa era stata settata la precedente volta che ero uscito da room1)

dato che questi problemi mi hanno stancato, io aggioro il problema e setto le room non persistenti.
in questo modo la tecnica delle room globali funziona, per la posizione.

per il problema delle varie armi che prendo e poi non voglio che compaiano di nuovo ho preso pezzi dei vari consigli che mi avete dato e ne è uscito un oggetto persistente che ha una serie di variabili per ogni arma, e quest'ultima, se presa , setta un nuovo valore all'oggetto persistente che vi dicevo.
infine ogni arma ha in step il comando che se la variabile di presa (riferita a quell'arma) ha il valore che gli setto quando la prendo, si autodistrugge.

mi rendo conto di aver fatto un sacco di rigiri di parole e di esmpi, ad ogni modo vi ringrazio tutti perchè, in un modo o nell'altro ho risolto il problema!!!!! :lol:

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 150 ospiti