Forums Développement Multimédia

Aller au contenu

Comment gérer un clic continu

CODE Actionscript

14 réponses à ce sujet

#1 crsfff

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 51 messages

Posté 03 March 2008 - 14:15 PM

Bonjour

je sais que MouseEvent.MOUSE_DOWN permet d'executer une fonction 1 fois lors du clic souris.

Mais comment faire pour faire exécuter une fonction tant que le clic n'est pas relâché? (par exemple pour faire bouger un movieclip de façon continue lorsqu'on presse sur un bouton)

merci

#2 wips1981

  • Members
  • PipPipPipPipPipPipPipPip
  • 555 messages

Posté 03 March 2008 - 14:28 PM


MOUSE_DOWN te permet d'executer une function lors de l'appui sur le boutons du mulot, MOUSE_UP lors du relachement.
Donc pour ton exemple:

Action Script


monBouton addEventListener (MouseEvent.MOUSE_DOWN, _surEnfonce)
function surEnfonce(){
monBouton.startDrag;
MonBouton addEventListener (MouseEvent.MOUSE_UP, _surRelache)
function surRelache(){
monBouton.stopDrag;
}

Modifié par wips, 03 March 2008 - 14:28 PM.


#3 antinua

  • Members
  • PipPipPipPipPipPipPipPip
  • 1067 messages

Posté 03 March 2008 - 14:30 PM

Bonjour.

En liant un Timer au clic.
Plus précisément, un Timer est un objet générant un évènement à intervalle régulier.
Si en appuyant sur la souris (événement MOUSE_DOWN) on lance le Timer, et qu'en la relâchant (événement MOUSE_UP) on arrète le Timer, on obtient un évènement qui apparait de manière régulière tant que le bouton de la souris est pressée.
Il suffit alors d'ajouter un écouteur sur cet évènement.

Note: Concernant ton exemple (déplacer un MovieClip en fonction du clic), je me permet de rappeller l'existance des méthodes startDrag() et stopDrag() pour déplacer un MC selon les mouvements de la souris.

EDIT : Coiffée au poteau par wips... tant pis wink.gif
Bonne journée.

Modifié par Aralicia, 03 March 2008 - 14:30 PM.


#4 crsfff

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 51 messages

Posté 03 March 2008 - 15:38 PM

merci

j'ai cependant besoin d'un peu plus de précisions
en fait je ne cherche pas à faire du drag and drop mais à faire bouger un movieclip de facon horizontale ou verticale en modifiant par actionscript ses propriétés x et y

sur la base de ce que vous m'avez dis, j'ai essayé ça

Action Script


function surRelache(eventObject:MouseEvent){
trace('relache');
}



function moveRight(eventObject:MouseEvent) {
myClip.x += 2;
rightButton.addEventListener(MouseEvent.MOUSE_UP, surRelache)
}
mon problème reste le même, le clip bouge à chaque clic mais pas de façon continue.
Je débute, j'ai compris la logique du timer, mais je ne sais pas comment l'intégrer dans ce bout de code.
Pouvez-vous m'en dire plus? je sents que je suis pas loin du résultat

merci

#5 Elzean

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 229 messages

Posté 03 March 2008 - 15:41 PM

Si c'est quelque chose en rapport avec la souris parfois un simple MouseEvent.MOUSE_MOVE suffit. Tu ajoute l'événement MOUSE_MOVE au moment du MOUSE_DOWN et le retire au MOUSE_UP. Tout dépends de ce que tu veux faire exactement.

icon_wink.gif

Modifié par Elzean, 03 March 2008 - 15:41 PM.


#6 Elzean

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 229 messages

Posté 03 March 2008 - 15:47 PM

Ok je viens de voir ton dernier post, donc ton choix devra se porter soit sur le Timer soit sur le MOUSE_MOVE. Pour ton cas je pense que le MOUSE_MOVE peut suffire, mais c'est aussi une bonne chose de savoir utiliser les timer, au mieux essaie les 2 icon_razz.gif

Pour le MOUSE_MOVE :

Action Script


monEcouteur.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler)
monEcouteur.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler)

function mouseDownHandler(e:MouseEvent):void
{
monEcouteur.addEventListener(MouseEvent.MOUSE_MOVE, maFonction)
}

function mouseUpHandler(e:MouseEvent):void
{
monEcouteur.removeEventListener(MouseEvent.MOUSE_MOVE, maFonction)
}


#7 antinua

  • Members
  • PipPipPipPipPipPipPipPip
  • 1067 messages

Posté 03 March 2008 - 15:59 PM

Bonjour.

En bonus au post de Elzean, la version Timer :

Action Script

var monTimer:Timer = new Timer(1000); // le Timer genère un évènement toute les secondes (=1000ms)

MonEcouteur.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler)
monEcouteur.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler)
monTimer.addEventListene(TimerEvent.TIMER, maFonction);

function mouseDownHandler(e:MouseEvent):void
{
monTimer.start();
}

function mouseUpHandler(e:MouseEvent):void
{
monTimer.stop();
}

Bonne journée.

#8 wips1981

  • Members
  • PipPipPipPipPipPipPipPip
  • 555 messages

Posté 03 March 2008 - 16:29 PM

Néamoins c'est vrai que j'en était resté avec la bonne vielle ENTERFRAME, un peu archaïque soit... J'avais oublié le timer que j'utilise pourtant! 1-1.ex-aequo icon_wink.gif

#9 crsfff

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 51 messages

Posté 19 April 2008 - 17:14 PM

Bonjour,

j'ai testé les 2 solutions, il y en a une qui ne réagit pas comme je voudrais, et l'autre ne fonctionne pas.

Solution d'Elzean:
Mon movieclip bouge mais seulement quand je clic sur le bouton et qu'ensuite je bouge la souris sur le bouton (ce qui est lié au MOUSE_MOVE)
Or je souhaiterais que seul le maintien du clic provoque le mouvement continu de mon clip, sans qu'il soit nécessaire de faire une autre action ensuite (par exemple comme si je cliquais sur la fleche située en bas de la barre de défilement de mon navigateur internet. 1 clic = mouvement continu de la barre)

Solution d'Aralicia:
J'ai l'erreur suivante:

Action Script

1061: Call to a possibly undefined method addEventListene through a reference with static type flash.utils:Timer.


merci d'avance pour vos lumières

#10 antinua

  • Members
  • PipPipPipPipPipPipPipPip
  • 1067 messages

Posté 19 April 2008 - 17:25 PM

Bonjour.

Une petit faute de frappe, j'avais oublié un 'r':

Action Script

var monTimer:Timer = new Timer(1000); // le Timer genère un évènement toute les secondes (=1000ms)

MonEcouteur.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler)
monEcouteur.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler)
monTimer.addEventListener(TimerEvent.TIMER, maFonction);

function mouseDownHandler(e:MouseEvent):void
{
monTimer.start();
}

function mouseUpHandler(e:MouseEvent):void
{
monTimer.stop();
}
Bonne journée

#11 crsfff

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 51 messages

Posté 19 April 2008 - 17:26 PM

@Aralicia
Après modification, de la coquille sur addEventListener, j'ai l'erreur suivante:

Action Script

TypeError: Error #1034: Echec de la contrainte de type : conversion de flash.events::TimerEvent@383de49 en flash.events.MouseEvent impossible.
at flash.utils::Timer/flash.utils:Timer::_timerDispatch()
at flash.utils::Timer/flash.utils:Timer::tick()


merci d'avance pour ton aide

#12 antinua

  • Members
  • PipPipPipPipPipPipPipPip
  • 1067 messages

Posté 19 April 2008 - 17:30 PM

Bonjour.

La seconde erreur est due au type de maFonction. Visiblement, cette fonction à le prototype suivant :

Action Script


function maFonction(evt:MouseEvent);

Hors, je lui envoie, un TimerEvent (logique, c'est un événement issu du Timer. Logiquement, il faudrait changer le prototype de maFonction pour le prototype suivant:

Action Script


function maFonction(evt:TimerEvent);
// ou même :
function maFonction(evt:Event);

Si tu as besoin absolument d'information contenue dans MouseEvent, et pas dans Event, la manipulation sera un peut plus compliquée.

Bonne journée.

#13 crsfff

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 51 messages

Posté 19 April 2008 - 17:48 PM

Merci Aralicia, cela fonctionne en changeant le prototype


Cela m'amène à trois questions de compréhension. Peux-tu prendre quelques secondes pour y répondre?
1. Pour avoir plus de fluidité dans le mouvement de mon clip, j'ai mis le Timer à 50
Le fait de réduire ce timer et donc de créer des événements toutes les 50ms risque-t-il de créer de quelconques problèmes de mémoire avec le player flash?

2. J'avais mis un prototype MouseEvent sur maFonction dans l'idée que le clip réagisse à une action de la souris.
C'est peut-être une erreur de compréhension de ma part. Peux-tu m'expliquer en quelques mots à quoi sert le prototype d'une fonction? (si il ne sert pas à définir sur quel type d'événement la fonction est appelée, ce que je pensais)

3. Tu parles d'informations contenus dans MouseEvent. Je ne savais pas que c'était possible.
Peux-tu me dire quelles sont les informations que l'on pourrait récupérer? (la position du pointeur de la souris?)

Merci d'avance pour tes éclaircissements


Enfin, je joints le fichier flash qui fonctionne au cas où ça aiderait quelqu'un.

Fichier(s) joint(s)


Modifié par kitsunegari, 19 April 2008 - 17:49 PM.


#14 antinua

  • Members
  • PipPipPipPipPipPipPipPip
  • 1067 messages

Posté 19 April 2008 - 18:21 PM

Bonjour.

1/ Non. J'ai par le passé fait des tests avec des Timers avec une fréquence de 1ms, et même sur 1/2h, l'impact sur la mémoire est négligeable, à condition qu'il n'y ait pas de création d'objets permanents à chaque passage dans l'Event.

2/ Le prototype sert effectivement à spécifier les paramètres reçus ainsi que le type de retour. Mais, il est à savoir que le type Event est un parent de tous les autre type d'évènement, ainsi spécifier que l'objet doit être un Event implique qu'il peut être un MouseEvent, tout comme un TimerEvent.
Dans le cas du code pour clic continu, même si l'évènement est en rapport avec la souris, ce n'est pas un MouseEvent car c'est une réaction personnalisée. Comme c'est le Timer qui génère les évènement durant le clic, alors de type de la fonction doit être TimerEvent (ou Event).

3/ La classe Event contient un certaines informations intéressantes. Parmi celles-ci on trouve :
- Event.target : indique l'émetteur de l'evènement.
- Event.currentTarget : indique l'écouteur de l'evènement
- Event.type : le type de l'evènement (ENTER_FRAME, MOUSE_UP...)
En plus de ces informations, les classes héritant d'Event en on souvent des supplémentaires. Ainsi, MouseEvent possèd parmi ses propriétés :
- MouseEvent.localX, MouseEvent.localY : donne les coordonnées de la souris en fonction le target
- MouseEvent.stageX, MouseEvent.stageY : donne les coordonnées de la souris par rapport au stage
- MouseEvent.altKey, MouseEvent.ctrlKey, MouseEvent.shiftKey : indique si la touche Alt, Ctrl ou Maj (shift) est appuyée
- MouseEvent.delta : indique le décalage de la wheel (dans le cas d'un évènement MOUSE_WHEEL)

On peut retrouver ces informations, et d'autres supplémentaire dans l'aide de Flash, dans la description des classes Event et MouseEvent.

Bonne journée

#15 crsfff

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 51 messages

Posté 19 April 2008 - 21:16 PM

merci beaucoup pour ces réponses très claires icon_smile.gif



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)