Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1063 connectés 

  FORUM HardWare.fr
  Programmation
  Javascript/Node.js

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2307614
yethi
Posté le 11-11-2017 à 12:46:35  profilanswer
 

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
mood
Publicité
Posté le 11-11-2017 à 12:46:35  profilanswer
 

n°2307615
SICKofitAL​L
misanthrope
Posté le 11-11-2017 à 14:08:14  profilanswer
 

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...
n°2307644
yethi
Posté le 12-11-2017 à 09:33:11  profilanswer
 

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
n°2307649
SICKofitAL​L
misanthrope
Posté le 12-11-2017 à 12:26:17  profilanswer
 

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...
n°2307654
SICKofitAL​L
misanthrope
Posté le 12-11-2017 à 16:07:48  profilanswer
 

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...

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Javascript/Node.js

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

 

Sujets relatifs
[HTML/CSS][PHP][JS][SQL] Quelques bon livres ?[JS] Changement de Disable ne fonctionne pas
problème avec dialobox sur condition (JS)[HTML/PHP/JS] Afficher x pages en alternances sur timer
Mettre un id avec des handlebars avec Handlebars.JS[JS] Créer une nouvelle méthode pour n'importe quel objet
[html5 / css / php] débutant demande aide edit (php)Fonction JS pour récupérer le tag image "Alt" sur un diaporama
[JS/Xml] Parser des éléments en fonction de la balise contenante?[noob JS] Equivalent JS des include/require?
Plus de sujets relatifs à : [Résolu] stopper une animation en HTML5/JS


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR