distruggere tre oggetti differenti contemporaneamente

Hai una curiosità o un problema con Game Maker? Domanda e ti sarà risposto!
Rispondi
Avatar utente
sfigatto
Membro
Messaggi: 227
Iscritto il: 18/04/2014, 23:20
Uso: GM:Studio 1.4 Pro
Contatta:

distruggere tre oggetti differenti contemporaneamente

Messaggio da sfigatto »

salve ragazzi,
sto cercando di creare una specie di Tetris con le carte a gioco.

In pratica quando le carte scendono giù, se si forma una scala di minimo 3 carte o con 3 carte dello stesso valore le tre carte devono distruggersi.

Esempio pratico:

Scende giù il quattro, poi scende il cinque che posiziono accanto al quattro, poi scede il sei che piazzo accanto al cinque.
In questo modo le tre carte devono distruggersi.

Non ho idea però in che modo distruggere tre oggetti differenti che collidono tra di essi.
Avete qualche suggerimento su come procedere?

Avatar utente
CaptainOlon
Membro attivo
Messaggi: 441
Iscritto il: 30/07/2011, 14:56
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Salerno
Contatta:

Re: distruggere tre oggetti differenti contemporaneamente

Messaggio da CaptainOlon »

Un'idea:
Ogni carta posizionata la metti in una grid. Ogni volta che aggiungi una carta in una certa posizione, si controllano le 4 caselle adiacenti ad essa, e per ogni carta che soddisfa determinate condizioni (è uguale alla carta che hai posizionato? è in sequenza alla carta che hai posizionato? e così via..) controlli similmente le 4 caselle adiacenti, tranne ovviamente quella da cui provieni. Potresti fare questo con la ricorsione, ovvero uno script che richiama se stesso. Ovviamente devi salvare in qualche variabile se stai controllando una sequenza o carte uguali, ecc. E salvare di volta in volta la posizione delle caselle che poi alla fine dei controlli dovrai eliminare.
Immagine
Immagine

Avatar utente
SP Games
Membro
Messaggi: 241
Iscritto il: 27/06/2014, 11:21
Specialità: Programmer
Uso: GM:Studio 1.4 Pro
Contatta:

Re: distruggere tre oggetti differenti contemporaneamente

Messaggio da SP Games »

In un oggetto che fa da controller setti una variabile che verifica lo stato della collisione :
COLLISIONE_SI_NO=0
Negli oggetti che collidono dentro all'evento collisione metti questo pseudocodice :

if COLLISIONE_SI_NO=0 then {
SAVE_ID_1=ID
SAVE_ID_2=OTHER.ID
COLLISIONE_SI_NO=1
}
else {
COLLISIONE_SI_NO=0
DESTROY_OBJ(SAVE_ID_1)
DESTROY_OBJ(SAVE_ID_2)
if ID!=SAVE_ID_1 AND ID!=SAVE_ID_2 then DESTROY_OBJ(ID) else DESTROY_OBJ(OTHER.ID)
}

Avatar utente
sfigatto
Membro
Messaggi: 227
Iscritto il: 18/04/2014, 23:20
Uso: GM:Studio 1.4 Pro
Contatta:

Re: distruggere tre oggetti differenti contemporaneamente

Messaggio da sfigatto »


Un'idea:
Ogni carta posizionata la metti in una grid. Ogni volta che aggiungi una carta in una certa posizione, si controllano le 4 caselle adiacenti ad essa, e per ogni carta che soddisfa determinate condizioni (è uguale alla carta che hai posizionato? è in sequenza alla carta che hai posizionato? e così via..) controlli similmente le 4 caselle adiacenti, tranne ovviamente quella da cui provieni. Potresti fare questo con la ricorsione, ovvero uno script che richiama se stesso. Ovviamente devi salvare in qualche variabile se stai controllando una sequenza o carte uguali, ecc. E salvare di volta in volta la posizione delle caselle che poi alla fine dei controlli dovrai eliminare.
è una idea che mi piace. Non ho mai usato le griglie è un buon modo per provare ed imparare grazie per l'idea. Inoltre penso mi permetterà con facilità di distruggere gli oggetti che siano allineati orizzontalmente o verticalmente o obliqui.



In un oggetto che fa da controller setti una variabile che verifica lo stato della collisione :
COLLISIONE_SI_NO=0
Negli oggetti che collidono dentro all'evento collisione metti questo pseudocodice :

if COLLISIONE_SI_NO=0 then {
SAVE_ID_1=ID
SAVE_ID_2=OTHER.ID
COLLISIONE_SI_NO=1
}
else {
COLLISIONE_SI_NO=0
DESTROY_OBJ(SAVE_ID_1)
DESTROY_OBJ(SAVE_ID_2)
if ID!=SAVE_ID_1 AND ID!=SAVE_ID_2 then DESTROY_OBJ(ID) else DESTROY_OBJ(OTHER.ID)
}
Quanta grazia il codice già fatto.....però nella mia ignoranza non ho capito il codice...provo a commentare e sostituire i vari id con tre oggetti chiamati rispettivamente due, tre, quattro.

CODICE DELL'OGGETTO TRE:

Codice: Seleziona tutto

COLLISIONE_SI_NO=0 // Perché questa variabile va in un oggetto controllore e non nel create di ogni oggetto?
questo codice va nell'evento collisione con quattro

Codice: Seleziona tutto



if COLLISIONE_SI_NO=0 then {  //se l'oggetto ha la variabile collisione 0.....
 SAVE_ID_1=tre                                 // save_id_1 è  l'oggetto tre
 SAVE_ID_2=OTHER.quattro         //save_id_1 è  l'oggetto quattro
 COLLISIONE_SI_NO=1               // la variabile collisone diventa 1
}
else {                // se l'oggetto ha la variabile collisione 1....
 COLLISIONE_SI_NO=0      //l'oggetto collisione diventa 0
 DESTROY_OBJ(SAVE_ID_1)             // distruggi l'oggetto tre (devo sostituitre DESTROY_OBJ con instance_destroy() ?)
 DESTROY_OBJ(SAVE_ID_2)               // distruggi l'oggetto quattro(devo sostituitre DESTROY_OBJ con instance_destroy() ?)
 if ID!=SAVE_ID_1 AND ID!=SAVE_ID_2 then DESTROY_OBJ(tre) else DESTROY_OBJ(OTHER.quattro)  //non ho capito  cosa possa servire questo pezzo
}

poi dovrei fare un codice identico con collisione con l'oggetto due in cui nel codice sostituisco l'oggetto due con quattro nel codice.
Poi fare la stessa cosa con gli altri due oggetti.

Come vedete non ho capito molto.....

Avatar utente
Wolfrost
Membro super
Messaggi: 692
Iscritto il: 03/08/2014, 13:08
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Una galassia lontana lontana...
Contatta:

Re: distruggere tre oggetti differenti contemporaneamente

Messaggio da Wolfrost »

Evita di chiamare le variabili con nomi tutti in caps, perchè comunemente se è tutto in caps pensi subito che è una costante, e non una variabile, ma sto divagando...

EDIT:
Per instance_destroy() devi fare

Codice: Seleziona tutto

with id instance_destroy(); //Sostituisci id con l'id della tua istanza.
Immagine

Immagine

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

Re: distruggere tre oggetti differenti contemporaneamente

Messaggio da Vallo92 »

Forse ho anche io un idea per risolvere il tuo problema. Una domanda però: In che modo distingui e gestisci le carte. Sono il solito obj con soltanto lo sprite diverso o sono obj singoli per ogni carta?
-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
SP Games
Membro
Messaggi: 241
Iscritto il: 27/06/2014, 11:21
Specialità: Programmer
Uso: GM:Studio 1.4 Pro
Contatta:

Re: distruggere tre oggetti differenti contemporaneamente

Messaggio da SP Games »

Il mio codice si riferisce alla collisione di 3 oggetti, se serve valutare un numero N di oggetti che possono collidere quel codice ovviamente non va bene ;)

Avatar utente
sfigatto
Membro
Messaggi: 227
Iscritto il: 18/04/2014, 23:20
Uso: GM:Studio 1.4 Pro
Contatta:

Re: distruggere tre oggetti differenti contemporaneamente

Messaggio da sfigatto »

Forse ho anche io un idea per risolvere il tuo problema. Una domanda però: In che modo distingui e gestisci le carte. Sono il solito obj con soltanto lo sprite diverso o sono obj singoli per ogni carta?
Ho optato per Singoli obj per ogni carta.


Il mio codice si riferisce alla collisione di 3 oggetti, se serve valutare un numero N di oggetti che possono collidere quel codice ovviamente non va bene ;)
Si, è l'unica cosa che avevo capito del codice :lol:

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

Re: distruggere tre oggetti differenti contemporaneamente

Messaggio da Vallo92 »

Ok, nel caso ti servisse ancora domani sera ti posto il metodo che ho pensato. Nel caso puoi usarlo come base per lavorarci. ;)
-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
sfigatto
Membro
Messaggi: 227
Iscritto il: 18/04/2014, 23:20
Uso: GM:Studio 1.4 Pro
Contatta:

Re: distruggere tre oggetti differenti contemporaneamente

Messaggio da sfigatto »



Ok, nel caso ti servisse ancora domani sera ti posto il metodo che ho pensato. Nel caso puoi usarlo come base per lavorarci. ;)
Postalo pure grazie.
Mi piacerebbe dargli un'occhiata.

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

Re: distruggere tre oggetti differenti contemporaneamente

Messaggio da Vallo92 »

Ho avuto qualche problemino, e non sono riuscito a buttare giù nessuna linea di codice.
Posso però dirti che il metodo che avevo pensato utilizzava il sistema della ricorsione (come ti ha suggerito anche Captain.
QUI trovi una discussione che aprii qualche anno fa per risolvere un problema simile al tuo. Tramite il metodo della ricorsione (senza l'utilizza di griglie visto che gli oggetti si disponevano già in una precisa posizione) riuscimmo a risolvere tutto.

Prova a dare un occhiata. Riuscirai sicuramente a capire come e cosa dovrai fare! ;)
-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
sfigatto
Membro
Messaggi: 227
Iscritto il: 18/04/2014, 23:20
Uso: GM:Studio 1.4 Pro
Contatta:

Re: distruggere tre oggetti differenti contemporaneamente

Messaggio da sfigatto »

Ho avuto qualche problemino, e non sono riuscito a buttare giù nessuna linea di codice.
Posso però dirti che il metodo che avevo pensato utilizzava il sistema della ricorsione (come ti ha suggerito anche Captain.
QUI trovi una discussione che aprii qualche anno fa per risolvere un problema simile al tuo. Tramite il metodo della ricorsione (senza l'utilizza di griglie visto che gli oggetti si disponevano già in una precisa posizione) riuscimmo a risolvere tutto.

Prova a dare un occhiata. Riuscirai sicuramente a capire come e cosa dovrai fare! ;)
Grazie.
proverò ad adattarlo al mio caso :)

Avatar utente
sfigatto
Membro
Messaggi: 227
Iscritto il: 18/04/2014, 23:20
Uso: GM:Studio 1.4 Pro
Contatta:

Re: distruggere tre oggetti differenti contemporaneamente

Messaggio da sfigatto »

Vallo, ho dato uno sguardo alla discussione che mi hai suggerito.
Ho preso il tuo link ed ho fatto semplicemente copia ed incolla per vedere se funzionava, poi l'avrei adattato al mio caso.
però non funziona...:(

in create ho inserito:

Codice: Seleziona tutto

hp=2
Nella collisione dei due oggetti con cui dovrebbe sparire:

Codice: Seleziona tutto


var list = ds_list_create();
scr_dannoblocchi(id,list);
ds_list_destroy(list);


lo scirpt:

Codice: Seleziona tutto


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)
{
if (argument0.object_index==dx.object_index)
{
scr_dannoblocchi(dx,argument1);
}
}
//Collisione sinistra
sx=instance_position(x-32,y,argument0.object_index);
if (instance_exists(sx) && ds_list_find_index(argument1,sx)<0)
{
if (argument0.object_index==sx.object_index)
{
scr_dannoblocchi(sx,argument1);
}
}
//Collisione su
su=instance_position(x,y-32,argument0.object_index);
if (instance_exists(su) && ds_list_find_index(argument1,su)<0)
{
if (argument0.object_index==su.object_index)
{
scr_dannoblocchi(su,argument1);
}
}
//Collisione giu
giu=instance_position(x,y+32,argument0.object_index);
if (instance_exists(giu) && ds_list_find_index(argument1,giu)<0)
{
if (argument0.object_index==giu.object_index)
{
scr_dannoblocchi(giu,argument1);
}
}


nello step:

Codice: Seleziona tutto

if hp =0
{instance_destroy()}

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

Re: distruggere tre oggetti differenti contemporaneamente

Messaggio da Solid Snake »

Cosa non funziona? dire che non funziona non serve a niente... Inoltre ti consiglio di Indentare il codice, perché personalmente non lo leggo nemmeno un codice non indentato... :cappa:
♥♥♥♥♥♥
Immagine
♥♥♥♥♥♥
Spoiler
Immagine

Avatar utente
sfigatto
Membro
Messaggi: 227
Iscritto il: 18/04/2014, 23:20
Uso: GM:Studio 1.4 Pro
Contatta:

Re: distruggere tre oggetti differenti contemporaneamente

Messaggio da sfigatto »

Scusatemi, cercherò di essere più preciso.
Non funziona...nel senso che il tutto dovrebbe distruggere i 3 oggetti se sono in contatto tra loro, ma quando collidono non succede proprio nulla....
i tre oggetti non si distruggono ed il gioco continua come se niente fosse.
Ho guardato con il debug e la variabile hp=2 del create quando gli oggetti collidono non diminuisce, è come se lo script non esistesse.

Riposto il codice indentato (ringrazio per la spiegazione del significato della parola):

in create:

Codice: Seleziona tutto

 
 hp=2
Nella collisione dei due oggetti con cui dovrebbe sparire:

Codice: Seleziona tutto

var list = ds_list_create();
scr_dannoblocchi(id,list);
ds_list_destroy(list);

Lo scirpt(chiamato scr_dannoblocchi):

Codice: Seleziona tutto


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)
   {
      if (argument0.object_index==dx.object_index)
   {
  scr_dannoblocchi(dx,argument1);
   }
}


//Collisione sinistra
sx=instance_position(x-32,y,argument0.object_index);
 if (instance_exists(sx) && ds_list_find_index(argument1,sx)<0)
  {
   if (argument0.object_index==sx.object_index)
   {
   scr_dannoblocchi(sx,argument1);
   }
}


//Collisione su
su=instance_position(x,y-32,argument0.object_index);
  if (instance_exists(su) && ds_list_find_index(argument1,su)<0)
   {
     if (argument0.object_index==su.object_index)
   {
   scr_dannoblocchi(su,argument1);
   }
}


//Collisione giu
giu=instance_position(x,y+32,argument0.object_index);
    if (instance_exists(giu) && ds_list_find_index(argument1,giu)<0)
     {
     if (argument0.object_index==giu.object_index)
     {
  scr_dannoblocchi(giu,argument1);
    }
}


in step:

Codice: Seleziona tutto


if hp =0
{
instance_destroy()
}


Rispondi

Chi c’è in linea

Visitano il forum: Bing [Bot] e 48 ospiti