instanze che

Hai una curiosità o un problema con Game Maker? Domanda e ti sarà risposto!
Rispondi
Avatar utente
broli
Membro
Messaggi: 229
Iscritto il: 11/10/2013, 11:42
Specialità: cheater
Uso: GM:Studio 1.4 Pro
Contatta:

instanze che

Messaggio da broli »

salve,
continuo a esercitarmi con le istanze per riparare le mie lacune che sono ancora troppe.
dopo ore e ore di sbattimento sono arrivato a questo punto del codice che credo sia il più vicino a ciò che voglio ottenere.
vorrei creare un loop
Spero che leggendo il codice capiate.

Codice: Seleziona tutto

var newInst, idleInst, i = 0{ 
if firstBlock { 
firstBlock = false
newInst = instance_create(320,640,block)}

if canCreate{
canCreate = false
idleInst[i]  = instance_create(newInst.x+64,newInst.y,block); 
}

idleInst[i] = newInst 

if idleInst[i] = newInst {
canCreate = true;
i += 1
}
}

BotaniciTraffici
Membro attivo
Messaggi: 348
Iscritto il: 31/01/2014, 12:38
Specialità: Programmazione
Uso: GM:Studio 1.4 Master
Contatta:

Re: instanze che

Messaggio da BotaniciTraffici »

Ciao Broli. Ho letto il messaggio e ho capito solo che vuoi fare un loop. Ma un loop di cosa, quello che vuoi ottenere non lo dici... Sarà difficile anche per altri risponderti. Credo.

Poi ho letto la prima riga del codice e ho capito che non sei in grado di dichiarare una serie di variabili. E non è un male questo, ci mancherebbe, tutti sono partiti da zero.

Ho continuato a leggere il codice e ho capito che stai annegando e hai bisogno un salvagente al più presto. :lol:

Io te lo lancio volentieri, per afferrarlo ti basta rispondere bene a questa domanda: cosa vuoi fare?

Aspetto con ansia ;)

Avatar utente
broli
Membro
Messaggi: 229
Iscritto il: 11/10/2013, 11:42
Specialità: cheater
Uso: GM:Studio 1.4 Pro
Contatta:

Re: instanze che

Messaggio da broli »

ciao Botanici,
lo so che sono a zero, ma so qualcosina qui e qualcosina la, metto insieme il tutto e viene fuori qualcosa di bello :hum:
quello che voglio ottenere è che l 'istanza idleInst diventi l' instanza newInst , questo non so se sono riuscito a spiegarlo bene.
in questo modo quando creo la nuova instanza idleInst prende le coordinate della vecchia istanza idleInst per sapere dovere crearla.

BotaniciTraffici
Membro attivo
Messaggi: 348
Iscritto il: 31/01/2014, 12:38
Specialità: Programmazione
Uso: GM:Studio 1.4 Master
Contatta:

Re: instanze che

Messaggio da BotaniciTraffici »

broli ha scritto:ciao Botanici,
lo so che sono a zero, ma so qualcosina qui e qualcosina la, metto insieme il tutto e viene fuori qualcosa di bello :hum:
quello che voglio ottenere è che l 'istanza idleInst diventi l' instanza newInst , questo non so se sono riuscito a spiegarlo bene.
in questo modo quando creo la nuova instanza idleInst prende le coordinate della vecchia istanza idleInst per sapere dovere crearla.
Fantastico. Il codice che ti serve è composta da una riga che scrivi quando vuoi creare la nuova istanza:

Codice: Seleziona tutto

newInst = instance_create(x,y,oggetto_che_vuoi_creare);
Tutto qui. Così crei una nuova istanza dell'oggetto oggetto_che_vuoi_creare e gli assegni l'indice newInst. In questo caso la nuova istanza viene creata nel punto esatto in cui si trova la vecchia istanza.

Da questo momento in poi puoi cambiare qualsiasi variabile di newInst anche dall'interno del codice di idleInst scrivendo (ad esempio):

Codice: Seleziona tutto

newInst.variabile=valore;
Se vuoi puoi anche eliminare la vecchia istanza aggiungendo semplicemente instance_destroy(); al primo codice che ti ho scritto .

Avatar utente
broli
Membro
Messaggi: 229
Iscritto il: 11/10/2013, 11:42
Specialità: cheater
Uso: GM:Studio 1.4 Pro
Contatta:

Re: instanze che

Messaggio da broli »

non ho capito bene.
intendi questo?

Codice: Seleziona tutto

for (i=0;i<n;i++) {
idleInst[i]  = instance_create(newInst.x+64*i,newInst.y,block); }

lo so che in questo modo ottengo lo stesso risultato.

ma appunto come ho scritto nell 'open post, mi sto esercitando con le istanze.

BotaniciTraffici
Membro attivo
Messaggi: 348
Iscritto il: 31/01/2014, 12:38
Specialità: Programmazione
Uso: GM:Studio 1.4 Master
Contatta:

Re: instanze che

Messaggio da BotaniciTraffici »

broli ha scritto:non ho capito bene.
intendi questo?

Codice: Seleziona tutto

for (i=0;i<n;i++) {
idleInst[i]  = instance_create(newInst.x+64*i,newInst.y,block); }

lo so che in questo modo ottengo lo stesso risultato.

ma appunto come ho scritto nell 'open post, mi sto esercitando con le istanze.
Il senso e il funzionamento del for sono giusti, ma se ho capito bene tu vuoi che idleInst diventino newInst. Leggendo il codice che hai scritto avviene il contrario: viene creata una nuova istanza dell'oggetto block in posizione newInst.x+64 newInst.y

Non credo tu voglia questo.

Domanda: tu vuoi che ad un certo punto ogni istanza ne crei un'altra nella sua stessa posizione?

Avatar utente
broli
Membro
Messaggi: 229
Iscritto il: 11/10/2013, 11:42
Specialità: cheater
Uso: GM:Studio 1.4 Pro
Contatta:

Re: instanze che

Messaggio da broli »

ma se ho capito bene tu vuoi che idleInst diventino newInst
esatto, a me pare che il codice che ho scritto vada bene per quello che voglio fare ma mi da questo errore

Codice: Seleziona tutto

Push :: Execution Error - Variable Get -7.newInst(100003, -1)
 at gml_Object_CTRL_StepNormalEvent_1 (line 8) - idleInst[i]  = instance_create(newInst.x+64,newInst.y,block); 
(newInst.x+numero qualsiasi, newInst.y+numero qualsiasi,obj)
(newInst.x+0, newInst.y+0,obj) così no perchè devo vedere se vengono create le istanze successive.

BotaniciTraffici
Membro attivo
Messaggi: 348
Iscritto il: 31/01/2014, 12:38
Specialità: Programmazione
Uso: GM:Studio 1.4 Master
Contatta:

Re: instanze che

Messaggio da BotaniciTraffici »

broli ha scritto:
ma se ho capito bene tu vuoi che idleInst diventino newInst
esatto, a me pare che il codice che ho scritto vada bene per quello che voglio fare ma mi da questo errore

Codice: Seleziona tutto

Push :: Execution Error - Variable Get -7.newInst(100003, -1)
 at gml_Object_CTRL_StepNormalEvent_1 (line 8) - idleInst[i]  = instance_create(newInst.x+64,newInst.y,block); 
A te il codice sembra andare bene, io ti ho scritto già prima che è sbagliato perché hai invertito le istanze. Anche GM dice che è sbagliato... Forse, forse il codice è veramente sbagliato? ;)

Il tuo codice sarebbe giusto se invece di così:

Codice: Seleziona tutto

for (i=0;i<n;i++) {
idleInst[i]  = instance_create(newInst.x+64*i,newInst.y,block); }
Ci fosse scritto così:

Codice: Seleziona tutto

for (i=0;i<n;i++) {
newInst[i]  = instance_create(idleInst.x+64*i,idleInst.y,block); }
Ancora adesso non ho capito perché vuoi per forza usare un ciclo for quando quello che chiedi è creare istanze di un oggetto al posto di altre istanze. O non ho capito niente io, oppure ti riscrivo lo stesso codice che ho scritto nel mio primo messaggio, questo e solo questo andrebbe usato per fare quello che chiedi:

Codice: Seleziona tutto

newInst = instance_create(x,y,oggetto_che_vuoi_creare);
instance_destroy();

Avatar utente
broli
Membro
Messaggi: 229
Iscritto il: 11/10/2013, 11:42
Specialità: cheater
Uso: GM:Studio 1.4 Pro
Contatta:

Re: instanze che

Messaggio da broli »

ci sono riuscito :asd:
era di una facilità assurda
ringrazio botanici per la pazienza infinita :cappa:
metto il codice completo di quello che volevo fare

Codice: Seleziona tutto

randomize()

var newInst, idleInst, i = 0
if firstBlock { 
firstBlock = false
newInst = instance_create(320,640,block)}


if canCreate{
canCreate = false
for (i=0;i<10;i++) {
direzione = choose(1,2,3,4)
switch direzione{
case 1: idleInst[i]  = instance_create(newInst.x+64,newInst.y,block); break
case 2: idleInst[i]  = instance_create(newInst.x-64,newInst.y,block); break
case 3: idleInst[i]  = instance_create(newInst.x,newInst.y+64,block); break
case 4: idleInst[i]  = instance_create(newInst.x,newInst.y-64,block); break
}
newInst = noone
newInst = idleInst[i] 
}
}

Avatar utente
broli
Membro
Messaggi: 229
Iscritto il: 11/10/2013, 11:42
Specialità: cheater
Uso: GM:Studio 1.4 Pro
Contatta:

Re: instanze che

Messaggio da broli »

Riapro questa discussione perchè non capisco come mai inserendo l 'alarm nel codice sopra che ho poi ampliato e migliorato, gamemaker mi da errore.
L alarm nel codice mi restituisce true a canCreate e quindi mi dovrebbe far ripartire il loop ogni tot secondi.
Se invece dell alarm metto direttamente canCreate = true nel step event il codice funziona ma non c'è una pausa tra la creazione di istanze.
FATAL ERROR in
action number 1
of Step Event0
for object CTRL:
Push :: Execution Error - Variable Get 100005.y(1, -1)
at gml_Object_CTRL_StepNormalEvent_1 (line 16) - case 4: instance_create(newInst.x,newInst.y-64,block); idleInst = instance_create(newInst.x,newInst.y-128,block) ; break

ecco il codice

Codice: Seleziona tutto

randomize()

if firstBlock { 
firstBlock = false
newInst = instance_create(320,640,block)}

if canCreate{
canCreate = false
for (i=0;i<1;i++) {
direzione = choose(1,2,3,4)
switch direzione{
case 1: instance_create(newInst.x+64,newInst.y,block); idleInst[i] = instance_create(newInst.x+128,newInst.y,block) ; break 
case 2: instance_create(newInst.x-64,newInst.y,block); idleInst[i] = instance_create(newInst.x-128,newInst.y,block) ; break 
case 3: instance_create(newInst.x,newInst.y+64,block); idleInst[i] = instance_create(newInst.x,newInst.y+128,block) ; break 
case 4: instance_create(newInst.x,newInst.y-64,block); idleInst[i] = instance_create(newInst.x,newInst.y-128,block) ; break 
}

if (idleInst[i].x > 576) || (idleInst[i].y > 896) || (idleInst[i].x < 64) || (idleInst[i].y < 64){
with (idleInst[i]) { instance_destroy() }
test0 = false
//canCreate = true
alarm[0] = 15
} else test0 = true
if test0 {
test0 = false
newInst = idleInst[i] 
//canCreate = true // se invece metto true a canCreate senza passare per l'alarm il codice funziona
alarm[0] = 15// mentre con l'alarm non funziona
}
}
}

BotaniciTraffici
Membro attivo
Messaggi: 348
Iscritto il: 31/01/2014, 12:38
Specialità: Programmazione
Uso: GM:Studio 1.4 Master
Contatta:

Re: instanze che

Messaggio da BotaniciTraffici »

Intanto ti faccio il favore di riformattare il codice sopra perché scritto così com'è non si capisce una cippa ;)

Ora io e sicuramente qualcun altro ci possiamo dare un'occhiata, prima era impossibile (non ti ho aggiunto i punti e virgola per rispettare i tuoi credo religiosi ;)

Codice: Seleziona tutto

randomize()

if (firstBlock)
{ 
    firstBlock = false
    newInst = instance_create(320,640,block)
}

if (canCreate)
{
    canCreate = false
    for (i=0;i<1;i++)
    {
        direzione = choose(1,2,3,4)
        switch (direzione)
        {
            case 1: instance_create(newInst.x+64,newInst.y,block); idleInst[i] = instance_create(newInst.x+128,newInst.y,block) ; break 
            case 2: instance_create(newInst.x-64,newInst.y,block); idleInst[i] = instance_create(newInst.x-128,newInst.y,block) ; break 
            case 3: instance_create(newInst.x,newInst.y+64,block); idleInst[i] = instance_create(newInst.x,newInst.y+128,block) ; break 
            case 4: instance_create(newInst.x,newInst.y-64,block); idleInst[i] = instance_create(newInst.x,newInst.y-128,block) ; break 
        }

        if (idleInst[i].x > 576) || (idleInst[i].y > 896) || (idleInst[i].x < 64) || (idleInst[i].y < 64)
        {
            with (idleInst[i]) { instance_destroy() }
            test0 = false
            //canCreate = true
            alarm[0] = 15
        }
        else { test0 = true }
    
        if (test0)
        {
            test0 = false
            newInst = idleInst[i] 
            //canCreate = true // se invece metto true a canCreate senza passare per l'alarm il codice funziona
            alarm[0] = 15// mentre con l'alarm non funziona
        }
    }
}

BotaniciTraffici
Membro attivo
Messaggi: 348
Iscritto il: 31/01/2014, 12:38
Specialità: Programmazione
Uso: GM:Studio 1.4 Master
Contatta:

Re: instanze che

Messaggio da BotaniciTraffici »

Ok ho trovato un problema.

Leggi qui e dai un occhio al codice che ti riporto sotto.

Con il primo if tu fai dei controlli sulla posizione dell'istanza, se i controlli danno esito positivo elimini l'istanza stessa e setti test0 come false e l'alrm a 15. Poi però immediatamente dopo controlli (con l'else) se lo stesso if ti abbia dato risposta negativa, ma questo controllo non può avvenire in quanto poco prima hai eliminato l'istanza!

P.S. C'è anche un altro grave errore, ma prima forse è il caso che risolvi questo...

Codice: Seleziona tutto

if (idleInst[i].x > 576) || (idleInst[i].y > 896) || (idleInst[i].x < 64) || (idleInst[i].y < 64)
        {
            with (idleInst[i]) { instance_destroy() }
            test0 = false
            //canCreate = true
            alarm[0] = 15
        }
        else { test0 = true }

Avatar utente
broli
Membro
Messaggi: 229
Iscritto il: 11/10/2013, 11:42
Specialità: cheater
Uso: GM:Studio 1.4 Pro
Contatta:

Re: instanze che

Messaggio da broli »

il codice funziona anche quando l'istanza esce fuori dal limite di coordinate che gli ho dato.

idleInsti viene distrutta e da canCreate = true e ricominica il loop e fa idleInst = instance_create(newInst.x,newInst.y.block).

questo non da problemi. darebbe errore se fosse distrutto newInst.

l'altro errore qual'è? :?

comunque i punti e virgola un po alla volta sto cominciando a inserirli :lol:

BotaniciTraffici
Membro attivo
Messaggi: 348
Iscritto il: 31/01/2014, 12:38
Specialità: Programmazione
Uso: GM:Studio 1.4 Master
Contatta:

Re: instanze che

Messaggio da BotaniciTraffici »

broli ha scritto:il codice funziona anche quando l'istanza esce fuori dal limite di coordinate che gli ho dato.
Ti sembro un deficiente? Mi pare di no, mi auguro di no, probabilmente no, ma le tue risposte me lo fanno pensare. Sei in gamba, si vede che ci metti un sacco di impegno e forza di volontà, ma non rovinare tutto dicendomi che il codice che ti ho appena corretto a te risultava giusto.
Il codice funziona quando l'istanza "esce fuori dal limite delle coordinate" perché il blocco di istruzioni nell'if non viene eseguito e quindi l'istanza non si distrugge. Ti funziona in quel caso, nel caso contrario ti da errore... esattamente l'errore che hai postato. Anderstend?
broli ha scritto:l'altro errore qual'è? :?
L'altro errore te lo segnala Game Maker una volta che hai sistemato questo.
broli ha scritto:comunque i punti e virgola un po alla volta sto cominciando a inserirli
Credevo avessi fatto un voto al santo protettore dei gabinetti: San Itario

Avatar utente
broli
Membro
Messaggi: 229
Iscritto il: 11/10/2013, 11:42
Specialità: cheater
Uso: GM:Studio 1.4 Pro
Contatta:

Re: instanze che

Messaggio da broli »

Il codice funziona quando l'istanza "esce fuori dal limite delle coordinate" perché il blocco di istruzioni nell'if non viene eseguito e quindi l'istanza non si distrugge. Ti funziona in quel caso, nel caso contrario ti da errore
non anderstend. se così fosse il programma non partirebbe nemmeno perchè la prima istanza viene creata all' interno delle coordinate.
l' istanza si muove sempre all'interno dei limiti che gli ho dato e non fuori. se esce rientra. però succede raramente che quando esce dal limite di coordinate mi da errore.
per esempio il programma ora ha girato per quasi 2 minuti e le istanze sono state create dentro il limite. quando sono uscite dal limite sono state distrutte e ricreate all'interno. poi all'improvviso mi da questo errore

Codice: Seleziona tutto

FATAL ERROR in
action number 1
of  Step Event0
for object CTRL:

Push :: Execution Error - Variable Get 107425.y(1, -1)
 at gml_Object_CTRL_StepNormalEvent_1 (line 14) - case 2: instance_create(newInst.x-64,newInst.y,block); idleInst[i] = instance_create(newInst.x-128,newInst.y,block) ; break 

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 40 ospiti