Introduction à la Programation Orientée Objet (ou OOP) - partie 2

Exemple concret

Si vous êtes un Flash designer comme moi, vous utilisez peut-être souvent des MovieClips pour animer des boutons. Prenons un exemple où, au MOUSE_OVER l'animation se joue à partir de l'image 2 et au MOUSE_OUT, à partir de l'image 10. En actionscript 3.0, voici le code que nous répetons souvent:

my_mc.mouseChildren = false;
my_mc.buttonMode = true;
my_mc.addEventListener(MouseEvent.MOUSE_OVER, over);
my_mc.addEventListener(MouseEvent.MOUSE_OUT, out);

function over(e:MouseEvent):void
{
    e.target.gotoAndPlay(2);
}

function out(e:MouseEvent):void
{
    e.target.gotoAndPlay(10);
}

Le fait d'avoir utilisé e.target.gotoAndPlay() nous permet de réutiliser ces fonctions pour chaque nouveau boutons. Mais on n'échape pas aux 4 premières ligne de codes. Imaginez pouvoir écrire:

var btn01:AnimatedButton = new AnimatedButton(my_mc, 2, 10);

Cette seule ligne de code ferait tout ce que fait le bloc de code précedent. Sur 10 boutons, ça fait au moins 30 lignes de codes en moins...Ce n'est pas négligeable.

Voici comment créer cette objet:

Créer son propre objet

Ouvrez Flash, et créez un nouveau document Actionscript (.as). Flash se transforme maintenant en un sorte d'éditeur de texte. L'actionscript n'est plus écrit sur une image mais directement dans un fichier texte. Sauvegardez le sous "AnimatedButton.as". Il est très important que le nom du fichier .as soit le même que celui de l'objet, majuscules et miniscules compris, faute de quoi, Flash nous donnera des erreurs ! Pour simplifier, nous partirons du principe que nous copierons toujours ce fichier .as à la racine de nos projets. En programmation, le code qui définit un objet est appelé une "classe". Nous allons définir une "classe" en actionscript, ce qui nous permettra d'utiliser notre nouvel objet.

Une classe s'écrit comme suit:

package
{
    public class AnimatedButton
    {
       
    }
}

Le "package" sera expliqué dans une autre leçon, mais doit être noté ici. Puis, on déclare une class "AnimatedButton", publique, pour que nous puissions toujours l'utiliser. Maintenant, nous allons ajouter un "constructeur" à notre classe. Lorsque vous utilisez la syntaxe "new" (var xml:XML = new XML()), vous demandez en fait à la classe de "construire" un nouvel objet. On crée un constructeur comme suit:

package
{
    public class AnimatedButton
    {
        public function AnimatedButton()
        {
           
        }

    }
}

On crée une fonction qui porte le même nom que la classe. En OOP, on est obligé de toujours déclaré l'accessibilité d'une fonction ou d'une variable. En mettant le mot clé "public", on déclare que cette fonction peut être utilisé par tout le monde. En la déclarant "private", son accès est restreint. Nous verrons un exemple de "private" plus loin.

Maintenant, nous avons crée un objet ! Mais il n'est pas très utile pour l'instant. Ajoutons un paramètre dans notre constructeur.

package
{
    public class AnimatedButton
    {
        public function AnimatedButton(mc:MovieClip)
        {
           
        }
    }
}

En ajoutant ce bout de code, nous disons à Flash que, s'il veut pouvoir crée cet objet, il sera obligé de passer une référence à un MovieClip en paramètre au constructeur. Donc, on ne devra pas écrire var btn:AnimatedButton = new AnimatedButton(); mais var btn:AnimatedButton = new AnimatedButton(my_mc);

Dans le constructeur, on peut directement manipuler ce my_mc. Ajoutons quelques actions à notre constructeur:

package
{
    public class AnimatedButton
    {
        public function AnimatedButton(mc:MovieClip)
        {
            mc.mouseChildren = false;
            mc.buttonMode = true;

        }
    }
}

A présent, dès qu'un nouveau AnimatedButton est crée, la référence qu'il reçoit en paramètre est automatiquement changée et ses propriétés "mouseChildren" et "buttonMode" sont modifiées. A présent testons notre code. Dans un .fla dans le même dossier que notre .as, créez un simple MovieClip et donnez lui un nom. Tout au début de votre code, écrivez "import AnimatedButton;" (sans le .as). Puis, créez un nouvel objet "AnimatedButton" et passez votre MovieClip en référence. Lorsque vous testerez votre .swf, vous recevrez une erreur:

"Type was not found or was not a compile-time constant: MovieClip"

Qu'est ce que ça signifie ? Et bien, un objet n'a pas forcément le droit d'utilser d'autres objets. Notre objet AnimatedButton n'a pas encore le droit d'utiliser des objets MovieClip. Comment lui donner le droit ? Il faut importer les objets qu'on veut réutiliser dans notre classe. Ce qui se fait comme suit:

package
{
    import flash.display.MovieClip;
   
    public class AnimatedButton
    {
        public function AnimatedButton(mc:MovieClip)
        {
            mc.mouseChildren = false;
            mc.buttonMode = true;
        }
    }
}

Nous n'avons pas l'habitude de reclamer le droit d'utiliser des objets puisque Flash le fait automatiquement pour nous derrière les coulisses. Mais lorsque nous créons nos propres objets, Flash ne nous surveille pas, et nous devons faire cette partie nous même. Si nous testons notre code maintenant, nous ne recevrons plus d'erreurs et nous voyons qu'effectivement, notre pointeur se change en main lors du survol de notre MovieClip.

Passons à la suite

Page 1 - Page 2 - Page 3