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

Flash Pascal Discussion :

Bouton surgissant (onRollover)


Sujet :

Flash Pascal

  1. #1
    Membre expérimenté
    Bouton surgissant (onRollover)
    ci-joint un bouton surgissant :
    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
    121
    122
    123
    124
    125
    126
    127
     
    program Button;
     
    uses
     Flash8;
     
    {$FRAME_WIDTH   500}
    {$FRAME_HEIGHT  400}
    {$BACKGROUND $ffffff}
     
     
    Type  
     TButton = class(MovieClip)
      Bascule:Boolean;
      tx,ty:number;
      Caption: TextField;
      format1,format2: TextFormat;
      constructor Create(x,y,square:number); //position coin en haut à gauche ; square:coté du bouton carré
      procedure DrawButton(BackColor1,BackColor2:integer ;square:number);
      procedure Roundrect(x,y,w,h,radius:number);
      procedure DoKeyDown;
      procedure DoClick;
      procedure DoRoLlOver;
      procedure DoRoLlOut;
     end;
     
    procedure TButton.Roundrect(x,y,w,h,radius:number);
    var
     r,b:number;
    begin
      r := x + w;
      b := y + h;
      moveTo(x+radius, y);
      lineTo(r-radius, y);
      CurveTo(r, y, r, y+radius);
      lineTo(r, y+h-radius);
      CurveTo(r, b, r-radius, b);
      lineTo(x+radius, b);
      CurveTo(x, b, x, b-radius);
      lineTo(x, y+radius);
      CurveTo(x, y, x+radius, y);
    end;
     
     Constructor TButton.Create(x,y,square:number);
     begin
      inherited Create(nil,'button',1);
      _x:=x+square/2;
      _y:=y+square/2;
      tx:=_x;
      ty:=_y;
      Format1 := TextFormat.Create('Arial',18*square/50,$FFFBF0,true,false,false,'','','center');//size de la police en relatif police de 18 pour un bouton de 50 pixels de côté
      Format2:=TextFormat.Create();
      Format2.Underline := True;
      Caption := TextField.Create(Self, '',1,-square/2,-square/2,square,square/2);//je donne des dimensions arbitraires puisque le autosize arrive après...
      //(je suis obligé de remplir le create de caption sinon ça plante) il vaudrait mieux limiter les paramètres dans le create de flash8 et pouvoir compléter à sa guise les propriétés après...
      Caption.setNewTextFormat(Format1);
      Caption.text:='Stop';
      Caption.setTextFormat(0,1,Format2);
      caption.autosize:='center';
      //pour recentrer le titre du bouton
      caption._y:=floor(-square/2+(square-caption.textheight)/2-2); //-2 pour recentrer ? le textheight ne donne pas un résultat top !
      //à voir avec le chef s'il a la solution...
      DrawButton($183EFF,$0A1B6F,square);
      Key.addListener(self);
      Bascule:=False;
      onpress:=DoClick;
      onKeyDown:=DoKeyDown;
      onRollOver:=DoRollOver;
      onRollOut:=DoRollOut;
     end;
     
     Procedure TButton.DrawButton(BackColor1,BackColor2:integer ;square:number);
     var mx:Matrix;
     begin
      lineStyle(3,$000000);
      mx:=matrix.create();
      mx.createbox(1,1,0,0,0);
      begingradientfill('radial',[backColor1,backcolor2],[100,100],[floor(3*square/50),floor(10*square/50)],mx);
      RoundRect(-square/2,-square/2,square,square,square/10);
      endFill;
     end; 
     
    Procedure TButton.doClick;
     begin
      Bascule:=not Bascule;
      if Bascule then
      begin
       Caption.setNewTextFormat(Format1);
       Caption.text:='Play';
       Caption.setTextFormat(0,1,Format2);
       // commande à mettre ici
      end
      else
      begin
       Caption.setNewTextFormat(Format1);
       Caption.text:='Stop';
       Caption.setTextFormat(0,1,Format2);
       // commande à mettre ici
      end;
     end;
     
    Procedure TButton.doKeyDown;
    var k:number;
    begin
     k:= Key.getAscii;
     if (((k=112) or  (k=080)) and  bascule) or (((k=115) or (k=083)) and not bascule)  then doClick;
    end;
     
    procedure TButton.DoRoLlOver;//intéressant...
    var mx,my:number;
    begin
       _xscale:=170;//170%
       _yscale:=170;
       _x :=tx;
       _y :=ty;
    end;
     
    Procedure TButton.DoRoLlOut;// intéressant...
     begin
       _xscale:=100;//échelle normale
       _yscale:=100;
     end;
     
     
    begin
     TButton.Create(200,150,100);
    end.


    @+

    l'idée vient de là :http://www.wks.fr/Creer-un-bouton-grossissant-a-son.html

    J'ai essayé d'implanter un bouton avec button de flash8...sans succès

  2. #2
    Rédacteur/Modérateur

    Citation Envoyé par Archimède Voir le message
    ci-joint un bouton surgissant
    Pas mal!

    Je ne peux pas t'aider mais tu as mes encouragements.

    As-tu remarqué que les coins (si je puis dire) du bouton sont bien faits quand le bouton est en grand, mais moins jolis quand le bouton est réduit ?

  3. #3
    Membre expérimenté
    Merci

  4. #4
    Expert éminent sénior
    c'est pas mal du tout

    concernant le constructor de TextField, les paramètres ne sont pas optionels, il faut donc bien les renseigner, mais avec un AutoSize tu peux mettre les dimensions à 0 ça fonctionnera aussi.

    Pour l'effet de bavure sur les coins je ne vois pas d'autre solution que d'élargir un peu le trait; avec une épaisseur de 4 l'antialiasing appliqué est moins visible.

    et pour la position du Caption voici plus simple et plus juste
    caption._y:= -caption._height/2;...la différence entre _height et textHeigth m'échappe dans la cas présent

    Remarque: à chaque fois que tu as du utiliser Floor() c'est lié à un usage abusif de Integer au lieu de Number dans l'unité Flash8

    EDIT: à priori il n'est pas possible de créer une instance de la classe Button() directement en ActionScript, il faut passer par l'éditeur Flash...il faudra peut-être que j'intègre une directive de compilation du type:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    {$BUTTON 'name', x, y, w, h, 'Caption'}

    il faudra que je regarde l'intérêt de la chose car avec un MovieClip on fait déjà de belles choses
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre expérimenté
    Merci Chef pour tes encouragements et tes conseils toujours très justes...
    C'est vrai qu'avec MovieClip, on peut faire à peu près tout ce que l'on veut...
    Je vois pas vraiment l'intérêt de pouvoir implanter Button...

    J'ai encore une question toute bête... mais comment tu fais pour créer tes propres unit avec ton éditeur.
    Si je construis une unité du style :
    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
     
    unit
    interface
     
    uses
     
     
    type
     
      end;
     
    var
     
    implementation
     
    end.


    Si je l'ajoute dans program dans la partie Uses comme en delphi, ça ne marche pas.

    J'aimerais pouvoir me créer une unit Reelmovie, button etc et éviter de me trimbaler tout le code dans program à chaque fois.

    merci

  6. #6
    Expert éminent sénior
    Citation Envoyé par Archimède Voir le message
    Merci Chef pour tes encouragements et tes conseils toujours très justes...
    C'est vrai qu'avec MovieClip, on peut faire à peu près tout ce que l'on veut...
    Je vois pas vraiment l'intérêt de pouvoir implanter Button...

    J'ai encore une question toute bête... mais comment tu fais pour créer tes propres unit avec ton éditeur.
    il suffit de créer manuellement le fichier .PAS puis de l'ajouter dans le Uses

    mais j'ai une bonne et une mauvaise nouvelle

    la mauvaise c'est que la version que tu as permet simplement d'utiliser la partie INTERFACE des unités, ça permet donc de déclarer les classes externes mais tout ce qui ce trouve dans la partie IMPLEMENTATION est ignoré ... à mon avis, suite à un bug il doit cependant être possible de placer les TYPE dans une unité et l'implémentation dans le programme principal

    la bonne nouvelle c'est que j'ai apporté justement cette modification ce weekend ! avec la nouvelle version dont une bonne partie du compilateur a été modifiée, il y a le support de la partie IMPLEMENTATION des unités !

    par contre je voulais attendre avant de publier cette modif car il y a un inconvénient tout de même...tout le code est placé dans le SWF...même celui des classes qui ne sont pas utilisées dans le projet

    dans l'état actuel ça peut être pratique pour scinder le code mais pas pour créer des bibliothèques réutilisables...il faut absolument que je gère le code mort et ça demande là encore un peu de réécriture car actuellement le code est généré en direct sans savoir s'il sera utilisé ou pas...il faut que je le mette en cache pour n'inclure au final que la partie utile.

    j'ai d'autres modifications dans cette version à venir :
    - les valeurs constantes sont évaluées à la compilation au lieu d'inclure l'expression (exemple 1/2 est codé en 0.5 et non par l'opération 1 / 2)
    - support du WITH
    - support des RECORD

    je travaille aussi sur la possibilité d'avoir plusieurs valeurs dans un CASE (actuellement une seule valeur est acceptée)

    j'en ai profiter pour corriger quelques bugs (et probablement en introduire quelques autres )
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre expérimenté
    J'avais bien remarqué que la partie implementation était ignorée...
    le with do et le record merveilleux
    J'attends avec impatience the next great version
    On pourra commencer à se faire des outils réutilisables sans trop de galère...



    @+

###raw>template_hook.ano_emploi###