Forums Développement Multimédia

Les formations Mediabox
Les formations Mediabox

Bouton 2D générique

Compatible Director. Cliquer pour en savoir plus sur les compatibilités.Par matse, le 13 octobre 2005

Voici un comportement permettant de faire des boutons et des groupes de boutons (on sélectionne un bouton, les autres sont désélectionnés) 2D.

Pour que ça fonctionne correctement vous devez créer un nouveau script d'animation et le nommer “Actions_boutons”.
Toutes les méthodes que vous déclarerez dans le script “Actions_boutons” seront disponibles pour les boutons.

Par exemple si vous créez dans le script “Actions_boutons” un gestionnaire comme celui ci :

on gestionnaireTest
 alert "appel du gestionnaire test"
end

vous pourrez choisir “gestionnaireTest” dans l'onglet action du bouton (gestionnaire de propriétés).

Bien entendu cela fonctionne pour les groupes de boutons, si vous en avez un sélectionné par défaut il effectuera son action dès son apparition, si vous avez sélectionné un repère de destination il effectuera son action avant de s'y rendre… etc

Pour que l'option texte fonctionne il faut que le texte de votre bouton soit positionné sur la piste suivant celle du bouton dans le scénario.
Par exemple si votre bouton est le sprite 28, son texte devra être le sprite 29.

--------------------------------------------- 
-- Generic 2D button behavior 
-- by Mathieu Sénidre aka Matse
-- matse@skwatt.com 
-- USE AND DISTRIBUTE FREELY
-- ##########################################
-- Note : in order to get this script working
-- properly you have to create a movie script
-- and name it "Actions_boutons".
-- every method in the movie Script will be
-- available for the buttons
--------------------------------------------- 
-- Comportement de bouton 2D généraliste 
-- par Mathieu Sénidre alias Matse 
-- matse@skwatt.com 
-- UTILISEZ ET DISTRIBUEZ LIBREMENT 
-- ##########################################
-- Note : pour que le script fonctionne 
-- correctement vous devez créer un script
-- d'animation et le nommer "Actions_boutons"
-- Toutes les méthodes de ce script seront
-- accessibles depuis les boutons
---------------------------------------------
global gListeGroupesSelection -- liste contenant une liste pour chake groupe de sélection
global gListeBoutonsSelected  -- liste contenant la réf du sprite sélectionné ds chake groupe
property pAction              -- action associée au bouton
property pParameter           -- paramètre optionnel pour l'action sélectionnée
property pDestination         -- destination associée au clic sur le bouton
property pMember              -- acteur bitmap du bouton
property pMemberSurvol        -- acteur bitmap du bouton suvolé
property pTexte               -- booléenne, TRUE quand le bouton est associé à un texte
property pTxtColor            -- Couleur du sprite-texte associé au bouton
property pTxtColorSurvol      -- Couleur du sprite-texte associé au bouton lors du survol
property pGroupeSelection     -- n° du groupe aukel le bouton est associé, 0 = AUCUN
property pSelectedAtStart     -- booléenne : indique si ce bouton est sélectionné par défaut ou pas
property mySprite             -- référence du sprite-bouton
property myTxt                -- référence du sprite-texte associé au bouton
property pIsMouseDown         -- TRUE kan la souris a cliké ce sprite et ke le clic est tjs enfoncé
 
on getpropertydescriptionlist me
 -- ce gestionnaire définit l'interface du comportement dans l'inspecteur de propriétés
 props = [:]
 tListe = member("Actions_Boutons").script.handlers()
 tListe.add("-Aucune-")
 
 addprop props, #pAction, [#default:"-Aucune-", #format:#string, #range:tListe, #comment:"Action ?"]
 tLabels = the labellist
 tListe = ["-Aucune-"]
 
 repeat with i = 1 to tLabels.line.count
   tListe.add(tLabels.line[i])
 end repeat
 
 addprop props,#pParameter,[#default:#none, #format:#symbol, #comment:"paramètre optionnel (symbol)"]
 addprop props,#pDestination,[#default:"-Aucune-", #format:#string, #range:tListe, #comment:"Destination ?"]
 addprop props,#pMember,[#default:"bouton", #format:#string, #comment:"acteur"]
 addprop props,#pMemberSurvol,[#default:"bouton_roll", #format:#string, #comment:"acteur survol"]
 addprop props,#pTexte,[#default:false,#format:#boolean,#comment:"texte ?"]
 addprop props,#pTxtColor,[#default:rgb(0,0,0), #format:#color, #comment:"couleur txt"]
 addprop props,#pTxtColorSurvol,[#default:rgb(255,255,255), #format:#color, #comment:"couleur txt survol"]
 tListe = [#min:0,#max:6]
 addprop props,#pGroupeSelection,[#default:0,#format:#integer,#range:tListe,#comment:"groupe sélection"
 &RETURN&"0 = AUCUN"]
 addprop props,#pSelectedAtStart,[#default:false, #format:#boolean, #comment:"Sélectionné par défaut ?"]
 
 return props
end
 
on beginsprite me
 -- on référence le sprite courant dans une variable pour se simplifier la vie
 mySprite = me.spritenum
 
 -- on affecte l'acteur défini via l'inspecteur de propriétés au sprite
 sprite(mySprite).member = pMember 
 
 -- si un texte est associé au bouton
 if pTexte then 
 -- le texte doit être sur la piste suivant celle du bouton
   myTxt = me.spritenum+1 
  -- on colore le texte tel que défini dans l'inspecteur de propriétés
   sprite(myTxt).color = pTxtColor  
 end if
 
 -- si ce bouton fait partie d'un groupe de sélection
 if pGroupeSelection <> 0 then 
 -- si la liste des groupes de sélection n'est pas définie
   if voidp(gListeGroupesSelection) then 
     gListeGroupesSelection = [#ID:the frame, #groupes:[[],[],[],[],[]] ]
     gListeBoutonsSelected = [0,0,0,0,0]
   else -- la liste est définie
     -- la frame courante est différente de celle définie dans la liste :
     -- il faut réinitialiser la liste
    if gListeGroupesSelection.ID <> the frame then 
       gListeGroupesSelection = [#ID:the frame, #groupes:[[],[],[],[],[]] ]
       gListeBoutonsSelected = [0,0,0,0,0]
     end if
   end if
 
  -- on ajoute le sprite à son groupe de sélection dans la liste
   gListeGroupesSelection.groupes[pGroupeSelection].add(mySprite)  end if
 
 pIsMouseDown = false
 
 -- si ce bouton est sélectionné par défaut
 if pSelectedAtStart then 
   -- on lui fait éxécuter les mêmes actions ke si l'utilisateur avait cliqué dessus
   me.mousedown()
   me.mouseup()
   me.survol()
 end if
end
 
on mouseenter me
 -- le bouton ne fait pas partie d'un groupe de séléction
 if pGroupeSelection = 0 then 
 
   survol() -- on éxécute le rollover
 
 else -- le bouton fait partie d'un groupe de sélection
  -- si le bouton sélectionné dans le groupe n'est pas ce bouton
   if gListeBoutonsSelected[pGroupeSelection] <> mySprite then 
     survol() -- on éxécute le rollover
   end if
 end if
 cursor(280) -- on change le curseur pour indiquer qu'il s'agit d'un bouton
end
 
on survol
 -- on change l'acteur du sprite par celui devant servir au rollover
 sprite(mySprite).member = pMemberSurvol 
 -- si un texte est associé au bouton on change sa couleur pour refléter le rollover
 if pTexte then sprite(myTxt).color = pTxtColorSurvol 
end
 
on mouseleave me
 -- le bouton ne fait pas partie d'un groupe de séléction
 if pGroupeSelection = 0 then 
 
   finSurvol() -- on éxécute le rollout (fin du rollover)
 
 else -- le bouton fait partie d'un groupe de sélection
  -- si le bouton sélectionné dans le groupe n'est pas ce bouton
   if gListeBoutonsSelected[pGroupeSelection] <> mySprite then 
     finSurvol() -- on éxécute le rollout (fin du rollover)
   end if
 end if
 
 cursor(-1) -- on remet le curseur à son état par défaut
end
 
on finSurvol
 -- on change l'acteur du sprite par celui d'origine
 sprite(mySprite).member = pMember 
 -- si un texte est associé au bouton on remet sa couleur d'origine
 if pTexte then sprite(myTxt).color = pTxtColor 
end
 
on mousedown me
 pIsMouseDown = true
end
 
on mouseup me
 -- le clic doit avoir été fait sur le bouton
 if pIsMouseDown then    
   -- le bouton fait partie d'un groupe de séléction
   if pGroupeSelection <> 0 then 
     -- si aucun des boutons du groupe n'est sélectionné
     if gListeBoutonsSelected[pGroupeSelection] = 0 then 
       -- le bouton sélectionné pour ce groupe devient ce bouton
       gListeBoutonsSelected[pGroupeSelection] = mySprite 
 
     else -- il y a déjà un bouton du groupe qui est sélectionné
       -- le bouton cliqué était le bouton sélectionné dans son groupe
       if gListeBoutonsSelected[pGroupeSelection] = mySprite then 
         -- ce bouton n'est plus sélectionné, aucun bouton n'est sélectionné dans le groupe
            gListeBoutonsSelected[pGroupeSelection] = 0 
       else -- le bouton cliqué n'était pas celui sélectionné dans son groupe
         -- on remet le bouton anciennement sélectionné à son état de base
         sprite(gListeBoutonsSelected[pGroupeSelection]).finSurvol()
         -- le bouton sélectionné pour ce groupe devient ce bouton
         gListeBoutonsSelected[pGroupeSelection] = mySprite 
 
       end if
     end if
   else
     cursor(-1)
   end if   
 
   if pAction <> "-Aucune-" then -- si une action a été définie via l'inspecteur de propriété
     call(symbol(pAction), script("Actions_boutons"), pParameter) -- on éxécute l'action
   end if
 
   if pDestination <> "-Aucune-" then -- si un repère de destination a été défini via l'inspecteur de propriétés
     go to pDestination -- on se rend au repère de destination
     cursor(-1) -- on remet le curseur à son état par défaut
   end if
 
   pIsMouseDown = false
 end if
end
 
on mouseupoutside me
 -- si le clic se termine en dehors du sprite on ne le prend pas en compte
 pIsMouseDown = false
end

N'hésitez pas à me laisser des commentaires pour toute suggestion d'amélioration / bug

Tutorial by Matse