Evenement inconnu sur un bouton ?

Evenement inconnu sur un bouton ? - Flash/ActionScript - Programmation

Marsh Posté le 27-10-2007 à 21:54:14    

Bonjour,
 
Je cherche a recréer une classe bouton en AS3 car je la voudrais plus ou moins animée...
 
Seulement si j'arrive à intercepter les événements pour le survole et le clique de la souris, il y en a un spécial qui m’échappe complètement :
 
Par exemple avec un simple bouton (voir code ci dessous) en plaçant la curseur sur le bouton et en enfonçant la souris (et en restant enfoncer) on peut trimballer le curseur sur tout l’écran et le bouton a toujours sa couleur de recouvrement.
 
Jusque là j'arrive à reproduire... sauf ceci :
 
La souris toujours enfoncé, je place le curseur en dehors de la fenêtre de Flash et là je relâche la souris. Aussitôt le bouton reprend sa couleur de base. Je n’arrive pas à émuler cet événement !
 
Tous les essais de Bouton extension de Sprite font que je n‘ai plus aucun événement émanant de mon bouton dès que je sors de sa zone même avec la souris enfoncée.
 
Il y a sûrement un truc tout con, genre une propriété à initialiser. En tout cas je ne pense pas qu’il faille de bidouille car la classe SimpleButton fonctionne très bien même en bougeant le curseur en dehors de la fenêtre du logiciel Flash.
 
Connaissez vous la solution ?
 
Merki beauku !
 

Code :
  1. package
  2. {
  3.  import flash.display.*;
  4.  public class Test extends Sprite
  5.  {
  6.   public function Test()
  7.   {
  8.    var myButton:SimpleButton = new SimpleButton();
  9.    myButton.upState = createSpriteRect(32,32,64,32, 0xFF0000);
  10.    myButton.overState = createSpriteRect(32,32,64,32, 0x00FF00);
  11.    myButton.downState = createSpriteRect(32,32,64,32, 0x0000FF);
  12.    myButton.hitTestState = createSpriteRect(32,32,64,32, 0xFF00FF);
  13.    this.addChild(myButton);
  14.   }
  15.   private function createSpriteRect(x:int, y:int, w:int, h:int, color:int):Sprite
  16.   {
  17.    var sprite:Sprite = new Sprite();
  18.    sprite.graphics.lineStyle(2, 0x202020);
  19.    sprite.graphics.beginFill(color);
  20.    sprite.graphics.drawRect(x, y, w, h);
  21.    return sprite;
  22.   }
  23.  }
  24. }

Reply

Marsh Posté le 27-10-2007 à 21:54:14   

Reply

Marsh Posté le 29-10-2007 à 20:52:49    

Bon bah j'ai réussi tout seul :D  
 
J'ai réussi à récupérer l’événement du retour-de-click qui fait défaut lorqu'il est dévié.
 
Comme ça ma classe Bouton fonctionne exactement comme les vrais-boutons  :na:
 
Si cela intéresse quelqu’un...
 
J'ai constaté que le retour-de-click-dévié n'est intercepté que par la classe Stage  
 
Pourquoi ? ça j'en sais rien !
 
Donc il suffit de faire en sorte que l'évènement MOUSE_UP de ma classe soit pris en compte par le stage.
 
Voici le code-source pour comprendre (pour l'exemple mon bouton est plus que rudimentaire) :
 

Code :
  1. package
  2. {
  3. import flash.display.*;
  4. import flash.events.*;
  5. public class MySimpleButton extends Sprite
  6. {
  7.  private var _focused:Boolean = false;
  8.  private var _pushed:Boolean = false;
  9.  public function MySimpleButton()
  10.  {
  11.   _draw();
  12.   addEventListener(Event.ADDED, initEvents);
  13.  }
  14.  private function initEvents(e:Event):void
  15.  {
  16.   if(stage!=null)
  17.   {
  18.    addEventListener(MouseEvent.MOUSE_OVER, _mouseOver);
  19.    addEventListener(MouseEvent.MOUSE_OUT, _mouseOut);
  20.    addEventListener(MouseEvent.MOUSE_DOWN, _mouseDown);
  21.    stage.addEventListener(MouseEvent.MOUSE_UP, _mouseUp);
  22.   }
  23.   else
  24.   {
  25.    var ancienter:DisplayObjectContainer = parent;
  26.    while(ancienter.parent!=null) ancienter = ancienter.parent;
  27.    ancienter.addEventListener(Event.ADDED, initEvents);
  28.   }
  29.  }
  30.  protected function _draw():void
  31.  {
  32.   var f:int = _focused? 0xFF0000 : 0;
  33.   var p:int = _pushed? 0x00FF00 : 0;
  34.   graphics.clear();
  35.   graphics.beginFill(f+p);
  36.   graphics.drawRect(0,0,128,32);
  37.   graphics.endFill();
  38.  }
  39.     private function _mouseOut(e:MouseEvent):void
  40.     {
  41.      _focused = false;
  42.      _draw();
  43.     }
  44.    
  45.     private function _mouseOver(e:MouseEvent):void
  46.     {
  47.      _focused = true;
  48.      _draw();
  49.     }
  50.     private function _mouseDown(e:MouseEvent):void
  51.     {
  52.      _pushed = true;
  53.      _draw();
  54.     }
  55.    
  56.     private function _mouseUp(e:MouseEvent):void
  57.     {
  58.      if(_pushed==true)
  59.      {
  60.          _pushed = false;
  61.       _draw();
  62.      }
  63.     }    
  64. }
  65. }


 
 
Note : pour l'attachement/détachement au stage... il y a encore des améliorations à faire.
 
 
 :hello:

Reply

Marsh Posté le 29-10-2007 à 22:52:04    

euh, c'est pas nécessaire de poster ce genre de code, t'as un peu inventé l'eau tiède là :-/
 

Reply

Marsh Posté le 31-10-2007 à 01:41:01    

antika a écrit :

euh, c'est pas nécessaire de poster ce genre de code, t'as un peu inventé l'eau tiède là :-/


 
Il me semblait être sur un forum d’entraide !
 
Tout le monde n’a pas forcement Bac + 8 en Flash comme toi  
 
Je pars du principe qu’une personne doit s’intéresser au sujet si elle tombe ici.
 
Si elle cherche une solution,  il y aura au moins la mienne accessible au novice.
 
Autrement si le sujet et trop bateau pour elle… pourquoi viendrait-elle le dire !?
 
 
En tout cas pour moi, il y avait quelque chose à montrer ici.
 
Car sur d’autres langages l’événement type Mouse_Up est correctement intercepté.  
 
P’tit Bug Flash ou pas encore assez approfondi Flash !
 
 

Reply

Sujets relatifs:

Leave a Replay

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