Conta passi

Hai una curiosità o un problema con Game Maker? Domanda e ti sarà risposto!
Rispondi
Avatar utente
Kimera_V2
Membro
Messaggi: 118
Iscritto il: 27/06/2013, 14:11
Uso: GM:Studio 1.4 Pro
Località: CPU
Contatta:

Conta passi

Messaggio 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.

Avatar utente
Alv
Membro
Messaggi: 133
Iscritto il: 14/11/2014, 22:33
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Sicilia
Contatta:

Re: Conta passi

Messaggio 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;

Avatar utente
Kimera_V2
Membro
Messaggi: 118
Iscritto il: 27/06/2013, 14:11
Uso: GM:Studio 1.4 Pro
Località: CPU
Contatta:

Re: Conta passi

Messaggio 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.

Avatar utente
Alv
Membro
Messaggi: 133
Iscritto il: 14/11/2014, 22:33
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Sicilia
Contatta:

Re: Conta passi

Messaggio 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à).
Ultima modifica di Alv il 03/01/2021, 14:58, modificato 5 volte in totale.

Avatar utente
Kimera_V2
Membro
Messaggi: 118
Iscritto il: 27/06/2013, 14:11
Uso: GM:Studio 1.4 Pro
Località: CPU
Contatta:

Re: Conta passi

Messaggio 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.

Avatar utente
Scario
Moderatore
Messaggi: 2707
Iscritto il: 26/05/2003, 20:29
Specialità: Tergiversare
Uso: GM:Studio 2
Contatta:

Re: Conta passi

Messaggio 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?
Immagine

Avatar utente
Kimera_V2
Membro
Messaggi: 118
Iscritto il: 27/06/2013, 14:11
Uso: GM:Studio 1.4 Pro
Località: CPU
Contatta:

Re: Conta passi

Messaggio 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.

Avatar utente
Alv
Membro
Messaggi: 133
Iscritto il: 14/11/2014, 22:33
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Sicilia
Contatta:

Re: Conta passi

Messaggio 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.
Ultima modifica di Alv il 04/01/2021, 11:21, modificato 6 volte in totale.

Avatar utente
Kimera_V2
Membro
Messaggi: 118
Iscritto il: 27/06/2013, 14:11
Uso: GM:Studio 1.4 Pro
Località: CPU
Contatta:

Re: Conta passi

Messaggio da Kimera_V2 »

Ho provato ma non cambia nulla a volte funziona a volte no.

Avatar utente
Kimera_V2
Membro
Messaggi: 118
Iscritto il: 27/06/2013, 14:11
Uso: GM:Studio 1.4 Pro
Località: CPU
Contatta:

Re: Conta passi

Messaggio 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.

Avatar utente
Alv
Membro
Messaggi: 133
Iscritto il: 14/11/2014, 22:33
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Sicilia
Contatta:

Re: Conta passi

Messaggio 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
Ultima modifica di Alv il 05/12/2020, 17:03, modificato 2 volte in totale.

Avatar utente
Kimera_V2
Membro
Messaggi: 118
Iscritto il: 27/06/2013, 14:11
Uso: GM:Studio 1.4 Pro
Località: CPU
Contatta:

Re: Conta passi

Messaggio 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

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 20 ospiti