Pagina 1 di 1

Conta passi

Inviato: 03/08/2019, 17:45
da Kimera_V2
Salve ragazzi come posso realizare un semplice conta passi in un rpg?
Se il pg si sposta di 3 caselle (32x32) sono 3 passi fatti e cosi via.
Non mi viene in mente niente per realizarlo spero in un vostro aiuto.

Re: Conta passi

Inviato: 10/08/2019, 12:11
da Alv
Ciao. Beh, dipende come è stato implementato il movimento del personaggio. Dovresti usare una variabile globale, e mettere nel punto giusto del codice qualcosa come:

Codice: Seleziona tutto

global.conta_passi+=1;

Re: Conta passi

Inviato: 26/09/2019, 22:33
da Kimera_V2
Grazie per la risposta, per muovere il player uso questo codice:
in step event

Codice: Seleziona tutto

if (place_snapped(32, 32))
{
   hspeed = 0;
   vspeed = 0;
if (key_dx) 
   {
     hspeed = 4;
     vspeed = 0;
     global.p_passi+=1;
   }
   
if (key_sx)
   {
     hspeed = -4;
     vspeed = 0;
     global.p_passi+=1;
   }
   
if (key_su)
   {
     hspeed = 0;
     vspeed = -4;
     global.p_passi+=1;
   }
   
if (key_giu)
   { 
     hspeed = 0;
     vspeed = 4;
     global.p_passi+=1;
   }
}
in collisione con il blocco (blocco settato solido)

Codice: Seleziona tutto

if (place_snapped(32, 32))
{
   hspeed = 0;
   vspeed = 0;
   global.p_passi-=1;
}
Il contapassi funziona alla grande, ho solo un problema con le collisioni di object in movimento, cioè se un npc si muove e collide con il player i due si bloccano, come posso fare per risolvere?
Le npc usa lo stesso codice del player per muoversi.

Re: Conta passi

Inviato: 27/09/2019, 17:17
da Alv
Prima di impostare hspeed o vspeed su pressione del tasto, dovresti verificare se la posizione è libera (ad esempio la posizione x+32, se il giocatore si vuole muovere verso destra). Questo può essere fatto con una funzione di rilevamento collisioni. Il problema che potrebbe porsi è se entrambi i personaggi (giocatore e npc) decidono di spostarsi contemporaneamente verso una cella che a entrambi sembra libera. Anche in quel caso si bloccherebbero!

Quindi, se vorresti optare per una soluzione sicura senza cambiare troppo il codice, dovresti utilizzare un oggetto temporaneo per "etichettare" la cella che il giocatore ha selezionato come destinazione. In questo modo, l'npc vedrà quell'oggetto e capirà che la cella è bloccata.

Potresti associare ad ogni personaggio un oggetto di questo tipo (invisibile), salvarti l'id per controllarlo. Quando premi per esempio freccia a destra, l'oggetto farà uno scatto di 32 pixel (cioè occuperà subito la cella destinazione), mentre il personaggio ci metterà qualche step per raggiungere la cella successiva (in base alla velocità).

Re: Conta passi

Inviato: 29/09/2019, 13:39
da Kimera_V2
Niente non vuole saperne di funzionare :(
I passi che ho fatto sono questi:
- creato l'object o_ck_cella per il controllo della cella
- alla pressione del tasto sposto l'object o_ck_cella nella direzione in cui deve spostarsi il player
-l'object o_ck_cella controlla se la cella è occupata con la funzione collision_rectangle
-se la cella è occupata il player non si muove se non lo è si muove
Conclusioni a volte funziona a volte no :(
credo che il problema sta nel fatto che se l object non è allineato con la griglia il controllo non funziona.

Re: Conta passi

Inviato: 30/09/2019, 10:10
da Scario
Non so se ho ben capito il problema: il controllo delle collisioni funziona con gli elementi statici ma non con (ad esempio) gli npc quando camminano?

Re: Conta passi

Inviato: 30/09/2019, 10:54
da Kimera_V2
Scario ha scritto:Non so se ho ben capito il problema: il controllo delle collisioni funziona con gli elementi statici ma non con (ad esempio) gli npc quando camminano?
Si il problema è proprio questo.

Re: Conta passi

Inviato: 30/09/2019, 11:05
da Alv
Kimera_V2 ha scritto:Niente non vuole saperne di funzionare :(
I passi che ho fatto sono questi:
- creato l'object o_ck_cella per il controllo della cella
- alla pressione del tasto sposto l'object o_ck_cella nella direzione in cui deve spostarsi il player
-l'object o_ck_cella controlla se la cella è occupata con la funzione collision_rectangle
-se la cella è occupata il player non si muove se non lo è si muove
Conclusioni a volte funziona a volte no :(
credo che il problema sta nel fatto che se l object non è allineato con la griglia il controllo non funziona.
Ciao! La soluzione che ti ho proposto non è il massimo della semplicità: è possibile che ci siano dei bug. Per debuggare, ti conviene rendere l'oggetto marcatore temporaneamente visibile.

Per quanto riguarda lo sprite dell'oggetto marcatore, puoi impostare la bounding box a "Rectangle", "Full image". In questo modo non hai bisogno della funzione collision_rectangle, perchè l'oggetto sarà esso stesso un rettangolo.

Ti basta usare place_meeting(x, y, object). Faccio un esempio:

Codice: Seleziona tutto

if (key_sx && !place_meeting(x-32,y,o_ck_cella))
   {
     hspeed = -4;
     vspeed = 0;
     my_cella.x-=32;
     global.p_passi+=1;
   }
my_cella sarà la variabile che conterrà l'id dell'oggetto marcatore associato al personaggio. Nell'evento Create:

Codice: Seleziona tutto

// crea un oggetto di tipo o_ck_cella e salva l'id in my_cella
my_cella=instance_create(x,y,o_ck_cella);
Nell'evento Destroy:

Codice: Seleziona tutto

// elimina l'oggetto o_ck_cella associato al personaggio
with (my_cella)
    instance_destroy();
In Game Maker si possono referenziare gli oggetti mediante id. Se io scrivessi "o_ck_cella.x-=32", non funzionerebbe, perchè, se ci fossero più istanze dello stesso oggetto, Game Maker non saprebbe quale prendere. Se io referenzio mediante id, sto indicando la singola specifica istanza dell'oggetto.

Spero sia tutto chiaro; comunque dovresti poter utilizzare il codice che ti ho postato senza problemi.

Se poi lo vuoi rifinire ulteriormente, potresti assegnare ai personaggi l'oggetto marcatore come parent. In questo modo anche i personaggi si comporteranno come marcatori, ed eviterai ogni problema di sovrapposizione tra personaggi.

Re: Conta passi

Inviato: 30/09/2019, 12:45
da Kimera_V2
Ho provato ma non cambia nulla a volte funziona a volte no.

Re: Conta passi

Inviato: 30/09/2019, 13:58
da Kimera_V2
Secondo me il problema è questo:

Codice: Seleziona tutto

if (place_snapped(32, 32))
perchè se il pg o l'npc non sono allineati con la griglia non riceveranno mai il controllo delle collisioni o qualsiasi altra cosa.

Re: Conta passi

Inviato: 03/10/2019, 13:45
da Alv
Ok, ho realizzato un esempio editabile (funzionante).
http://alv90.altervista.org/stor/Project3.gmx.zip

Tasti giocatore 1: frecce
Tasti giocatore 2: WASD

Re: Conta passi

Inviato: 04/10/2019, 14:37
da Kimera_V2
Alv ha scritto:Ok ho realizzato un esempio editabile (funzionante).
Tasti giocatore 1: frecce
Tasti giocatore 2: WASD
http://alv90.altervista.org/stor/Project3.gmx.zip
Grazie mille appena posso lo provo

edit: modificato link in citazione su segnalazione