2017-09-28 6 views
0

J'ai cette méthode de mise à jour ci-dessous:mouvement de tuile chaque nombre de secondes

@Override 
public void update(Input input, int delta) { 

    /* if UP, move player 5 tiles upwards */ 
    if (input.isKeyPressed(Input.KEY_UP) { 
     y -= 5; 
     setY(y); 
    } 

    /* if DOWN, move player 5 tiles downwards */ 
    if (input.isKeyPressed(Input.KEY_DOWN) { 
     y += 5; 
     setY(y); 
    } 

    /* if LEFT, move player 5 tiles to the left */ 
    if (input.isKeyPressed(Input.KEY_LEFT) { 
     x -= 5; 
     setX(x); 
    } 

    /* if RIGHT, move player 5 tiles to the right */ 
    if (input.isKeyPressed(Input.KEY_RIGHT) { 
     x += 5; 
     setX(x); 
    } 
} 

Ma boucle de mise à jour de ma classe mondiale:

public void update(Input input, int delta) 
throws SlickException { 

    // Update every sprite eg. Player, Blocks etc. 
    for (Sprite sprite : list) { 
     sprite.update(input, delta); 
    } 
} 

setX() et setY() ne sont que les poseurs de ma classe, qui gère combien de pixels le joueur doit déplacer en termes de tuiles. Où chaque tuile est de 32 pixels. Jusqu'à présent, cela déplace mon joueur d'un endroit à un autre emplacement 5 tuiles vers le bas, vers le haut, vers la gauche ou vers la droite. Je me demandais si c'était une façon de faire déplacer le joueur d'un carreau toutes les 0,25 secondes à sa destination? Comme dans, toutes les 0,25 secondes, le joueur déplacerait 32 pixels dans la direction gauche, droite, bas ou haut. Je veux que cela soit ajouté de sorte qu'il semble que le joueur glisse sur des tuiles au lieu de se téléporter directement à son emplacement.

Comment puis-je utiliser une minuterie pour y parvenir? Puis-je utiliser Delta pour faire cela? Toute sorte d'aide serait appréciée.

Répondre

0

Conserve une variable en dehors de la boucle de mise à jour contenant un horodatage.

int lastTimestamp;

Maintenant, dans votre boucle, effectuez un contrôle conditionnel qui vérifie si 250 millisecondes s'est écoulé depuis lastTimetamp.

// Use System.nanoTime()/1000000L to get current time 
if(currentTime >= (lastTimestamp + 250)) { 
    movePlayer(); 
    lastTimestamp = currentTime; 
} 

Maintenant, cette condition devrait passer toutes les 0,25 secondes.

+0

Merci pour la réponse. J'ai ajouté ma boucle de mise à jour dans ma question, est-ce que j'ajouterais simplement cette condition à cette boucle? – RoadRunner

+0

Vous ne devez pas utiliser Java.lang.System.currentTimeMillis() car il dépend du framerate et peut invoquer différents comportements sur des machines différentes. Je suggère que vous devriez utiliser les deltas. –

+1

@LOLWTFasdasdasdad à droite, alors utilisez System.nanoTime() puis. Ma réponse devrait toujours être valide. –

0

Je voudrais ajouter une MoveAnimation de classe Runnable que vous donnez à un ScheduledExecutorService.

class MoveAnimation { // the full player movement 
    public boolean animationFinished(); 
    public void animate() { 
     if (animationFinished()) { 
      throw new Exception(); // there is probably a cleaner way to remove this from the executor 
     } 
    } 
} 

class AnimationControl { 
    private final ScheduledExecutorService animationSchedule = Executors.newScheduledThreadPool(1); 
    public void addMovement(MoveAnimation animation) { 
     animationSchedule.scheduleAtFixedRate(animation::animate, 0, 250, TimeUnit.MILLISECONDS); 
    } 
} 

// in the event listener 
if (input.keyIsPressed(Input.KEY_LEFT)) { 
    animationControl.addMovement(new MoveLeftAnimation(from, to)); 
} 
1

Voir cette réponse:

Java slick2d moving an object every x seconds

Vous devez utiliser delta pour definitly cela depuis que vous voulez framerate independent motion dans votre jeu.

+0

Merci. Avez-vous par hasard un exemple de comment cela fonctionne? J'ai essayé d'utiliser le code de votre réponse dans cette question, mais cela ne semble pas changer le comportement. – RoadRunner

+0

Êtes-vous sûr de l'avoir implémenté correctement? Fondamentalement ce que vous devez faire est: 1. Créer une variable en dehors de la boucle de mise à jour et l'initialiser avec 0; 2. Définissez une valeur maximale représentant l'intervalle. 3. Ajout du delta à la variable définie (var + = delta) 4. if (definedDelta> = interval) {move (x, y,); definedDelta = 0} Il est important de remettre à zéro la valeur définie, sinon votre condition sera toujours vraie. –

+0

Est-ce que ce que j'ai dans ma question est un exemple de boucle de mise à jour? – RoadRunner