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

JavaScript Discussion :

events elements canvas


Sujet :

JavaScript

  1. #1
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 452
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 452
    Points : 4 601
    Points
    4 601
    Par défaut events elements canvas
    Hello,

    ca fait un moment que je tourne en rond... je crais un canvas avec des elements dessus (ronds, carres, text...)

    je voudrai detecter le mouseover de mes elements, mais les seules solutions que je trouve, c'est ajouter un eventListener sur le canvas, recuperer la position de la souris, et comparer avec les positions des elements.
    => ca pourrait passer pour les ronds et carres (formes simples) mais ca ne fonctionnerai pas pour les lignes par exemple

    je voulais savoir s'il etait possible de faire quelque chose de simple comme :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    context.fillText("mon texte", x, y).addEventListener(...);
    ca serait tellement plus claire et simple...

    merci pour vos suggestions
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  2. #2
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    Pourquoi ne pas avoir un canvas pour le fond et créer dynamiquement d'autres couches de canvas pour tes formes en gérant leur profondeur avec . Comme ça tu récupères addEventListener pour chaque forme et pour les fillText...comme les sprites en flash...

  3. #3
    Membre chevronné

    Homme Profil pro
    Ingénieur Hospitalier
    Inscrit en
    Juillet 2004
    Messages
    993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Hospitalier
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 993
    Points : 1 768
    Points
    1 768
    Billets dans le blog
    1
    Par défaut
    Si tu n'a pas trop d'objets , tu peux toujours créer des class d'object pour créer tes propres "attributes" et "events" mais sa risque d'être long au début mais gratifiant à la fin par exemple pour tes cercles tu peux créer une class et ensuite créer tes cercles avec des propriétés différentes selon ton workflow il faudrait le faire pour tout tes objets.


    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
    //HTML
    <canvas id="circle" width="200" height="200"></canvas>
     
    //JAVASCRIPT
    /** Initialisation des variables et l'objet canvas **/
    var canvas  = document.id('circle'),
        context = canvas.getContext('2d'),
        Circle,
        ball;
     
    /** création de la class circle attributes & events **/
    Circle = new Class({
     
      Implements: [Options, Events],
     
      initialize: function (options) {
        this.setOptions(options);
     
        this.draw().attach();
      },
     
      attach: function () {
        this.addEvent('change', this.draw);
      },
     
      set: function (what, value) {
        this.options[what] = value;
     
        this.fireEvent('change');
        return this;
      },
     
      get: function (what) {
        return this.options[what];
      },
     
      draw: function () {
        context.clearRect(this.options.x, this.options.y, this.options.radius * 2, this.options.radius * 2); 
     
        context.beginPath();
    		context.arc(this.options.x + this.options.radius, this.options.y + this.options.radius, this.options.radius, 0, 2 * Math.PI, false);
    		context.fillStyle = this.options.background;
    		context.fill();
     
        return this;
      },
     
      getSize: function () {
        return {
    			width: this.options.radius * 2,
    		  height: this.options.radius * 2
    		}
      },
     
      getPosition: function () {
        var position = {
    			x: this.get('x'),
    			y: this.get('y')
    		}
     
    		return position;
      },
      getColor: function(){
        var style = {
          background: this.get('background')
        }
        return style;
      },
     
      isMouseOver: function (x, y) {
        var position = this.getPosition(),
    				size   = this.getSize(),
    				radius = this.options.radius,
    				centerX = position.x + (size.width / 2),
    				centerY = position.y + (size.height / 2),
    				distanceX = x - centerX,
    				distanceY = y - centerY;
     
       // console.log(x)
     
    		return Math.round(Math.sqrt(Math.pow(x - centerX, 2) + Math.pow(y - centerY, 2))) <= radius;
      }
     
    });
     
     
    /** initialisation des attributs et events de l'object circles **/
    ball = new Circle({
      x: canvas.width / 2,
      y: canvas.height / 2,
      radius: 40,
      background: 'red'
    });
     
    ball.addEvent('mouseenter', function () {
      this.set('background', 'blue');
    });
     
    ball.addEvent('mouseleave', function () {
      console.log(this.getColor().background)
      var color = (color === ball.style) ? 'red' : 'yellow';
      this.set('background', color);
    });
     
    canvas.addEvent('mousemove', function (e) {
      var x = e.client.x,
          y = e.client.y;
     
      if (ball.isMouseOver(x, y)) {
     
        if (!ball.mouseover) {
          ball.fireEvent('mouseenter');
          ball.mouseover = true;
        }
      } else if (ball.mouseover) {
        ball.mouseover = false;
        ball.fireEvent('mouseleave');
      }
    });
    démo :

    https://codepen.io/headmax/pen/qVKgRG?editors=1011

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Doksuri, tu viens de découvrir que le DOM est un milieu bien douillet où toutes les détections de « collision » (contact élément-pointeur) sont gérées à notre place… Dans un canevas, point de DOM car les concepts qu’on y apporte sont issus directement de notre imagination.

    La solution proposée par Archimède est bonne si tu ne manipules que des formes rectangulaires, correspondant aux contours de tes différents canevas superposés. Éventuellement, tu peux leur appliquer des transformations CSS, mais je ne sais pas si c’est une bonne idée pour la maintenance du code, ni pour les performances. À la fin, un canevas reste un élément du DOM et il obéit aux lois du tout-puissant rectangle.

    Ah, il y a bien les vieux éléments <map>, <area>, etc. de l’époque HTML4… J’avais trouvé des preuves de concept — je me souviens d’une image avec les Super Nanas, le dessin animé — et oui, il est bel et bien possible d’avoir des formes aux contours détectés précisément en utilisant cette technologie. Cela dit, les possibilités restent quand même très limitées par rapport aux canevas.

    Je n’ai jamais fait l’expérience avec SVG, mais je ne serais pas étonné que ça soit possible également.

    Headmax propose un bel algo de détection de cercle. Le cercle reste une figure simple, et une des moins coûteuses en temps de calcul, avec le rectangle. Et c’est l’idée essentielle avec la collision de détection : chercher à décomposer une surface complexe en éléments simples, pour rendre les calculs moins lourds. C’est l’objet de cet article de Gamasutra, qui m’a apporté beaucoup d’informations sur le sujet quand je l’ai découvert. J’espère qu’il t’aidera toi aussi
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Membre chevronné

    Homme Profil pro
    Ingénieur Hospitalier
    Inscrit en
    Juillet 2004
    Messages
    993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Hospitalier
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 993
    Points : 1 768
    Points
    1 768
    Billets dans le blog
    1
    Par défaut
    @ Watilin
    Merci pour le lien, je ne connaissait pas . Pour SVG 100% d'accord, qu'il aurait été plus judicieux de s'orienter surtout pour du 2D vers du SVG sachant que les possibilités sont énormes niveaux vectorielles et les dessins issus de la suite des adobes ... génèrent des svg facilement manipulable avec d3.js ou autres lib ..., les rendus sont parfois impressionnant. Pour le choix du canvas que j'affecte surtout avec l'utilisation de three.js, ainsi que la vidéos et le traitement d'images 2D/3D est un choix plus difficile à appréhender, on défini tout sinon l'orientation vers des lib mache un peu le boulot.
    Des libs bien faite un lien en ce qui concerne canvas svg et vise versa assez sympathique http://fabricjs.com/

  6. #6
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 452
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 452
    Points : 4 601
    Points
    4 601
    Par défaut
    merci pour vos reponses et la lecture, c'etait pour m'assurer que je ne fasse pas fausse route
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

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

Discussions similaires

  1. Mettre un event sur un objet dessiné dans un Canvas
    Par calogerogigante dans le forum Tkinter
    Réponses: 11
    Dernier message: 30/01/2010, 09h05
  2. Event sur le déplacement de la souris dans un canvas
    Par Stéphane Nadry dans le forum Tkinter
    Réponses: 2
    Dernier message: 27/10/2008, 13h37
  3. [Tkinter] [Canvas] trouver un element a 10 pixels
    Par Lau-frenssss dans le forum Tkinter
    Réponses: 1
    Dernier message: 16/06/2008, 19h45
  4. [State Event] Eléments Initial & Entry point
    Par Emerica dans le forum Autres Diagrammes
    Réponses: 2
    Dernier message: 12/11/2004, 14h50
  5. Réponses: 4
    Dernier message: 05/11/2004, 14h58

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