IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

2D Java Discussion :

[2D] Déplacement d'un sprite à vitesse constante


Sujet :

2D Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2019
    Messages : 6
    Points : 6
    Points
    6
    Par défaut [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
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2019
    Messages : 6
    Points : 6
    Points
    6
    Par défaut [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

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    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 chevronné
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 333
    Points : 1 828
    Points
    1 828
    Par défaut
    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
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2019
    Messages : 6
    Points : 6
    Points
    6
    Par défaut [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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/10/2012, 09h46
  2. Réponses: 21
    Dernier message: 01/03/2009, 23h41
  3. déplacement d'un sprite
    Par Mindiell dans le forum Développement 2D, 3D et Jeux
    Réponses: 13
    Dernier message: 23/09/2007, 13h58
  4. Réponses: 10
    Dernier message: 03/03/2007, 13h46
  5. vitesse de déplacement d'une image pas constante
    Par marco62118 dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 11/04/2006, 13h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo