Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Futur Membre du Club
    [2D] Déplacement d'un sprite à vitesse constante
    Bonjour tout le monde,
    Je veux déplacer un sprite à l'écran. Je génère aléatoirement un point (x, y) de destination et je veux déplacer ce sprite à une vitesse constante et d'une manière fluide, quelque soit la destination.
    J'ai utilisé l'équation de droite (y = ax + b), ça fonctionne très bien à un détail prêt, plus b est grand plus le sprite va vite quand je fais x+1 à chaque boucle.
    y a t'il une autre méthode que l'équation de droite pour le déplacement ? ou y a t'il une astuce pour rendre constante la vitesse de déplacement tout en gardant la fluidité du mouvement (sans saccade) ?
    D'avance merci ...

  2. #2
    Futur Membre du Club
    [2D] Déplacement d'un sprite à vitesse constante
    re,
    J'ai trouvé un moyen de rendre la vitesse constante sans saccade, en faisant en sorte que le a de y = ax + b soit toujours < 1, mais du cout je perd les déplacements verticaux,
    puisque dans le cas des déplacements verticaux, le a de y = ax +b est > 1.
    haaa !!!
    l'équation de droite n'est donc pas le meilleur moyen de gérer les déplacements ....
    help !

  3. #3
    Expert éminent
    Citation Envoyé par Madrak91 Voir le message
    re,
    l'équation de droite n'est donc pas le meilleur moyen de gérer les déplacements ....
    Roh, si, c'est encore ce qu'il y a de plus simple... mais faire x=x+1 en espérant avoir une vitesse constante, là ce n'est effectivement pas le meilleur moyen!

    Pour faire simple, pour aller du point A au point B:

    for k=0 to 100:
    x_sprite=xA+k/100*(xB-xA)
    y_sprite=yA+k/100*(yB-yA)
    next k
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  4. #4
    Membre expérimenté
    Bonjour,

    Dans ta boucle d'affichage, tu ne peux généralement pas garantir que le temps écoulé entre chaque boucle est le même. Aussi, en incrémentant de 1 ta position à chaque boucle, la vitesse de déplacement est dépendante de la vitesse de ton ordinateur (ordinateur puissant = déplacement rapide) et pas forcément stable (par exemple en cas d'interruption longue), donc possiblement saccadé! Donc, tu dois donner une vitesse à ton sprite. Je te l'illustre avec le pseudocode suivant (note, ce principe est quasiment systématiquement utilisé dans les jeux vidéos).
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Position pos = {0,0} // pos initiale
    Vecteur vitesse= {100 , 0} // En pixels par seconde
     
    void update(double elapsed){ // elapsed correspond aux secondes écoulées depuis le dernier appel de la fonction
            pos.x += elapsed * vitesse.x
            pos.y += elapsed * vitesse.y
    }
    void main(String[] args) {
        double oldTime = Sytem.nanoTime();
        double elapsed;
         while(true) {
            elapsed = System.nanoTime() - oldTime;
            update(elapsed);
            draw(); // Le dessin du sprite
            oldTime += elapsed;
    }


    Je trouve que le code reste logique (une vitesse c'est intuitif) mais est beaucoup plus robuste qu'avec une incrémentation simple!

    Bonne journée.

  5. #5
    Futur Membre du Club
    [2D] Déplacement d'un sprite à vitesse constante
    Bonsoir Messieurs,
    Merci pour vos réponses. J'ai finalement trouvé la solution à mon problème. J'ai finalement géré le déplacement de mon sprite avec les vecteurs.

    Voici ma solution :
    Je déclare 3 vecteurs :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import org.lwjgl.util.vector.Vector2f;
     
    public Vector2f	PosVector = new Vector2f();        // vecteur de la position courante du sprite
    public Vector2f	DestVector = new Vector2f();      // vecteur de destination désirée
    public Vector2f	DirectVector = new Vector2f();    // vecteur de la destination
     
    sprite.Speed = 1;   // ou 2 ou 3 ou 4 .....
     
    Je click sur la souris
    // la destination est la position de la souris
    // j'initialise les vecteurs
    sprite.PosVector.set(sprite.X_Position, sprite.Y_Position);
    sprite.DestVector.set(x_mouse, y_mouse);
    sprite.DirectVector.set(sprite.DestVector.getX() - sprite.PosVector.getX(), sprite.DestVector.getY() - sprite.PosVector.getY());
     
    // je norme le vecteur de direction
    sprite.DirectVector.normalise();
     
    // je recalcule à chaque boucle la nouvelle position du sprite
    sprite.X_Position += sprite.DirectVector.getX() * sprite.Speed;
    sprite.Y_Position += sprite.DirectVector.getY() * sprite.Speed;

    ça fonctionne nickel !!

    Merci encore !