Comment rendre les mouvements plus fluides ?

J'ai donc besoin d'aide pour que mon personnage bouge plus facilement. Le problème est que le personnage bouge d'un pixel lorsque j'appuie sur une touche et après environ une seconde, il court "en douceur" après cela. Comment puis-je le réparer pour ne pas avoir à attendre une seconde et qu'il fonctionne correctement depuis le début ? J'apprécie toute aide et merci d'avance !

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    g.setColor(Color.GREEN);
    g.fillRect(x, y, 30, 30);
    update();
}
private boolean[] KB = new boolean[4];
public void update(){ 
    if(KB[0] = true)
    {
        y -= 10;
    }
    if(KB[1] = true)
    {
        x -= 10;
    }
    if(KB[2] = true)
    {
        y += 10;
    }
    if(KB[3] = true)
    {
        x +=10;
    }
    repaint();
}

public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_W)
    {
        KB[0] = true;
    }
    if(e.getKeyCode() == KeyEvent.VK_A)
    {
        x -= 10;
    }
    if(e.getKeyCode() == KeyEvent.VK_S)
    {
        y += 10;
    }
    if(e.getKeyCode() == KeyEvent.VK_D)
    {
        x += 10;
    }
}
public void keyReleased(KeyEvent e) {

}

public void keyTyped(KeyEvent e) {

person Mushi Mushi    schedule 08.05.2017    source source
comment
if(KB[0] = true) devrait être if(KB[0] == true) ? ou juste if(KB[0])   -  person samgak    schedule 08.05.2017
comment
Et pourquoi avez-vous une logique différente dans keyPressed ? PS : Appeler repaint() dans paintComponent n'est probablement pas non plus la meilleure idée   -  person AxelH    schedule 08.05.2017
comment
Vous devez utiliser un Swing Timer pour contrôler l'animation. Voir Motion à l'aide du clavier. L'exemple KeyboardAnimation.java montre comment utiliser un Swing Timer pour une animation fluide que vous pouvez contrôler.   -  person camickr    schedule 08.05.2017


Réponses (2)


Je déconseille d'utiliser KeyListener et recommande d'utiliser le Comment utiliser les liaisons de touches, cela résoudra le problème lié au focus avec KeyListener et fournira une solution beaucoup plus réutilisable.

keyPressed aura également un délai initial lors de la première pression, entre la première frappe et la répétition des touches, cela peut être surmonté en définissant un indicateur lorsque la touche est enfoncée et relâchée. Voir cet exemple pour plus de détails

N'appelez pas update dans votre paintComponent, la peinture peut se produire pour un certain nombre de raisons, dont vous ne pouvez pas contrôler, cela pourrait entraîner des problèmes pour maintenir une animation fluide.

Au lieu de cela, vous avez besoin d'une boucle "principale" qui est responsable de la mise à jour de l'état et de la planification des repeints. Comme solution simple, vous pouvez utiliser un Swing Timer pour ce faire, car il s'agit de mettre à jour l'état de l'interface utilisateur de l'intérieur sans risquer des problèmes de thread supplémentaires.

Jetez un œil à Comment utiliser les Swing Timers pour plus de détails .

Comme cela a déjà été dit, utilisez if(KB[0]) plutôt que if(KB[0] = true), car = est une mission et non une évaluation. L'utilisation du premier formulaire élimine la possibilité de commettre accidentellement ce genre d'erreurs.

person MadProgrammer    schedule 08.05.2017
comment
Merci de m'avoir aidé! - person Mushi Mushi; 08.05.2017

C'est parce que votre méthode update est incorrecte. Vous utilisez l'opérateur = au lieu de == dans votre condition.

if (KB[0] = true)

attribuera true à KB[0] et l'évaluera comme true. Par conséquent, toutes vos valeurs seront définies sur true dans votre if. Remplacez = par == lorsque vous l'utilisez comme condition, sauf si vous souhaitez attribuer la valeur.

person Lajos Arpad    schedule 08.05.2017
comment
Ahh je vois Merci ! Cela m'a aidé ! au fait, savez-vous comment je peux utiliser une minuterie dans mon code pendant que vous y êtes ? j'apprécierais puisque mon professeur veut que j'en ai un :D - person Mushi Mushi; 08.05.2017
comment
@MushiMushi, vous êtes les bienvenus et vous pouvez jeter un oeil à ce petit tutoriel : docs.oracle.com/javase/tutorial/uiswing/misc/timer.html. Si ma réponse vous a aidé à résoudre votre problème, vous voudrez peut-être l'accepter comme la bonne réponse. - person Lajos Arpad; 08.05.2017