Movimenti fluidi in un gioco basato su tessere


8

Come possiamo far muovere agevolmente il nostro personaggio tra le tessere? Si muove tessera per tessera, ma sembra poco professionale. Inoltre, quando si tengono premuti i tasti freccia, si comprime sullo schermo. Come possiamo evitare che ciò accada?


Stai usando numeri interi per il movimento del giocatore. Prova invece a usare float.
Mokosha,

1
È preferibile ridurre il codice al minimo necessario per dimostrare / comunicare il problema / la domanda. Inoltre, potresti essere interessato a questa domanda .
kevintodisco,

1
Ho rimosso le parti non necessarie della tua domanda. È meglio arrivare al punto e non aggiungere codice aggiuntivo o altra lanugine.
MichaelHouse

Risposte:


6

Il movimento regolare può essere ottenuto in vari modi. E dipende davvero dal tipo di movimento che vuoi consentire.

  • Il movimento è ancora limitato alle tessere. Questo tipo è il più semplice per eseguire operazioni come il rilevamento delle collisioni e altri controlli del movimento. Per questo tipo di movimento dovrai semplicemente interpolare la posizione nel tempo mentre passi da una tessera all'altra. Può essere semplice come aggiungere qualcosa come il seguente al ciclo di aggiornamento.

Pseudo codice:

 if(GetDistance(position, targetposition) > minDistance) {
     position = MoveTowards(position, targetposition, deltatime);
 }

Dove MoveTowardsprende solo la posizione corrente e aggiunge una parte della distanza tra essa e la posizione target.

  • Il movimento non è limitato alle tessere. Questo diventa molto più difficile da implementare. Essenzialmente con questo metodo è sufficiente memorizzare la posizione e aggiornarla tramite la velocità. Cioè, cambiare posizione nel tempo.

Tenere premuti i tasti freccia per spostare i personaggi può anche essere implementato in diversi modi. Probabilmente quello che stai facendo è qualcosa di simile:

if(keydown(left))
   tilePosition.X--;

Ciò indurrebbe effettivamente il personaggio a comprimersi sullo schermo. Dal momento che avresti aggiornato la posizione più volte al secondo. Un modo leggermente migliore per implementare questo sarebbe aggiungere un ritardo. Qualcosa di simile a

if(keydown(left)) {
    if(leftKeyHeldTimer > movementDelay) {
        tilePosition.X--;
        leftKeyHeldTimer = 0;
    } else {
        leftKeyHeldTimer+= deltaTime;
    }
}

Ciò aggiungerà un timer di ritardo e aggiornerà la posizione della piastrella solo quando il movementDelayvalore è stato raggiunto.


0

Posso identificare due problemi. Il primo è legato al movimento regolare e il secondo è legato al personaggio che si stacca dallo schermo.

Per creare un movimento regolare, è possibile utilizzare una tecnica chiamata Linear Interpolation o (LERP) per rendere più fluido il movimento. Fondamentalmente come funziona tra il punto iniziale e il punto finale si calcola una serie di distanze decrescentemente piccole per emulare il movimento regolare e rallentare quando l'endpoint è quasi raggiunto.

L'esempio più semplice di questa funzione sarebbe:

//point1 is the current position, will be starting position on first call
//point2 is the target position
//epsilon is the % of the distance between current and target you want
//to cover per game physics loop (a fixed realworld time based loop).
//The smaller the % the "smoother" the motion.

float lerp(float point1, float point2, float epsilon)
{
    return point1 + epsilon * (point2 - point1);
}

Man mano che il personaggio si avvicina al punto 2, rallenta gradualmente. Nota che in realtà non toccheranno mai il punto 2 ma si avvicinano all'infinito. Dovresti correggerlo e se il giocatore è a una distanza infinitamente piccola dal punto 2, possiamo considerare che il giocatore è al punto 2.

Il secondo problema che hai citato riguarda il tuo personaggio che vola fuori dallo schermo. Questo è il risultato dell'input che viene letto ad ogni aggiornamento del ciclo di gioco combinato con il movimento istantaneo tra le tessere.

Idealmente per risolvere questo problema, nel tuo codice devi decidere

  1. Quanto tempo del mondo reale ci vorrebbe per il personaggio per passare dal punto 1 al punto 2.
  2. Imposta il tuo Lerp per correre tra il punto 1 e due per questa durata
  3. Leggi di nuovo l'input una volta raggiunto il punto 2 per decidere dove andare
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.