[Résolu] stopper une animation en HTML5/JS

stopper une animation en HTML5/JS [Résolu] - Javascript/Node.js - Programmation

Marsh Posté le 11-11-2017 à 12:46:35    

Bonjour à tous
 
Histoire de me lancer en HTML5/JS POO je me suis amusé  à faire ca : http://www.yethi-info.fr/test/test4.php
 
c'est en PHP car c'est le PHP qui construit les lignes 47 à 77 (positionnement/couleur  aléatoire des briques)
 
Bref ca tourne et j'ai l'effet voulu... je me demande maintenant qu'elle est la meilleure methode pour stopper l'animation ??? (l'affichage en dessous l'image indique la distance restant à parcourir..cette distance tend vers zero dans jamais l'atteindre)
 
Le fait de stopper me permettrait de lancer une autre anim..genre ecrire sur le mur construit avec les briques...
 
J'ai pensé à  
1/un test dans la methode anim de l'objet....
2/la destruction le l'objet
 
j'ai fait qlq test mais je n'arrive pas à m'en sortir...si quelqu'un peu m'aider....
 
Merci
 
thierry


Message édité par yethi le 12-11-2017 à 09:35:26
Reply

Marsh Posté le 11-11-2017 à 12:46:35   

Reply

Marsh Posté le 11-11-2017 à 14:08:14    

Salut
 
je me suis permis de refaire ton code :
http://sickofitall.hd.free.fr/home/briques/
 
source : http://sickofitall.hd.free.fr/home/briques/bricks.js
 
Qq bugs ici en fonction des valeurs aléatoires (fait F5 pour rafraichir). J'ai repris tes coordonnées pour les points d'arrivées.
J'ai mis des commentaires expliquant la méthode (c'est UNE DES méthodes, pas forcément la meilleure :))
 
A++


Message édité par SICKofitALL le 11-11-2017 à 15:58:40

---------------
We deserve everything that's coming...
Reply

Marsh Posté le 12-11-2017 à 09:33:11    

salut SICKofitALL
 
j'ai vu ton premier code : déja c’était ce que je voulais...
Puis le second et là effectivement tu obtient exactement l'effet voulu !!
 
Je vais décortiquer ca tranquillement...
 
Au premier coup d’œil ton code semble moins "primitif" que le mien...
Utilisation de class...faut que je m'y mette !!
 
Pour moi la programmation est un pur jeu donc pas d'impératif !!
 
merci
 
Ps faut que je découvre le groupe SICK OF IT ALL perso en punk américain je me suis arrêté aux Dead Kennedys...


Message édité par yethi le 12-11-2017 à 09:45:17
Reply

Marsh Posté le 12-11-2017 à 12:26:17    

Salut
 
pas de soucis ^^  
 
Au passage, j'ai un peu creusé le sujet suite à ce post, car le coup de la "limite" qui est utilisée ici pour determiner si l'anim est terminée fonctionne bien avec ce cas particulier, mais pas forcement si les objects dans l'alim suivante sont proches (en termes de pixels), car du coup il faut changer la valeur de cette limite...
En fait il faut utiliser un timer un peu plus "absolu". Bref, peut mieux faire :D


---------------
We deserve everything that's coming...
Reply

Marsh Posté le 12-11-2017 à 16:07:48    

Bon j'ai refais tout ca, l'URL reste inchangée :
http://sickofitall.hd.free.fr/home/briques/
 
Du coup je passe plus par une feinte avec un delta et une limite, mais je me base sur une durée.
Ca devient plus propre et relativement paramètrable je trouve :)
 
Bonne chance !
 

Code :
  1. /**
  2. * Created on 11/11/2017.
  3. */
  4. 'use strict';
  5. const
  6.     W = 500,
  7.     H = 300;
  8. /**
  9. *
  10. */
  11. const Afficheur = {
  12.     init: function ()
  13.           {
  14.               this.el = document.getElementById ('Boite100');
  15.           },
  16.     affiche: function (value)
  17.              {
  18.                  this.el.innerHTML = value;
  19.              }
  20. };
  21. /**
  22. *
  23. * @return {string}
  24. */
  25. function getRandomColor ()
  26.     {
  27.         return "#" + ((1 << 24) * Math.random () | 0).toString (16);
  28.     }
  29. /**
  30. *
  31. */
  32. class Brick
  33.     {
  34.         /**
  35.          *
  36.          * @param {CanvasRenderingContext2D} ctx
  37.          * @param {string} color
  38.          */
  39.         constructor (ctx, color)
  40.             {
  41.                 this.ctx = ctx;
  42.                 this.x = Math.random () * W;
  43.                 this.y = Math.random () * H;
  44.                 this.color = color;
  45.             }
  46.         /**
  47.          *
  48.          * @param {number} xArr
  49.          * @param {number} vitesse
  50.          * @return {number}
  51.          */
  52.         calcNx (xArr, vitesse)
  53.             {
  54.                 return (xArr - this.x) / vitesse;
  55.             }
  56.         /**
  57.          *
  58.          * @param {number} yArr
  59.          * @param {number} vitesse
  60.          * @return {number}
  61.          */
  62.         calcNy (yArr, vitesse)
  63.             {
  64.                 return (yArr - this.y) / vitesse;
  65.             }
  66.         /**
  67.          *
  68.          * @param {number} xArr
  69.          * @param {number} yArr
  70.          * @param {number} vitesse
  71.          */
  72.         update (xArr, yArr, vitesse)
  73.             {
  74.                 this.x += this.calcNx (xArr, vitesse);
  75.                 this.y += this.calcNy (yArr, vitesse);
  76.             }
  77.         /**
  78.          *
  79.          * @param {number} xArr
  80.          * @param {number} yArr
  81.          */
  82.         updateFinal (xArr, yArr)
  83.             {
  84.                 this.x = xArr;
  85.                 this.y = yArr;
  86.             }
  87.         draw ()
  88.             {
  89.                 this.ctx.fillStyle = this.color;
  90.                 this.ctx.fillRect (this.x, this.y, 50, 20);
  91.                 this.ctx.fill ();
  92.             }
  93.     }
  94. /**
  95. *
  96. */
  97. class Animator
  98.     {
  99.         constructor (canvasEl)
  100.             {
  101.                 this.NB_BRICKS = 29;
  102.                 this.ctx = canvasEl.getContext ("2d" );
  103.                 // on récup les animations
  104.                 this.animSteps = Animator.getAnimSteps ();
  105.                 this.currentAnimStep = 0;
  106.                 // pour le fun je rajoute dynamiquement une étape avec des points en cercle
  107.                 const funSteps = [];
  108.                 for (let i = 0; i < this.NB_BRICKS; i++)
  109.                     {
  110.                         funSteps.push (
  111.                             {
  112.                                 x: W / 2 + 100 * Math.cos (2 * Math.PI * i / this.NB_BRICKS),
  113.                                 y: H / 2 + 100 * Math.sin (2 * Math.PI * i / this.NB_BRICKS)
  114.                             }
  115.                         );
  116.                     }
  117.                 this.animSteps.push (
  118.                     {
  119.                         duration: 10000,    // en millisecondes
  120.                         vitesse:  100,      // plus c'est grand, plus c'est lent
  121.                         steps:    funSteps
  122.                     });
  123.                 // on instancie les briques. Les points de départ sont aléatoirement créés DANS le constructeur de chaque brique
  124.                 this.bricks = [];
  125.                 for (let i = 0; i < this.NB_BRICKS; i++)
  126.                     {
  127.                         this.bricks.push (
  128.                             new Brick (
  129.                                 this.ctx,
  130.                                 getRandomColor ()
  131.                             )
  132.                         );
  133.                     }
  134.                 // on prépare le reste et on lance l'animation
  135.                 Afficheur.init ();
  136.                 this.renderBinded = this.render.bind (this);
  137.                 this.startNow = Date.now ();
  138.                 requestAnimationFrame (this.renderBinded);
  139.             }
  140.         clear ()
  141.             {
  142.                 this.ctx.fillStyle = "#000000";
  143.                 this.ctx.fillRect (0, 0, W, H);
  144.             }
  145.         render ()
  146.             {
  147.                 requestAnimationFrame (this.renderBinded);
  148.                 this.clear ();
  149.                 const cache = this.animSteps[ this.currentAnimStep ];
  150.                 const now = Date.now ();
  151.                 // on effectue l'animation tant qu'on reste sous la durée précisée
  152.                 if (now - this.startNow < cache.duration)
  153.                     {
  154.                         this.bricks.forEach (
  155.                             (brick, i) =>
  156.                             {
  157.                                 brick.update (
  158.                                     cache.steps[ i ].x,
  159.                                     cache.steps[ i ].y,
  160.                                     cache.vitesse
  161.                                 );
  162.                                 brick.draw ();
  163.                             });
  164.                     }
  165.                 // sinon on place les elements à leurs emplacements définitifs et on passe à l'anim suivante
  166.                 else
  167.                     {
  168.                         this.bricks.forEach (
  169.                             (brick, i) =>
  170.                             {
  171.                                 brick.updateFinal (
  172.                                     cache.steps[ i ].x,
  173.                                     cache.steps[ i ].y
  174.                                 );
  175.                                 brick.draw ();
  176.                             });
  177.                         this.currentAnimStep++;
  178.                         this.currentAnimStep %= this.animSteps.length;
  179.                         this.startNow = Date.now ();
  180.                     }
  181.                 Afficheur.affiche (now - this.startNow);
  182.             }
  183.         /**
  184.          *
  185.          * @return {array}
  186.          */
  187.         static getAnimSteps ()
  188.             {
  189.                 return [
  190.                     {
  191.                         duration: 5000,
  192.                         vitesse:  40,
  193.                         steps:    [
  194.                             { x: -27, y: 278 },
  195.                             { x: 25, y: 278 },
  196.                             { x: 77, y: 278 },
  197.                             { x: 129, y: 278 },
  198.                             { x: 181, y: 278 },
  199.                             { x: 233, y: 278 },
  200.                             { x: 0, y: 256 },
  201.                             { x: 52, y: 256 },
  202.                             { x: 104, y: 256 },
  203.                             { x: 156, y: 256 },
  204.                             { x: 208, y: 256 },
  205.                             { x: 260, y: 256 },
  206.                             { x: -27, y: 234 },
  207.                             { x: 25, y: 234 },
  208.                             { x: 77, y: 234 },
  209.                             { x: 129, y: 234 },
  210.                             { x: 181, y: 234 },
  211.                             { x: 233, y: 234 },
  212.                             { x: 0, y: 212 },
  213.                             { x: 52, y: 212 },
  214.                             { x: 104, y: 212 },
  215.                             { x: 156, y: 212 },
  216.                             { x: 208, y: 212 },
  217.                             { x: 260, y: 212 },
  218.                             { x: -27, y: 190 },
  219.                             { x: 25, y: 190 },
  220.                             { x: 77, y: 190 },
  221.                             { x: 129, y: 190 },
  222.                             { x: 181, y: 190 },
  223.                             { x: 233, y: 190 }
  224.                         ]
  225.                     },
  226.                     {
  227.                         duration: 3000,
  228.                         vitesse:  10,
  229.                         steps:    [
  230.                             { x: 100, y: 0 },
  231.                             { x: 150, y: 0 },
  232.                             { x: 200, y: 0 },
  233.                             { x: 250, y: 0 },
  234.                             { x: 300, y: 0 },
  235.                             { x: 250, y: 0 },
  236.                             { x: 100, y: 20 },
  237.                             { x: 150, y: 20 },
  238.                             { x: 200, y: 20 },
  239.                             { x: 250, y: 20 },
  240.                             { x: 300, y: 20 },
  241.                             { x: 350, y: 20 },
  242.                             { x: 100, y: 40 },
  243.                             { x: 150, y: 40 },
  244.                             { x: 200, y: 40 },
  245.                             { x: 250, y: 40 },
  246.                             { x: 300, y: 40 },
  247.                             { x: 350, y: 40 },
  248.                             { x: 100, y: 60 },
  249.                             { x: 150, y: 60 },
  250.                             { x: 200, y: 60 },
  251.                             { x: 250, y: 60 },
  252.                             { x: 300, y: 60 },
  253.                             { x: 350, y: 60 },
  254.                             { x: 100, y: 80 },
  255.                             { x: 150, y: 80 },
  256.                             { x: 200, y: 80 },
  257.                             { x: 250, y: 80 },
  258.                             { x: 300, y: 80 },
  259.                             { x: 350, y: 80 }
  260.                         ]
  261.                     },
  262.                     {
  263.                         duration: 6000,
  264.                         vitesse:  70,
  265.                         steps:    [
  266.                             { x: 200, y: 30 },
  267.                             { x: 200, y: 30 },
  268.                             { x: 200, y: 30 },
  269.                             { x: 200, y: 30 },
  270.                             { x: 200, y: 30 },
  271.                             { x: 200, y: 30 },
  272.                             { x: 200, y: 220 },
  273.                             { x: 200, y: 220 },
  274.                             { x: 200, y: 220 },
  275.                             { x: 200, y: 220 },
  276.                             { x: 200, y: 220 },
  277.                             { x: 200, y: 220 },
  278.                             { x: 200, y: 240 },
  279.                             { x: 200, y: 240 },
  280.                             { x: 200, y: 240 },
  281.                             { x: 200, y: 240 },
  282.                             { x: 200, y: 240 },
  283.                             { x: 200, y: 240 },
  284.                             { x: 200, y: 260 },
  285.                             { x: 200, y: 260 },
  286.                             { x: 200, y: 260 },
  287.                             { x: 200, y: 260 },
  288.                             { x: 200, y: 260 },
  289.                             { x: 200, y: 260 },
  290.                             { x: 200, y: 280 },
  291.                             { x: 200, y: 280 },
  292.                             { x: 200, y: 280 },
  293.                             { x: 200, y: 280 },
  294.                             { x: 200, y: 280 },
  295.                             { x: 200, y: 280 }
  296.                         ]
  297.                     }
  298.                 ];
  299.             }
  300.     }
  301. // ###
  302. new Animator (document.getElementById ('canvasBrick'));


Message édité par SICKofitALL le 12-11-2017 à 16:21:32

---------------
We deserve everything that's coming...
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed