Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Jeu 2D] Calcul de vitesse résiduelle ?

Anonyme
    25 mai 2017 à 16:06:45

    Bonjour,

    J'essaie de recréer un jeu de tir en 2D dans le genre de Diep.io.

    Pour le moment, j'ai juste un player, représenté par un cercle dans un canvas. Ce player se déplace quand on presse les touches Z, Q, S ou D. Cette partie-là fonctionne très bien, et j'ai décidé de l'améliorer un peu : dans Diep.io, si vous déplacez votre tank pendant une seconde, puis relâchez la touche, votre tank ne s'arrête pas brutalement : il glisse un peu... Comme pour simuler le freinage. Je voudrais reproduire cet effet.

    J'ai implémenté --- non sans mal --- une version avec le clavier. Attention les yeux, c'est du CoffeeScript :

    class Player
       # Constructor and other stuff here...
    
       # @param {Nuumber} timeDilation - Time factor.
       computeNextPosition: (timeDilation) ->
          # Set velocity depending on which keys are pressed.
          @velocityY += timeDilation *
             if      @directionUp      then -0.1
             else if @directionDown    then +0.1
             else if @velocityY isnt 0 then -0.05 * Math.sign @velocityY
             else                            0
    
          @velocityX += timeDilation *
             if      @directionLeft    then -0.1
             else if @directionRight   then +0.1
             else if @velocityX isnt 0 then -0.05 * Math.sign @velocityX
             else                            0
    
          # Normalize velocity.
          @velocityY = Math.trunc @velocityY if Math.abs(@velocityY) < 0.01 or @speed < Math.abs @velocityY
          @velocityX = Math.trunc @velocityX if Math.abs(@velocityX) < 0.01 or @speed < Math.abs @velocityX
    
          # Adapt axis-specific speeds depending on the direction angle
          # (diagonal movement).
          velocityAngle = Math.atan2 @velocityY, @velocityX
    
          @position.y += timeDilation * @velocityY * Math.abs Math.sin velocityAngle
          @position.x += timeDilation * @velocityX * Math.abs Math.cos velocityAngle
    

    ... Ce code fonctionne, mais le résultat n'est toujours pas parfaitement fluide... Je dois avoir manqué quelque chose.

    J'ai donc deux "question" :

    1. J'aimerais avoir des retours sur le code existant ( le CS ) ;
    2. Existe-t-il un nom pour ce que je veux faire ? Cette question est LA plus importante : toutes mes recherches sur le net ont été des échecs faute de savoir quoi chercher !

    Bon après-midi.
    Cordialement, Novax.

    -
    Edité par Anonyme 25 mai 2017 à 19:26:27

    • Partager sur Facebook
    • Partager sur Twitter
      25 mai 2017 à 20:47:28

      Tu peux regarder avec le mot clé "unity" il y a beaucoup de discussions sur les forces, la physique. Pour ton code, j'aurais fait la même chose, ajouter une vitesse en x,y quand on appuie sur une touche, et quand on relâche, multiplier vitesseX et Y par 0.9 (ou moins si tu veux freiner plus vite).

      -
      Edité par Arthur222 28 mai 2017 à 12:08:19

      • Partager sur Facebook
      • Partager sur Twitter
        25 mai 2017 à 21:26:06

        Je pense que tu peu trouver des lib JS qui facilitent la mise en oeuvre de ce genre de comportement physique.

        Peut-être PhysicsJS par exemple: http://wellcaffeinated.net/PhysicsJS/

        -
        Edité par MarlburroW 25 mai 2017 à 21:28:26

        • Partager sur Facebook
        • Partager sur Twitter
          28 mai 2017 à 2:15:56

          Hello !

          Pour un effet aussi simple, pas besoin de charger une lib de physX (sauf si tu as besoin d'autres effets).

          Sinon, il suffit de jouer avec un paramètre d'accélération :

          Un exemple d'implémentation ici : https://jsfiddle.net/jmpp77/34ssbm7y/

          • Partager sur Facebook
          • Partager sur Twitter

          [Jeu 2D] Calcul de vitesse résiduelle ?

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown