Distruggere oggetti dello stesso colore

Hai una curiosità o un problema con Game Maker? Domanda e ti sarà risposto!
Avatar utente
Vallo92
GMI Advanced
Messaggi: 1508
Iscritto il: 15/07/2011, 20:26
Specialità: Grafico
Uso: GM:Studio 2
Contatta:

Distruggere oggetti dello stesso colore

Messaggio da Vallo92 »

Ciao a tutti,
vorrei richiedere il vostro aiuto per la creazione dell'effetto riportato nel titolo della discussione.
Io ho 4 obj di colore differente (verde,blu,giallo,rosso) che appaiono casualmente nella room. Quando un obj viene colpito subisce danni e successivamente (se gli hp arrivano a 0) si distrugge. Fino a qui tutto ok.
Adesso però vorrei fare in modo che, ad esempio, se accanto all'obj_blu esiste uno o più obj_blu, dal momento che uno viene colpito tutti gli obj in questione subiscono danni e se uno viene distrutto di conseguenza tutti gli obj_blu che collidono tra di essi vengono distrutti.

Per farvi capire meglio vi posto un immagine di un classico gioco del genere (soltanto che a me non interessa che per essere distrutti gli obj vicini debbano essere 3 o più...):
Immagine

Sapete darmi qualche indicazione su qualche metodo non troppo complesso per programma questa cosa? :cappa:
-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

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 »

Vediamo se ho capito... Allora tu vuoi che se un oggetto di colore uguale quello che sta vicino a lui subisce danni allora lo subisce anche l'altro?
Prova così, quando riceve il danno:

Codice: Seleziona tutto

hp-=danno;

with(object_index)
{
 if (id!=other.id && point_distance(other.x, other.y, x, y)<DISTANZA)
 {
  hp-=danno;
 }
}
Sostituisci "DISTANZA" con la distanza che vuoi.
Questo codice toglie la vita all'oggetto poi fa eseguire la stessa cosa a tutti gli oggetti che si trovano nel raggio "DISTANZA" e che non sono l'oggetto chiamante. Non l'ho testato ma dovrebbe funzionare. ;)
♥♥♥♥♥♥
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 »

Ok, appena ho la possibilità provo a testare il tuo codice.


Edit:
Forse non funzionerà come vorrei io perche stupidamente mi sono dimenticato di scrivere un altra cosa!
Per far distruggere tutti i blocchi dello stesso colore non mi interessa la distanza massima di distruzione. A me interessa soltanto che gli obj che collidono tra di loro siano dello stesso colore e (ecco cosa mi ero dimenticato di scrivere xD) che siano allineati tra di loro per orizzontale o verticale (quindi non subiranno danni gli obj dello stesso colore che si trovano diagonalmente rispetto all'obj colpito)!
-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

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 »

Una domanda: Sono allineati ad una griglia? perchè se è così è meglio usare le ds_grid.
♥♥♥♥♥♥
Immagine
♥♥♥♥♥♥
Spoiler
Immagine

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

Re: Distruggere oggetti dello stesso colore

Messaggio da Homunculus »

Non ho capito una cosa: se ho per esempio 5 oggetti allineati come segue:

:gm8:
:gm8:
:gm8: :gm8: :gm8:

e quello più in alto subisce danno, la catena di danno si propaga anche su quelli in orizzontale visto che quello in basso a sinistra é collegato ad altri due in orizzontale, corretto? In pratica, anche se fanno angoli, curve ecc subiscono tutti danno dal momento che sono collegati?

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 »

Solid Snake ha scritto:Una domanda: Sono allineati ad una griglia? perchè se è così è meglio usare le ds_grid.
No, non ho usato griglie per allineare gli obj.
Homunculus ha scritto:Non ho capito una cosa: se ho per esempio 5 oggetti allineati come segue:

:gm8:
:gm8:
:gm8: :gm8: :gm8:

e quello più in alto subisce danno, la catena di danno si propaga anche su quelli in orizzontale visto che quello in basso a sinistra é collegato ad altri due in orizzontale, corretto? In pratica, anche se fanno angoli, curve ecc subiscono tutti danno dal momento che sono collegati?
Esatto. Penso che hai capito perfettamente che cosa intendo, comunque per sicurezza provo a fare un esempio:
|X|0|0|0|
|0|X|0|X|
|0|X|0|0|
|0|X|X|X|
|X|0|X|0|

In questo caso se colpisco la X sottolineata si distruggeranno tutte le X in grassetto
-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

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 »

:confuso: Ripeto la mia domanda: Questi oggetti sono disposti a griglia? Perchè da quel che dici mi pare prorpio di si :sisisi:
♥♥♥♥♥♥
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 »

Solid Snake ha scritto::confuso: Ripeto la mia domanda: Questi oggetti sono disposti a griglia? Perchè da quel che dici mi pare prorpio di si :sisisi:
Scusa Soldi.... Avevo capito male la tua domanda! xD
Si, gli oggetti si dispongono a griglia (come avrai sicuramente intuito dall'esempio che ho fatto a Homu)!
-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
guidox
GMI Honor
Messaggi: 5765
Iscritto il: 26/07/2009, 17:23
Specialità: programmazione
Uso: GM:Studio 1.4 Android
Località: Marche
Contatta:

Re: Distruggere oggetti dello stesso colore

Messaggio da guidox »

Devi usare uno script e utilizzare la ricorsione!
Fai uno script che prende come argument 0 l'id di un'istanza, e poi fai una cosa così:

se nella lista non c'è già argument0 allora {
aggiungi argument0 alla lista
infliggi danno a argument0
se argument0 ha a destra un oggetto del suo stesso colore allora script(oggetto del suo stesso colore);
se argument0 ha a sinistra un oggetto del suo stesso colore allora script(oggetto del suo stesso colore);
se argument0 ha sopra un oggetto del suo stesso colore allora script(oggetto del suo stesso colore);
se argument0 ha sotto un oggetto del suo stesso colore allora script(oggetto del suo stesso colore);
}

La lista serve a non mandare in loop...
Immagine

Immagine

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 »

In parole povere è lo stesso algoritmo che usa paint per riempire uno spazio :asd:
Per venirti ancora meglio puoi usare le ds_grid in cui puoi controllare facilmente cosa hai nella tua room.
♥♥♥♥♥♥
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 »

Solid Snake ha scritto:In parole povere è lo stesso algoritmo che usa paint per riempire uno spazio :asd:
Per venirti ancora meglio puoi usare le ds_grid in cui puoi controllare facilmente cosa hai nella tua room.
Dici che usare una ds_grid sia più efficiente che usare lo script di guidox? Dato che sono qui a cercare di sistemare questa cosa vorrei farla nel migliore dei modi possibile in modo da evitare di tornarci su un futuro...
Comunque non mi è molto chiaro in che modo utilizzare una ds_grid per ottenere il risultato voluto... xD
Potresti spiegarti un po' meglio?
-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 »

Vallo l'agoritmo di guidox va usato con grid o meno, cambia solo il modo con cui vai a pescare gli oggetti vicini: senza grid ti basi sulla posizione in pixel, con grid ti basi sulle celle della griglia.

Comunque anche secondo me é un problema risolvibile facilmente con una bella ricorsione.

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 »

Ricevuto!
Allora a questo punto tanto vale utilizzare uno script come indicato da guidox, che per le mie capacità è molto più facile da programmare.
Adesso però ho un paio di domande a riguardo:
- Per "ricorsione" intendete qualcosa che si ripete (in questo caso) per ogni oggetto?
- Nello script di guidox non mi sono molto chiare due cose:
1) Cosa si intende con la parte "(oggetto del suo stesso colore)"?
2) Cosa si intende con "se nella lista non c'è già argument0 allora"? Devo creare una lista contenete i vari id degli obj?
-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 »

In parole povere, un algoritmo ricorsivo richiama se stesso all'interno della sua esecuzione. In questo caso chiami lo script per il primo oggetto colorato, fai quel che che devi fare a quell'oggetto e poi richiami di nuovo lo script su tutti gli oggetti adiacenti, dall'interno dello script stesso. Insomma, un po' come il film inception :mrgreen:

In base a questo quindi, con "script(oggetto del suo stesso colore)" guidox intende il richiamare lo script su un istanza adiacente, passando l'istanza stessa come argomento, ma solo se ha lo stesso colore dell'istanza attuale.

Un problema che nasce da questo sistema però é tenere traccia di quali istanze hai già passato in rassegna. Difatti se abbiamo per esempio due istanze blu una a fianco dell'altra, la prima esegue lo script sulla seconda, la seconda lo esegue sulla prima, la prima di nuovo sulla seconda ecc..., in un ciclo infinito. Devi quindi tenerti una ds_list di istanze che hai già visitato e evitare quindi di rieseguire lo script su di esse.

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 »

Vallo92 ha scritto:Ricevuto!
Allora a questo punto tanto vale utilizzare uno script come indicato da guidox, che per le mie capacità è molto più facile da programmare.
Adesso però ho un paio di domande a riguardo:
- Per "ricorsione" intendete qualcosa che si ripete (in questo caso) per ogni oggetto?
- Nello script di guidox non mi sono molto chiare due cose:
1) Cosa si intende con la parte "(oggetto del suo stesso colore)"?
2) Cosa si intende con "se nella lista non c'è già argument0 allora"? Devo creare una lista contenete i vari id degli obj?
Per ricorsione si intende che questo script richiama se stesso. La ricorsione è uno strumento molto potente ma anche pericoloso.
guidox ha scritto:se nella lista non c'è già argument0 allora {
aggiungi argument0 alla lista
infliggi danno a argument0
se argument0 ha a destra un oggetto del suo stesso colore allora script(oggetto del suo stesso colore);
se argument0 ha a sinistra un oggetto del suo stesso colore allora script(oggetto del suo stesso colore);
se argument0 ha sopra un oggetto del suo stesso colore allora script(oggetto del suo stesso colore);
se argument0 ha sotto un oggetto del suo stesso colore allora script(oggetto del suo stesso colore);
}
Praticamente guidox dice di creare uno script (chiamiamolo get_damage()). In questo script come argomento passerai l'id dell'istanza che inizia la catena di danno e la lista cioè quando un istanza riceve danno fai get_damage(id, list).

Quando parla di liste guidox intende togliere le chiamate già effettuate aggiungendole appunto ad una lista. Quindi nell'evento che richiama lo script all'inizio metti:

Codice: Seleziona tutto

var list;
list=ds_list_create();
Ora andiamo all'interno dello script.

Codice: Seleziona tutto

if (ds_list_find_index(argument1, argument0)!=-1)
{
 //Infliggi danno;
 //dx=instanza alla destra
 //se dx è dello stesso colore di quest'instanza allora
 get_damage(dx.id, argument0);
 //fai la stessa cosa per le altre 3 direzioni
}
Non so se si capisce ma c'ho provato :asd:
♥♥♥♥♥♥
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 »

Stavo scrivendo un nuovo messaggio dove vi mostravo lo script (incompleto) che avevo provato a scrivere e poi aggiornando la pagina ho visto apparire il messaggio Solid! xD A questo punto faccio prima a farvi le ultime 2-3 domande basandomi sullo script postato da lui.

- Nella parte dello script "//dx=instanza alla destra" che comando mi conviene usare per verificare se a destra esiste un instanza? "instance_position" potrebbe andare (anche se non credo proprio visto che mi viene restituito l'id dell'instanza e non l'instanza stessa)? (se può servire vi dico che utilizzo sprite 32x32 con origine a 0,0)
- Per verificare se l'instanza è dello stesso colore può esse una buona idea usare come verifica l'image_index dell'obj?
-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

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 »

1) Come ti ho già detto il modo migliore è di inserire le instanze in una ds_grid che non è nient'altro che un array bidimensionale. Se vuoi proprio farlo con le funzioni senza ds_grid allora puoi usare collision_point che restituisce l'id dell'instanza con cui collide, e dato che a te ti serve proprio l'id è ottima.

2) Dipende da come tratti image_index... Se il colore cambia in base a image_index allora puoi usarlo.
♥♥♥♥♥♥
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 »

Solid Snake ha scritto:1) Come ti ho già detto il modo migliore è di inserire le instanze in una ds_grid che non è nient'altro che un array bidimensionale. Se vuoi proprio farlo con le funzioni senza ds_grid allora puoi usare collision_point che restituisce l'id dell'instanza con cui collide, e dato che a te ti serve proprio l'id è ottima.
Usando una ds_grid come funzionerebbe la cosa?
Innanzitutto devo crearmi un obj che mi crea una griglia utilizzando "ds_grid_create" giusto?
Ad esempio: global.griglia=ds_grid_create(10,20);
(a proposito.. La griglia mi viene creata a partire dall'origine dell'obj che contiene il comando "ds_grid_create"?Se la mia area di gioco si trova solo al centro dello schermo posso fare in modo che la griglia sia creata solo li o mi conviene crearla ugualmente a tutto schermo?)
Dopodiché ogni volta un oggetto si ferma all'interno di una cella devo aggiungere all'interno di essa la sua posizione con "ds_grid_add"? Ad esempio: ds_grid_add(global.griglia,obj_bloccoblu.x,obj_bloccoblu.y,1); // Valore 1 = blocchi blu

Adesso però ogni volta che un blocco si sposta o viene distrutto devo aggiornare la griglia giusto? Però non conosco le funzioni per fare questo.. :NO:
Scusate se sono così impedito con le griglie ma è la prima volta che sto cercando di utilizzarle... :oops:
Solid Snake ha scritto:2) Dipende da come tratti image_index... Se il colore cambia in base a image_index allora puoi usarlo.
Ho cerato diversi oggetti, ognuno con un proprio sprite, quindi hai ragione tu, l'idea dell'image_index non può funzionare visto che avrebbero tutti la stessa (cioè 0). Che altro metodo potrei usare per far riconoscere il colore dell'instanza? Una variabile potrebbe andare (anche se non so se sia la soluzione migliore)? :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 »

Non si tratta di una griglia fisica, non ha posizione. Io per il momento ti consiglio di lasciar perdere un attimo la grid e risolvere senza per evitare confusione, anche perchè alla base l'algoritmo rimane uguale, sei sempre in tempo per aggingerla dopo.

Per il colore è una cavolata, se ogni colore è un oggetto diverso basta confrontare gli oggetti no? Object_index == altra_istanza.object_index. Se tutti i colori hanno lo stesso oggetto ma sprite diverso, controlla lo sprite allo stesso modo. Qui veramente non vedo il problema

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 »

Preceduto da Homunculus.
Meglio che usi le funzioni dato che non hai le basi per usare una ds_grid... Usa point_collision(...) che ritorna l'id dell'istanza con cui collide.
♥♥♥♥♥♥
Immagine
♥♥♥♥♥♥
Spoiler
Immagine

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 43 ospiti