Distruggere oggetti dello stesso colore

Hai una curiosità o un problema con Game Maker? Domanda e ti sarà risposto!
Solid Snake
GMI Advanced
Messaggi: 2093
Iscritto il: 19/12/2010, 16:17
Specialità: Programmazione
Uso: GM:Studio 1.4 Standard
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Solid Snake »

Scusa se hai già uno script che passa il danno alle istanze collegate che cambia se passi una distruzione alle istanze collegate? Basta che aggiungi un controllo... Oppure semplicemente crei uno script simile che viene eseguito quando un istanza viene distrutta.
♥♥♥♥♥♥
Immagine
♥♥♥♥♥♥
Spoiler
Immagine

Avatar utente
Vallo92
GMI Advanced
Messaggi: 1508
Iscritto il: 15/07/2011, 20:26
Specialità: Grafico
Uso: GM:Studio 2
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Vallo92 »

Mentre stavo cercando una soluzione per aggiungere allo script anche la possibilità di passare la distruzione, mi sono accorto di un malfunzionamento (se così possiamo chiamarlo) dello script.
Mettendo di fila più blocchi dello stesso colore( es. |X|X|X|X|X|X|X|X|X|) e colpendo un blocco all'estremità della linea formata ( es. |X|X|X|X|X|X|X|X|X|) si distrugge solo il blocco colpito + il blocco che collide con esso ( es. |X|X|X|X|X|X|X|X|X|) e non tutta l'intera linea (visto che tutti i blocchi avevano hp=5, al momento che colpivo solo il primo gli hp di tutti i blocchi dovevano raggiungere lo 0 contemporaneamente).
-Questi occhiali da sole le stanno benissimo. Vuole provarli con le lenti più scure?
- Si vede che le sto guardando le tette?
- Si
- Allora si

Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Homunculus »

Rileggendo bene lo script ho notato una cosa: if (argument0.object_index==giu.object_index) non serve e può essere rimosso, perché quando chiamiamo instance_position stiamo già chiedendo di trovare solo istanze dell'oggetto indicato, rendendo questo controllo superfluo.
Non é quella la causa del problema comunque.

Sinceramente però non capisco una cosa: perché vuoi gestire la distruzione nello script stesso? Basta mettere nello step del blocco un controllo sull'hp...

Solid Snake
GMI Advanced
Messaggi: 2093
Iscritto il: 19/12/2010, 16:17
Specialità: Programmazione
Uso: GM:Studio 1.4 Standard
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Solid Snake »

Lui vuole che se un oggetto attaccato alla catena si distrugge anche gli altri si distruggono (senza considerare l'hp).
♥♥♥♥♥♥
Immagine
♥♥♥♥♥♥
Spoiler
Immagine

Avatar utente
Vallo92
GMI Advanced
Messaggi: 1508
Iscritto il: 15/07/2011, 20:26
Specialità: Grafico
Uso: GM:Studio 2
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Vallo92 »

Homunculus ha scritto: Sinceramente però non capisco una cosa: perché vuoi gestire la distruzione nello script stesso? Basta mettere nello step del blocco un controllo sull'hp...
Il controllo dell'hp all'interno dello step è già presente, ma:
Ad esempio abbiamo una striscia di blocchi
IXIXIXIXIXI
e colpiamo un blocco di essi. Di conseguenza l'hp di tutti i blocchi scende di 1.
Adesso si genera un altro blocco e si posiziona sopra la striscia, diventando parte di essa
IXI
IXIXIXIXIXI
Adesso se contibuo a colpire i blocchi inferiori si distruggeranno un colpo prima del blocco appena aggiunto anche se è dello stesso colore.
Per evitare questa cosa volevo quindi aggiungere anche un passaggio della distruzione nel caso un blocco venga distrutto.
-Questi occhiali da sole le stanno benissimo. Vuole provarli con le lenti più scure?
- Si vede che le sto guardando le tette?
- Si
- Allora si

Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Homunculus »

Ok capito. Questo peró crea un problema: se un blocco che non è il primo visitato viene distrutto, quelli gia visitati non vengono piu presi in considerazione e quindi rimangono.

Una soluzione potrebbe essere quella di usare sempre l'evento step, ma se hp è <= 0 richiami uno script che distrugge tutti i blocchi di colore uguale adiacenti, esattamente come l'altro ma con instance_destroy al posto di hp -= 1 . Meglio ancora, puoi usare lo stesso script, ma aggiungi un terzo parametro. Se questo parametro è true, fai instance destroy, se è false, togli hp. In questo modo al click su un blocco chiami lo script con false, e in step se un blocco non ha piu hp chiami lo script con true.

Avatar utente
Vallo92
GMI Advanced
Messaggi: 1508
Iscritto il: 15/07/2011, 20:26
Specialità: Grafico
Uso: GM:Studio 2
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Vallo92 »

Mmmmmm... Vediamo se ho ben capito:
Allo script aggiungo un nuovo argument che se richiamato dalla collisione con il click sarà uguale a false, mentre se richiamato dallo step che controlla se l'hp è minore o uguale a zero sarà uguale a true.
Quindi vado a modificare solo la prima riga dello script inserendo:

Codice: Seleziona tutto

if (argument2=="false") {argument0.hp-=1;}
if (argument2=="true") {instance_destroy();}
Più o meno il ragionamento è corretto o sono totalmente fuori strada?
-Questi occhiali da sole le stanno benissimo. Vuole provarli con le lenti più scure?
- Si vede che le sto guardando le tette?
- Si
- Allora si

Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Homunculus »

È corretto, ma il tuo codice è strano. True e false non sono stringhe, ed esiste else per casi del genere.

Codice: Seleziona tutto

if(argument2) {with(argument0) {instance_destroy();}}
else {argument0.hp -= 1;}

Avatar utente
Vallo92
GMI Advanced
Messaggi: 1508
Iscritto il: 15/07/2011, 20:26
Specialità: Grafico
Uso: GM:Studio 2
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Vallo92 »

Evento Step blocco:

Codice: Seleziona tutto

var list=ds_list_create();
if (hp<=0)
{
scr_dannoblocchi(id, list, true);
ds_list_destroy(list);
}
Evento collisione oggetto che danneggia:

Codice: Seleziona tutto

var list=ds_list_create();
scr_dannoblocchi(id, list,false);
ds_list_destroy(list);
Script:
Spoiler

Codice: Seleziona tutto

if(argument2) {with(argument0) {instance_destroy();}}
else {argument0.hp-=1;}
ds_list_add(argument1,argument0);
//Collisione destra
dx=instance_position(x+32,y,argument0.object_index);
if (instance_exists(dx) && ds_list_find_index(argument1,dx)<0)
{
scr_dannoblocchi(dx,argument1,argument2);
}
//Collisione sinistra
sx=instance_position(x-32,y,argument0.object_index);
if (instance_exists(sx) && ds_list_find_index(argument1,sx)<0)
{
scr_dannoblocchi(sx,argument1,argument2);
}
//Collisione su
su=instance_position(x,y-32,argument0.object_index);
if (instance_exists(su) && ds_list_find_index(argument1,su)<0)
{
scr_dannoblocchi(su,argument1,argument2);
}
//Collisione giu
giu=instance_position(x,y+32,argument0.object_index);
if (instance_exists(giu) && ds_list_find_index(argument1,giu)<0)
{
scr_dannoblocchi(giu,argument1,argument2);
}
Errore ricevuto al momento che l'oggetto colpito raggiunge hp=0:
Spoiler

Codice: Seleziona tutto

___________________________________________
############################################################################################
FATAL ERROR in
action number 1
of  Step Event0
for object obj_blocco_giallo:

Push :: Execution Error - Variable Get 100057.object_index(13, -1)
 at gml_Script_scr_dannoblocchi (line 4) - dx=instance_position(x+32,y,argument0.object_index);
############################################################################################
--------------------------------------------------------------------------------------------
stack frame is
gml_Script_scr_dannoblocchi (line 0)
called from - gml_Object_obj_blocco_giallo_Step_0 (line 10) - //Collisione destra
Ho sbagliato qualcosa nell'inserimento dell'argument2? :hum:
-Questi occhiali da sole le stanno benissimo. Vuole provarli con le lenti più scure?
- Si vede che le sto guardando le tette?
- Si
- Allora si

Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Homunculus »

Il problema è penso dovuto al fatto che distruggiamo l'istanza e poi subito sotto usiamo il suo object index per richiamare lo script. Gli if su argument2 vanno messi completamente in fondo allo script. Gli errori peró vale la pena leggerli, qui è abbastanza chiaro il problema.

Altro errore: in step crei la lista sempre (ad ogni step!!! Povera memoria...) ma la distruggi solo se hp è minore o uguale a zero. Così finisci la memoria del pc prima o poi, assolutamente da correggere.

Avatar utente
Vallo92
GMI Advanced
Messaggi: 1508
Iscritto il: 15/07/2011, 20:26
Specialità: Grafico
Uso: GM:Studio 2
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Vallo92 »

Homunculus ha scritto:Il problema è penso dovuto al fatto che distruggiamo l'istanza e poi subito sotto usiamo il suo object index per richiamare lo script. Gli if su argument2 vanno messi completamente in fondo allo script. Gli errori peró vale la pena leggerli, qui è abbastanza chiaro il problema.
Quando inserivo il nuovo if dell'argument2 per la prima volta, mi era subito balenata in mente l'idea che la distruzione ad inizio script avrebbe compromesso l'intero svolgimento di esso, ma visto che nel mio precedente messaggio avevo scritto di sostituire la prima riga con il nuovo codice e tu mi avevi scritto che la modifica/procedimento era corretta, allora ho pensato che la distruzione ad inizio script non avrebbe comportato problemi... :asd:
Adesso ho risolto mettendo l'if e l'else a fine script (come mi hai suggerito tu).
Homunculus ha scritto: Altro errore: in step crei la lista sempre (ad ogni step!!! Povera memoria...) ma la distruggi solo se hp è minore o uguale a zero. Così finisci la memoria del pc prima o poi, assolutamente da correggere.
Corretto inserendo la creazione della variabile all'interno dell'if.


Adesso funziona tutto correttamente senza errori, ma purtroppo rimane il problema che la distruzione non si propaga a tutti gli oggetti dello stesso colore che sono vicini... Praticamente la stessa cosa che avevo descritto qua: http://gmitalia.altervista.org/gmi_foru ... 20#p170820
-Questi occhiali da sole le stanno benissimo. Vuole provarli con le lenti più scure?
- Si vede che le sto guardando le tette?
- Si
- Allora si

Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Homunculus »

Strano, a me pare giusto. La diminuzione di hp si propaga correttamente? Gli sprite sono di fatto grandei 32?

Avatar utente
Vallo92
GMI Advanced
Messaggi: 1508
Iscritto il: 15/07/2011, 20:26
Specialità: Grafico
Uso: GM:Studio 2
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Vallo92 »

Tutti gli sprite sono 32x32 con origine a 0,0.
Adesso che ho provato a fare vari test ho scoperto un altro problema ancora più strano! :shock:
Ho posizionato dei blocchi in questo modo:
X= blocco, -= spazio vuoto

|-|-|-|-|-|X|-|-|
|-|-|-|-|-|X|-|-|
|-|-|-|-|X|X|-|-|
|X|X|X|X|X|X|X|

Colpisco ripetutamente il blocco rosso evidenziato con il grassetto fino a far raggiungere gli hp=0. Dopodiché si distruggano tutti i blocchi sottolineati, quindi anche i due blocchi verdi che a regola dovrebbero rimanere "vivi"...
Se lo script è corretto il problema può essere dato dal fatto che ho impostato tutti i blocchi come imparentati con uno solo?
-Questi occhiali da sole le stanno benissimo. Vuole provarli con le lenti più scure?
- Si vede che le sto guardando le tette?
- Si
- Allora si

Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Homunculus »

Non credo sia un problema di parent, e questo non spiegherebbe comunque perchè alcuni non vengono distrutti. LA maschera dello sprite copre l'intera immagine vero? Comunque sta sera faccio un test

Avatar utente
Vallo92
GMI Advanced
Messaggi: 1508
Iscritto il: 15/07/2011, 20:26
Specialità: Grafico
Uso: GM:Studio 2
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Vallo92 »

Homunculus ha scritto:Non credo sia un problema di parent, e questo non spiegherebbe comunque perchè alcuni non vengono distrutti. LA maschera dello sprite copre l'intera immagine vero? Comunque sta sera faccio un test
Al momento della creazione dei vari sprite non avevo toccato niente per quanto riguarda le maschere. Comunque per sicurezza ho appena ricontrollato e le maschere coprono interamente lo sprite 32x32.
-Questi occhiali da sole le stanno benissimo. Vuole provarli con le lenti più scure?
- Si vede che le sto guardando le tette?
- Si
- Allora si

Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Homunculus »

Ok capito il problema, non ci avevo fatto caso in precedenza... Non puoi usare ovviamente le variabili x e y quando devi controllare i blocchi attorno, devi usare argument0.x e argument0.y, altrimenti per il primo blocco funziona, ma per gli altri no.

Ricordati inoltre di dichiarare sx,dx,su e giu come var.

Avatar utente
Vallo92
GMI Advanced
Messaggi: 1508
Iscritto il: 15/07/2011, 20:26
Specialità: Grafico
Uso: GM:Studio 2
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Vallo92 »

Ma guarda con che razza di errore ci siamo andati a complicare la vita! E pensare che fra tutti non ce ne eravamo accorti (ovviamente io in primis)! :spat:
Comunque ho appena apportato le modifiche e adesso i controlli e le distruzzioni dei vari blocchi funzionano correttamente... RESTA PERO' UN PROBLEMA:
Ricordi l'esempio che ti ho fatto qualche post più in su?
Vallo92 ha scritto:X= blocco, -= spazio vuoto

|-|-|-|-|-|X|-|-|
|-|-|-|-|-|X|-|-|
|-|-|-|-|X|X|-|-|
|X|X|X|X|X|X|X|
Ecco adesso se colpisco un blocco rosso mi vengono distrutti tutti i blocchi rossi (quindi fin qui è corretto) ma mi vengono distrutti anche TUTTI (ovvio che si distruggono tutti visto che con lo script bassa distruggerne uno per passare la funzione del destroy a tutti gli altri) i blocchi verdi! :shock:
Se però vado a colpire il blocchi verdi essi si distruggono correttamente senza andare a distruggere anche i rossi... :fapensare:
-Questi occhiali da sole le stanno benissimo. Vuole provarli con le lenti più scure?
- Si vede che le sto guardando le tette?
- Si
- Allora si

Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Homunculus »

Il problema qui non dipende sicuramente dallo script, proprio ieri per identificare il problema ho fatto un test copincollando il tuo script pari pari, e una volta corrette le x e le y funziona tutto come si deve, sia con parent, che senza parent.

Se te li distrugge tutti il problema sta altrove. Ripeto una domanda fatta in precedenza per sicurezza, ogni colore ha un OGGETTO (non istanza) diverso, giusto? Avrai quindi una cosa tipo: obj_blocco_verde, obj_blocco_giallo ecc... ? Nella room, inserisci istanze specifiche di questi oggetti e non direttamente il parent, corretto?

Avatar utente
Vallo92
GMI Advanced
Messaggi: 1508
Iscritto il: 15/07/2011, 20:26
Specialità: Grafico
Uso: GM:Studio 2
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Vallo92 »

Ecco allora mi sa proprio che sto facendo una cosa sbagliata..
Io ho diversi obj blocco. Uno per ogni colore. Ad ogni blocco ho associato lo sprite del suo colore (ogni colore ha uno sprite a parte diverso). Poi ho preso un blocco e vi ho inserito tutti i codici, e successivamente ho impostato gli altri blocchi come parenti di quel blocco.
In questo caso il blocco "genitore" è il blocco rosso e infatti se vado a distruggere quello mi distrugge di conseguenza tutti gli altri blocchi. Questo sta a significare che è un errore impostare il parent in quel modo.
Quindi (correggimi se sbaglio) dovrò impostare tutti i codici in un nuovo oggetto (es.obj_blocchi) che verrà impostato come "genitore" di tutti gli altri blocchi (anche se poi non verrà inserito all'interno della room). In questo modo non dovrei avere più problemi (stasera appena posso provvedo a testare).
-Questi occhiali da sole le stanno benissimo. Vuole provarli con le lenti più scure?
- Si vede che le sto guardando le tette?
- Si
- Allora si

Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da Homunculus »

Niente da aggiungere, sicuramente va messa a posto la questione parent e testato il tutto. Va bene come dici tu: crei un oggetto generico obj_blocco (anche senza sprite, non ha importanza, tanto non viene mai usato in via diretta) e lo usi come parent al posto di quello rosso.

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 47 ospiti