bloccare creazione di oggetto in posizione già occupata

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

bloccare creazione di oggetto in posizione già occupata

Messaggio da sfigatto »

salve ragazzi sono ancora qui,
cerco di rivolgermi il meno possibile al forum, ma mi sono bloccato su questa cosa che sto per descrivervi e non riesco ad andare avanti.


In pratica ho un oggettoA, un oggettoB, ed un oggettoC.

Quando l'oggettoA collide con l'oggettoB si crea un oggetto1 in un punto preciso.

Quando l'oggettoA collide con l'oggettoC si crea un oggetto2 in un punto preciso.

Specifico che nello schermo possono essere presenti altri oggetti1 o 2 ottenuti tra la collisione di un oggettoB o C con altri oggetti (ad esempio un oggettoW o un oggettoZ).

In alcuni casi l'oggetto1 e l'oggetto2 se creati occuperebbero la stessa posizione e questo non va bene, se una posizione è già occupata il secondo oggetto non deve essere creato.

Poniamo il caso che tramite la collisione tra oggetto A e B sia stato creato un oggetto1 in posizione x=100, y=100.
Ora collidendo gli oggetti A e C, si genererebbe l'oggetto2 in x=100, y=100, essendo però questa posizione occupata da oggetto1 non voglio che l'oggetto2 venga creato.


Per il momento il codice che uso per creare gli oggetti1 o 2 è il seguente:
nell'oggettoB :

EVENT COLLISIONE oggettoA:

Codice: Seleziona tutto


instance_destroy(); // una volta creato l'oggetto1 l'oggettoA deve sparire e tornare al suo punto d'origine

if  !instance_exists(oggetto1) instance_create (100,100,oggetto1); //creare oggetto1, ma solo se già non esiste in quella data posizione
   
instance_create(xstart,ystart,oggettoB); // ritorno al punto d'origine dell'oggettoB



Per non fare creare l'oggetto2 penso che dovrei fare una cosa del genere:
in oggettoC:
EVENT COLLISIONE oggettoA:

Codice: Seleziona tutto

instance_destroy(); // una volta creato l'oggetto2, l'oggettoB deve sparire e tornare al suo punto d'origine

if  !instance_exists(oggetto2) instance_create (100,100,oggetto2); //creare oggetto2, ma solo se già non esiste in quella data posizione

if place_empty (100,100)
{
//e qui dovrei inserire l' espressione che non ho la minima idea di quale sia//
}



instance_create(xstart,ystart,oggettoC); // ritorno al punto d'origine dell'oggettoC



qualcuno può aiutarmi?

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

Re: bloccare creazione di oggetto in posizione già occupata

Messaggio da sfigatto »

Salve, forse non è molto interessante, ma volevo segnalare che ho risolto il problema, anche se forse non molto elegantemente.

In pratica ho creato un oggetto che possiamo chiamare oggettoA1.
L'oggettoA1 è identico all'oggettoA, l'unica differenza è che non può interagire con l'oggettoB e C.

Quando l'oggettoA si collide con l'oggettoB o C si crea in un punto preciso l'oggetto1 o 2 come è nelle mie intenzioni, ma oltre a questo ora l'oggettoA1 sostituisce l'0ggettoA.

In questa maniera gli oggetti B e C non avendo la possibilità di interagire con l'ggettoA1 non possono creare un oggetto1 o 2 sopra l'oggetto creato precedentemente.

Più avanti cercherò di trovare una soluzione più brillante( nonostante ci abbia già pensato tanto e fatto varie prove), perché altrimenti non imparo niente, però per ora sono soddisfatto dell'efficacia della soluzione!

Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: bloccare creazione di oggetto in posizione già occupata

Messaggio da doom13 »

Il tutto è un po' confusionario comunque dovresti fare una cosa del genere

Codice: Seleziona tutto

if(place_meeting(100, 100, oggetto1))
{
  instance_create(100, 100, oggetto2);
}
in sostanza devi creare il nuovo oggetto solo se la posizione è libera e quindi la condizione place_meeting(100, 100, oggetto1) è vera, non mi sembra molto complicato...
se ho capito male prova a rispiegarmelo :P
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

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

Re: bloccare creazione di oggetto in posizione già occupata

Messaggio da sfigatto »

Grazie mille per il suggerimento Doom13, però il codice non funziona, quando i due oggetti si incontrano non creano il terzo oggetto, non succede niente di niente.

Provando e riprovando ho però trovato una soluzione.

in oggettoB:

EVENT COLLISION con oggettoA

Codice: Seleziona tutto

if !instance_exists(oggetto1)
{
if (place_empty (25,145))
{ 
instance_create (25,145,oggetto1);
}}

instance_destroy();

instance_create (xstart,ystart,oggettoB);


Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: bloccare creazione di oggetto in posizione già occupata

Messaggio da doom13 »

Come mai metti sempre quel if !instance_exists(oggetto1) ?
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

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

Re: bloccare creazione di oggetto in posizione già occupata

Messaggio da sfigatto »

Errore mio scusate, non vi avevo segnalato che ho modificato in corsa alcuni aspetti del mio pseudogioco.

Nel senso che nel progetto inizialmente era previsto che ci potessero essere più oggetti uguali, poi però ho modificato la cosa per rendere le dinamiche del gioco più interessanti ed ora gli oggetti creati (almeno in questa fase) sono unici, senza doppioni.

Così uso if !instance_exists(oggetto1) per controllare che non ci sia un altro oggetto uguale nel terreno di gioco.


P.S.
Questa mia decisione di volere degli oggetti unici nel gioco mi sta creando dei problemi con la creazione di alcuni oggetti che vengono creati a cascata con il comando choose, è già un po' di giorni che mi sono bloccato su questo nuovo problema, sto esaurendo le idee per risolverlo, ed è molto probabile che tra poco sarò qui a mendicare nuovamente il vostro aiuto! :P

Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: bloccare creazione di oggetto in posizione già occupata

Messaggio da doom13 »

sfigatto ha scritto:Errore mio scusate, non vi avevo segnalato che ho modificato in corsa alcuni aspetti del mio pseudogioco.

Nel senso che nel progetto inizialmente era previsto che ci potessero essere più oggetti uguali, poi però ho modificato la cosa per rendere le dinamiche del gioco più interessanti ed ora gli oggetti creati (almeno in questa fase) sono unici, senza doppioni.

Così uso if !instance_exists(oggetto1) per controllare che non ci sia un altro oggetto uguale nel terreno di gioco.


P.S.
Questa mia decisione di volere degli oggetti unici nel gioco mi sta creando dei problemi con la creazione di alcuni oggetti che vengono creati a cascata con il comando choose, è già un po' di giorni che mi sono bloccato su questo nuovo problema, sto esaurendo le idee per risolverlo, ed è molto probabile che tra poco sarò qui a mendicare nuovamente il vostro aiuto! :P
Beh usando !instance_exists prima di creare un'istanza non dovresti avere problemi...
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

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

Re: bloccare creazione di oggetto in posizione già occupata

Messaggio da sfigatto »

Magari fosse così facile :)

Il problema è che devo creare in modo casuale 5 oggetti scelti tra 10 in punti specifici.

Cliccando su un oggetto con questo codice creo i 5 oggetti a caso.

il codice per creare i 5 oggetti random in un oggetto con left pressed mouse è:

Codice: Seleziona tutto

randomize()
instance_create (100,200,choose(object1, object2,object3,
object4,object5,object6,
object7,object8,object9,object10))

randomize()
instance_create (100,250,choose(object1, object2,object3,
object4,object5,object6,
object7,object8,object9,object10))

randomize()
instance_create (100,300,choose(object1, object2,object3,
object4,object5,object6,
object7,object8,object9,object10))

randomize()
instance_create (100,350,choose(object1, object2,object3,
object4,object5,object6,
object7,object8,object9,object10))


randomize()
instance_create (100,400,choose(object1, object2,object3,
object4,object5,object6,
object7,object8,object9,object10))

In questo modo si creano i 5 oggetti a caso.
il problema è che a volte alcuni oggetti si ripetono.

Non posso usare if !instance_exists perché le possibilità sono infinite inoltre se l'oggetto effettivamente già esistesse non mi creerebbe l'oggetto e non avrei 5 oggetti ma 4.

Avevo pensato di usare un if instance_number =2 per ogni oggetto e poi usare una instance_change per cambiarlo, ma in questo modo tutte e due gli oggetti uguali cambierebbero e non solamente uno dei due.

Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: bloccare creazione di oggetto in posizione già occupata

Messaggio da doom13 »

Quindi i 5 oggetti che si creano dvono essere tutti diversi?

PS
Randomize() se non sbaglio puoi metterlo una sola volta all'avvio del gioco ;)
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

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

Re: bloccare creazione di oggetto in posizione già occupata

Messaggio da sfigatto »

Esatto i 5 oggetti devono essere tutti diversi e sono ancora in alto mare nel trovare una soluzione.

Grazie per il consiglio su randomize() ho controllato e ne basta solo uno

Avatar utente
pacmino
GMI Guru
Messaggi: 2569
Iscritto il: 03/06/2009, 16:38
Specialità: Scazzato cronico
Uso: GM:Studio 2
Località: Seconda stella a destra questo è il cammino e poi dritto, fino al mattino...
Contatta:

Re: bloccare creazione di oggetto in posizione già occupata

Messaggio da pacmino »

ma randomize serve anche per il comando choose?
Immagine

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

Re: bloccare creazione di oggetto in posizione già occupata

Messaggio da Vallo92 »

pacmino ha scritto:ma randomize serve anche per il comando choose?
Si. Quando testi il gioco e non usi il "randomize();", vengono scelti sempre i soliti valori.
-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
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: bloccare creazione di oggetto in posizione già occupata

Messaggio da doom13 »

sfigatto ha scritto:Esatto i 5 oggetti devono essere tutti diversi e sono ancora in alto mare nel trovare una soluzione.

Grazie per il consiglio su randomize() ho controllato e ne basta solo uno

Codice: Seleziona tutto

var ok, lista, daje;
ok = 0;
lista[0]=0;  //oggetto, se 0 non esiste ancora
lista[1]=0;  //oggetto2, ..
lista[2]=0;  //oggetto3, ...
lista[3]=0;  //oggetto4
lista[4]=0;  //oggetto5

if (instance_exists(oggetto1))
  lista[0] = 1;
if (instance_exists(oggetto2))
  lista[1] = 1;
if (instance_exists(oggetto3))
  lista[2] = 1;
if (instance_exists(oggetto4))
  lista[3] = 1;
if (instance_exists(oggetto5))
  lista[4] = 1;

while(ok == 0)
{
  daje = irandom_range(0, 4);
  if(lista[daje] == 0)
  {
    ok = 1;
  }
}

if(daje == 0 and !place_meeting(100, 100, oggettoB)) //non mi ricordo il nome del tuo oggetto
 instance_create(100, 100, oggettoA);
if(daje == 1 and !place_meeting(100, 100, oggettoB)) //non mi ricordo il nome del tuo oggetto
 instance_create(100, 100, oggettoB);
if(daje == 2 and !place_meeting(100, 100, oggettoB)) //non mi ricordo il nome del tuo oggetto
 instance_create(100, 100, oggettoC);
if(daje == 3 and !place_meeting(100, 100, oggettoB)) //non mi ricordo il nome del tuo oggetto
 instance_create(100, 100, oggettoD);
if(daje == 4 and !place_meeting(100, 100, oggettoB)) //non mi ricordo il nome del tuo oggetto
 instance_create(100, 100, oggettoE);
L'ho fatto al volo e non piace neanche a me ma dovrebbe funzionare, poi ovviamente lo adatti al tuo codice come maglio credi :)
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

Avatar utente
pacmino
GMI Guru
Messaggi: 2569
Iscritto il: 03/06/2009, 16:38
Specialità: Scazzato cronico
Uso: GM:Studio 2
Località: Seconda stella a destra questo è il cammino e poi dritto, fino al mattino...
Contatta:

Re: bloccare creazione di oggetto in posizione già occupata

Messaggio da pacmino »

a sto punto meglio usare una ds_list in cui fare il shuffle ogni volta

creo la lista e la riempo di rosso, verde, giallo, blu eccetera tutti diversi ovviamente

quando avviene l'evento creazione oggetti faccio il shuffle della lista ed uso le prime 5 posizioni della lista per determinare l'oggetto da creare in posizione 1 2 3 4 5

in questo modo ho sicuramente 5 oggetti diversi in 5 posizioni diverse, ogni tanto potrei avere sequenze identiche

il comando randomize() influenza anche il shuffle?
Immagine

Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: bloccare creazione di oggetto in posizione già occupata

Messaggio da doom13 »

pacmino ha scritto:il comando randomize() influenza anche il shuffle?
Si, tutto ciò che è random
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

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

Re: bloccare creazione di oggetto in posizione già occupata

Messaggio da sfigatto »

Mi cospargo il capo di sale.
sono pronto a beccare tutti gli insulti che mi merito.
Credo di non essermi fatto capire con questo secondo problema.

Intendevo che i 5 oggetti creati in posizione diversa non vengono creati tramite collisione di più oggetti, ma cliccando su un solo oggetto.

Mentre invece mi sembra che questo codice abbia bisogno di qualche collisione.

Ho comunque riadattato il codice in questa maniera (codice che però non funziona evidentemente sbaglio qualcosa.)


in evento CREATE dell'oggetto che serve per creare gli oggetti random:

Codice: Seleziona tutto

global.posizione =4 // serve per determinare in che posizione andranno gli oggetti random


In left press event dell'oggetto che deve creare tutto ho inserito il codice suggeritomi e da me modificato:
(ho lasciato il nome degli oggetti originali che utilizzo senza scrivere oggettoA B o oggetto 1 o 2 )

Codice: Seleziona tutto


var ok, lista, daje;

ok = 0;

lista[0]=0;  //oggetto, se 0 non esiste ancora
lista[1]=0;  //oggetto2, ..
lista[2]=0;  //oggetto3, ...
lista[3]=0;  //oggetto4
lista[4]=0;  //oggetto5
lista[5]=0;  //oggetto6 non esiste ancora
lista[6]=0;  //oggetto7, ..
lista[7]=0;  //oggetto8, ...
lista[8]=0;  //oggetto9
lista[9]=0;  //oggetto10    //questa parte del codice è identica a quella scritta da doom13, ho aggiunto altri 5 oggetti visto che la scelta dei 5 oggetti è tra 10  oggetti


if (instance_exists(object66rebound2))
  lista[0] = 1;
if (instance_exists(object66_3pts2))
  lista[1] = 1;
if (instance_exists(object67assist2))
  lista[2] = 1;
if (instance_exists(object68bench2))
  lista[3] = 1;
if (instance_exists(object69clutch2))
  lista[4] = 1;
  if (instance_exists(object70defens2))
  lista[5] = 1;
if (instance_exists(object71power2))
  lista[6] = 1;
if (instance_exists(object72pride2))
  lista[7] = 1;
if (instance_exists(object73stamina2))
  lista[8] = 1;
if (instance_exists(object74steal2))
  lista[9] = 1; // anche questa parte è identica a quella suggerita ho sempre aggiunto 5 oggetti. Gli oggetti tra parentesi sono ovviamente gli oggetti che devono essere creati

while(ok == 0)
{
  daje = irandom_range(0, 9);
  if(lista[daje] == 0)
  {
    ok = 1;
  }
}  // anche qui non ho cambiato niente se non irandom_range che è passato da (0,4) a (0,9) sempre perché ho aggiunto i 5 oggetti in più 


if(daje == 0) and global.posizione==4 //Il cambiamento sostanziale è qui: ho sostituito !place_meeting con global.posizione che serve per vedere dove piazzare l'istanza.
{ instance_create(190, 310, object66rebound2); global.posizione -=1; } //se la condizione è corretta crea l'istanza e fa scalare di 1 la variaible della posizione. Ho usato questo procedimento  per tute e 10 gli oggetti.

if (daje == 0) and global.posizione==3
{ instance_create(238, 345, object66rebound2);  global.posizione -=1;}

if (daje == 0) and global.posizione==2
{ instance_create(190, 380, object66rebound2); global.posizione -=1;}

if (daje == 0) and global.posizione==1
{ instance_create(238, 415, object66rebound2); global.posizione -=1;}

if (daje == 0) and global.posizione==0
{ instance_create(190, 450, object66rebound2); global.posizione -=1;}


if (daje == 1) and global.posizione==4  //secondo oggetto
{ instance_create(190, 310, object66_3pts2); global.posizione -=1;  }

if (daje == 1) and global.posizione==3
{ instance_create(238, 345, object66_3pts2); global.posizione -=1; }

if (daje == 1) and global.posizione==2
{ instance_create(190, 380, object66_3pts2); global.posizione -=1; }

if (daje == 1) and global.posizione==1
{ instance_create(238, 415, object66_3pts2); global.posizione -=1; }

if (daje == 1) and global.posizione==0
{ instance_create(190, 450, object66_3pts2); global.posizione -=1; }


if (daje == 2) and global.posizione==4 //terzo oggetto
{ instance_create(190, 310, object67assist2); global.posizione -=1;  }

if  (daje == 2) and global.posizione==3
{ instance_create(238, 345, object67assist2); global.posizione -=1; }

if  (daje == 2) and global.posizione==2
{ instance_create(190, 380, object67assist2); global.posizione -=1; }

if  (daje == 2) and global.posizione==1
{ instance_create(238, 415, object67assist2); global.posizione -=1; }

if  (daje == 2) and global.posizione==0
{ instance_create(190, 450, object67assist2); global.posizione -=1; }


if (daje == 3) and global.posizione==4 //quarto oggetto
{ instance_create(190, 310, object68bench2); global.posizione -=1; }

if  (daje == 3) and global.posizione==3
{ instance_create(238, 345, object68bench2); global.posizione -=1; }

if  (daje == 3) and global.posizione==2
{ instance_create(190, 380, object68bench2); global.posizione -=1; }

if  (daje == 3) and global.posizione==1
{ instance_create(238, 415, object68bench2); global.posizione -=1; }

if  (daje == 3) and global.posizione==0
{ instance_create(190, 450, object68bench2); global.posizione -=1; }


if (daje == 4) and global.posizione==4 //quinto oggetto 
{ instance_create(190, 310, object69clutch2); global.posizione -=1; }

if  (daje == 4) and global.posizione==3
{ instance_create(238, 345, object69clutch2); global.posizione -=1; }

if  (daje == 4) and global.posizione==2
{ instance_create(190, 380, object69clutch2); global.posizione -=1; }

if  (daje == 4) and global.posizione==1
{ instance_create(238, 415, object69clutch2); global.posizione -=1; }

if  (daje == 4) and global.posizione==0
{ instance_create(190, 450, object69clutch2); global.posizione -=1; }


 if (daje == 5) and global.posizione==4 //sesto oggetto
{ instance_create(190, 310, object70defens2); global.posizione -=1; }

if (daje == 5) and  global.posizione==3
{ instance_create(238, 345, object70defens2); global.posizione -=1; }

if (daje == 5) and  global.posizione==2
{ instance_create(190, 380, object70defens2); global.posizione -=1; }

if (daje == 5) and  global.posizione==1
{ instance_create(238, 415, object70defens2); global.posizione -=1; }

if (daje == 5) and  global.posizione==0
{ instance_create(190, 450, object70defens2); global.posizione -=1; }


if (daje == 6) and global.posizione==4  //settimo oggetto
{ instance_create(190, 310, object71power2); global.posizione -=1; }

if (daje == 6) and global.posizione==3
{ instance_create(238, 345, object71power2); global.posizione -=1; }

if (daje == 6) and  global.posizione==2
{ instance_create(190, 380, object71power2); global.posizione -=1; }

if (daje == 6) and global.posizione==1
{ instance_create(238, 415, object71power2); global.posizione -=1; }

if (daje == 6) and global.posizione==0
{ instance_create(190, 450, object71power2); global.posizione -=1; }


if (daje == 7) and global.posizione==4 //ottavo oggetto
{ instance_create(190, 310, object72pride2); global.posizione -=1; }

if (daje == 7) and global.posizione==3
{ instance_create(238, 345, object72pride2); global.posizione -=1; }

if (daje == 7) and  global.posizione==2
{ instance_create(190, 380, object72pride2); global.posizione -=1; }

if (daje == 7) and  global.posizione==1
{ instance_create(238, 415, object72pride2); global.posizione -=1; }

if (daje == 7) and  global.posizione==0
{ instance_create(190, 450, object72pride2); global.posizione -=1; }

 
if (daje == 8) and global.posizione==4 //nono oggetto
{ instance_create(190, 310, object73stamina2); global.posizione -=1; }

if (daje == 8) and global.posizione==3
{ instance_create(238, 345, object73stamina2); global.posizione -=1; }

if (daje == 8) and global.posizione==2
{ instance_create(190, 380, object73stamina2); global.posizione -=1; }

if (daje == 8) and global.posizione==1
{ instance_create(238, 415, object73stamina2); global.posizione -=1; }

if (daje == 8) and global.posizione==0
{ instance_create(190, 450, object73stamina2); global.posizione -=1; }


if (daje == 9) and global.posizione==4 //decimo oggetto
{ instance_create(190, 310, object74steal2); global.posizione -=1; }

if (daje == 9) and global.posizione==3
{ instance_create(238, 345, object74steal2); global.posizione -=1; }

if (daje == 9) and global.posizione==2
{ instance_create(190, 380, object74steal2); global.posizione -=1; }

if (daje == 9) and global.posizione==1
{ instance_create(238, 415, object74steal2); global.posizione -=1; }

if (daje == 9) and global.posizione==0
{ instance_create(190, 450, object74steal2); global.posizione -=1; }


Il problema del codice è che crea 5 oggetti uguali per precisione si tratta dell'objectpride2 in tutte le posizioni.

Girovagando per internet ho trovato un codice che sembra adatto per quello che voglio fare però ve lo mostro in seguito per non fare confusione con il codice scritto qui sopra.

Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: bloccare creazione di oggetto in posizione già occupata

Messaggio da doom13 »

Il problema dovrebbe essere nel momento in cui scali la posizione.
Tu hai tutte if una dietro l'altra, quando per esempio si verifica la prima scali la posizione di 1 il che rende verificata la condizione successiva che crea una nuova istanza e scala la posizione, di conseguenza si verifica la condizione successiva e così via per tutte le if con lo stesso valore di daje.
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

Avatar utente
pacmino
GMI Guru
Messaggi: 2569
Iscritto il: 03/06/2009, 16:38
Specialità: Scazzato cronico
Uso: GM:Studio 2
Località: Seconda stella a destra questo è il cammino e poi dritto, fino al mattino...
Contatta:

Re: bloccare creazione di oggetto in posizione già occupata

Messaggio da pacmino »

ma tu vuoi una cosa così? (vedi gmk)
Allegati
test.gmk
(10.13 KiB) Scaricato 159 volte
Immagine

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

Re: bloccare creazione di oggetto in posizione già occupata

Messaggio da sfigatto »

Esatto pacmino cercavo proprio una cosa come quella, ma che faccia apparire 5 oggetti tra una scelta di 10.

Comunque ho modificato ulteriormente il codice passatomi da doom13 ed ora funziona perfettamente.
Il problema dovrebbe essere nel momento in cui scali la posizione.
Tu hai tutte if una dietro l'altra, quando per esempio si verifica la prima scali la posizione di 1 il che rende verificata la condizione successiva che crea una nuova istanza e scala la posizione, di conseguenza si verifica la condizione successiva e così via per tutte le if con lo stesso valore di daje.


Anche io come Doom13 pensavo che il problema fosse questo.
Così nel create dell'oggetto che cliccando genera tutte queste istanze random ho inserito delle nuove variabili global
le ho chiamate global.blocco = 0
ognuno dei 10 oggetti che vengono generati random ha una sua variabile blocco personale.
quindi ci sono

global.blocco1 = 0
global.blocco2 = 0
global.blocco3 = 0
etc etc sino ad arrivare a 10

Il codice che doveva creare le istanze era :

Codice: Seleziona tutto


if(daje == 0) and global.posizione==4
{ instance_create(190, 310, object66rebound2); global.posizione -=1; } 

il codice per ogni oggetto veniva ripetuto 5 volte cambiando la posizione e il numero della variaible global.posizione.

è stato modificato ed è diventato così:

Codice: Seleziona tutto

if(daje == 0) and global.posizione == 4 and global.blocco1 = 0 //ho aggiunto la global.blocco = 0 per essere vera 
{ instance_create(190, 310, object66rebound2); global.posizione -=1; global.blocco1 = 1 } //poi la varibaile scatta ad 1 non dando la possiiblità alle altre 4 posizione di essere vera.
Anche in questo caso il codice viene ripetuto 5 volte cambiando solo la posizione ed il numero della variabile global della posizione


Inoltre in questo punto ho aggiunto randomize() perchè mi dava sempre la stessa sequenza di oggetti:

Codice: Seleziona tutto

while(ok == 0)
{
randomize()
  daje = irandom_range(0, 9);
  if(lista[daje] == 0)
  {
    ok = 1;
  }
}



Il tutto funziona perfettamente. Non ci avrei cavato le gambe senza il vostro aiuto, grazie di cuore a tutti e soprattutto a doom13.

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

Re: bloccare creazione di oggetto in posizione già occupata

Messaggio da sfigatto »

Come detto sopra il mio problema è stato risolto però volevo porre alla vostra attenzione questo codice che ho trovato in rete.
dovrebbe fare in molte meno righe lo stesso lavoro che fa il codice che sto usando.

Codice: Seleziona tutto


objList = ds_list_create();
chosen = null;
i = 0;
 
randomize()
 
while(i<4){
   chosen = choose (object1, object2, object3 , object4, object5, object6, object7, object,8);
   //-1 means that this value (object) is not in the list
   if(ds_list_find_value(objList, chosen) == -1){
      instance_create (10,200, chosen);
      ds_list_add(objList, chosen);
      i++;
   }
}
il problema è che non comprendo bene il codice.


Non dovrei fare in create una ds_list_create()?
un qualcosa di simile?

Codice: Seleziona tutto


objlist=ds_list_create()
ds_list_add(objlist,object1)
ds_list_add(objlist,object2)
ds_list_add(objlist,object3)
ds_list_add(objlist,object4)
ds_list_add(objlist,object5)
ds_list_add(objlist,object6)
ds_list_add(objlist,object7)
ds_list_add(objlist,object8)
 


e soprattutto se provo ad usarlo se clicco sopra l'oggetto che dovrebbe far partire il tutto mi segnala questo errore:

Push :: Execution Error - Variable Get -1.null(100036, -1)
at gml_Object_object91_LeftButtonPressed_1 (line 2) - chosen = null;

Che variabile è null? non l'ho trovato da nessuna parte.

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 114 ospiti