Array e limiti (RISOLTO)

Hai una curiosità o un problema con Game Maker? Domanda e ti sarà risposto!
Rispondi
Avatar utente
xellos92
Newbie
Messaggi: 6
Iscritto il: 04/10/2017, 11:07
Uso: GameMaker 8
Contatta:

Array e limiti (RISOLTO)

Messaggio da xellos92 »

Salve ragazzi, vi espongo il mio problema... ho creato un oggetto "player" nel mio gioco, e ho inserito un sistema di registrazione degli step di questo oggetto "player" lungo il corso del gioco: ogni volta che cammina, salta, corre, cambia sprite, etc...
Ho fatto in modo che, se premo il tastino R, il tempo torna indietro, quindi ripercorrendo gli step fatti, ma a ritroso e non registrandone di nuovi. Tutto questo con il sistema degli array. Ora, come ben sapete, il limite di un array è di 32000 step. Ma a me non serve di registrare tutti questi step! solo 500 al massimo. Esiste un modo in Game Maker di eliminare gli step più vecchi di 500 per esempio e aggiungerne di nuovi contemporaneamente? Per farvi capire meglio vi lascio il mio codice:
if !(variable_local_exists("Data")) {
Data[0,0] = 0;
Data[1,0] = 0;
Data[2,0] = 0;
Size = 0;
rewind = 0;
}

if (rewind) {
image_speed = -0.25;
if (Size > 0) {
Size -= 1;
x = Data[0,Size];
y = Data[1,Size];
sprite_index = Data[2,Size];
}
}
else {
image_speed = 0.25;
Data[0,Size] = x;
Data[1,Size] = y;
Data[2,Size] = sprite_index;
Size += 1;
}
if (keyboard_check(ord('R'))) { rewind=1; } else { rewind=0; }
In questo modo se rewind non è attivo, il gioco registra costantemente la posizione x, y e lo sprite_index del player. Ma se premo rewind non registra più, elimina gli step più recenti registrati e quindi torna indietro nel tempo. Ma vorrei mettere un limite di un tot di step da registrare... come posso fare?
Ultima modifica di xellos92 il 22/10/2017, 0:26, modificato 1 volta in totale.

Avatar utente
civic71
GMI Advanced
Messaggi: 2210
Iscritto il: 23/10/2003, 17:31
Specialità: Risotto con zucchine
Uso: GM:Studio 1.4 Pro
Località: Jesolo (venezia)
Contatta:

Re: Array e limiti

Messaggio da civic71 »

Dovrebbe bastare un : if (Size<1){ Size=500; } ed un if (Size>500){ Size=1; }

Codice: Seleziona tutto

if (rewind) {
image_speed = -0.25;
if (Size > 0) {
Size -= 1;
x = Data[0,Size];
y = Data[1,Size];
sprite_index = Data[2,Size];
if  (Size<1){ Size=500; }
}
}
else {
image_speed = 0.25;
Data[0,Size] = x;
Data[1,Size] = y;
Data[2,Size] = sprite_index;
Size += 1;
if  (Size>500){ Size=1; }
}

Avatar utente
xellos92
Newbie
Messaggi: 6
Iscritto il: 04/10/2017, 11:07
Uso: GameMaker 8
Contatta:

Re: Array e limiti

Messaggio da xellos92 »

Ci provo e ti faccio sapere =) grazie per la risposta veloce!
Edit: purtroppo non funziona... riavvolge all'infinito o mi crea glitch strani al personaggio...
Sostanzialmente mi basta accumulare solo i 10 secondi (500 step) prima della mia posizione, non di più. In modo tale da poter riavvolgere il tempo fino appunto al limite imposto. Così quando ho riavvolto fino allo step 0, non posso riavvolgere più e posso solo accumulare step... non so se mi sono spiegato bene

Avatar utente
ball-man_3000
Moderatore
Messaggi: 1263
Iscritto il: 26/08/2009, 13:42
Specialità: Contare con le dita
Uso: GM:Studio 2
Località: Bologna
Contatta:

Re: Array e limiti

Messaggio da ball-man_3000 »

Invece di usare un array usa una ds list(o 3 ds list se ti servono quelle 3 dati, invece di fare una matrice), dove è possibile aggiungere e rimuovere elementi arbitrariamente. In questo modo ti basta cancellare il più vecchio ed aggiugere il più nuovo, ed avrai in memoria i soli 500 che ti servono che continuano a rinnovarsi. Trovi tutta la documentazione qui:

https://docs.yoyogames.com/source/dadio ... s%20lists/
Quattro corde sono meglio

Avatar utente
civic71
GMI Advanced
Messaggi: 2210
Iscritto il: 23/10/2003, 17:31
Specialità: Risotto con zucchine
Uso: GM:Studio 1.4 Pro
Località: Jesolo (venezia)
Contatta:

Re: Array e limiti

Messaggio da civic71 »

Bhè si che va all' infinito.
Quindi ora amettiamo che il tuo ultimo Size ( prima di premere R ) è il n°300
Ciò significa che quando andrai indietro lo potrai fare fino al numero 301.
Il codice qui sotto non l'ho testato ma se non funziona dovrebbe farti capire almeno la base, per poi continuarlo da solo ( tra l'altro ho spostato anche la posizione di if  (Size<1){ Size=500; } :

Codice: Seleziona tutto

ilMioUltimoSizePrimaDiPremereR=300;
if (rewind) {
image_speed = -0.25;
if ((Size > 0)&&(Size!=ilMioUltimoSizePrimaDiPremereR)) {
Size -= 1;
 if  (Size<1){ Size=500; }
x = Data[0,Size];
y = Data[1,Size];
sprite_index = Data[2,Size];
}
}
else {
image_speed = 0.25;
Data[0,Size] = x;
Data[1,Size] = y;
Data[2,Size] = sprite_index;
Size += 1;
if  (Size>500){ Size=1; }
ilMioUltimoSizePrimaDiPremereR=Size;
}


Avatar utente
xellos92
Newbie
Messaggi: 6
Iscritto il: 04/10/2017, 11:07
Uso: GameMaker 8
Contatta:

Re: Array e limiti

Messaggio da xellos92 »

Esatto! quello che cerco io è una cosa come quella che hai scritto tu, ball-man_3000... ma ancora non sono molto bravo a tradurlo in codice =/
civic71, il codice che mi hai scritto tu è sempre un array o una ds_list? Perché l'altro utente ha descritto perfettamente quello che cercavo.

Avatar utente
ball-man_3000
Moderatore
Messaggi: 1263
Iscritto il: 26/08/2009, 13:42
Specialità: Contare con le dita
Uso: GM:Studio 2
Località: Bologna
Contatta:

Re: Array e limiti

Messaggio da ball-man_3000 »

Civic ti sta proponendo una soluzione con il metodo array che già stai usando. Non sono stato a controllare il suo codice ma come dice anche lui, se non dovesse funzionare dovrebbe perlomeno fornirti un'idea di base. Ciò che ti propongo io è la soluzione più intuitiva sotto alcuni punti di vista della ds list. Capisco che magari ancora tu debba ambientarti un po', ma la documentazione è abbastanza chiara sul suo funzionamento(linkata lì sopra appunto). Ha delle funzioni apposite per essere creata, per aggiungere e rimuovere elementi. Fai qualche tentativo, magari partendo da cose più semplici tipo crearla ed aggiungere qualche elemento e prosegui per piccoli passi. Vedrai che alla fine ne verrai fuori.
Quattro corde sono meglio

Avatar utente
xellos92
Newbie
Messaggi: 6
Iscritto il: 04/10/2017, 11:07
Uso: GameMaker 8
Contatta:

Re: Array e limiti

Messaggio da xellos92 »

Ok grazie dei preziosi consigli ^^ se ne vengo a capo vi tengo aggiornati qui se volete
Edit: niente... ci provo da un giorno filato ma non riesco affatto...
Edit2: son riuscito a convertire il mio array in una ds_grid ma adesso il problema che si verifica è che, ovviamente, mi registra oltre i limiti della griglia, quindi nel vuoto, e i dati si perdono... quindi quando riavvolgo l'oggetto scompare e riappare solo quando ritrova i dati nella griglia.
if !(variable_local_exists("grid")) {
grid=ds_grid_create(4,600);
ds_grid_set(grid,0,0,0);
ds_grid_set(grid,1,0,0);
ds_grid_set(grid,2,0,0);
ds_grid_set(grid,3,0,0);
Size=0;
}

if (global.rewind) {
if (Size > 1) {
Size -= 1;
x=ds_grid_get(grid,0,Size);
y=ds_grid_get(grid,1,Size);
sprite_index=ds_grid_get(grid,2,Size);
buttonpressed=ds_grid_get(grid,3,Size);
}
}
else {
Size += 1;
if global.rewtime=0 {Size=0;}
ds_grid_set(grid,0,Size,x);
ds_grid_set(grid,1,Size,y);
ds_grid_set(grid,2,Size,sprite_index);
ds_grid_set(grid,3,Size,buttonpressed);
}
Questo è quanto son riuscito a fare. Ci sto impazzendo con sto script... che odio! ma perché non si può semplicemente slittare tutti i valori di uno quando raggiungo il limite? ç___ç


EDIT3(DEFINITIVO):
Son riuscito a risolvere tutto! vi allego il codice per chi volesse capire come si fa =) se volete potete anche chiudere il post, siete stati tutti molto gentili, grazie di cuore civic e ball-man!
if !(variable_local_exists("grid")) {
grid=ds_grid_create(3,502);
Size=-1;
}
if (global.rewind)
{
Size -= 1;
if Size<0 {Size=501;}
x=ds_grid_get(grid,0,Size);
y=ds_grid_get(grid,1,Size);
sprite_index=ds_grid_get(grid,2,Size);
}
else {
Size += 1;
if Size>501 {Size=0;}
ds_grid_set(grid,0,Size,x);
ds_grid_set(grid,1,Size,y);
ds_grid_set(grid,2,Size,sprite_index);
}

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 153 ospiti