Transformer un programme as3 du procédural au classe

Fermé
hichem1967 Messages postés 3 Date d'inscription mardi 19 juillet 2016 Statut Membre Dernière intervention 21 juillet 2016 - Modifié par hichem1967 le 20/07/2016 à 22:00
hichem1967 Messages postés 3 Date d'inscription mardi 19 juillet 2016 Statut Membre Dernière intervention 21 juillet 2016 - 21 juil. 2016 à 20:10
Bonjour,
Je suis nouveau en action script 3 et j'essais de developper des applications éducatives. Pour faire des exercices interactifs du type Relier par une flèche, j'ai écrit le script suivant (en bas). Le problème c'est que je n'ai pas réussi à le transformer en classe pour pouvoir l'appeler depuis les exercices et je me trouve obligé à le réécrire à chaque fois. Merci de m'aider à le transformer en classe.
Pour le tester, il suffit de mettre sur la scène 3 clips et leurs images et les nommer
p1,p2,p3 ...........> p1_target.p2_target et p3_target et relier.
Cordialement. Hichem



import flash.geom.Point;
import flash.display.Shape;
import flash.events.MouseEvent;
import flash.display.DisplayObject;


var M:Point = new Point();
var N:Point = new Point();
var s : Shape = new Shape();
addChild(s);
var dragPoint : DisplayObject;
var cible : DisplayObject;

var pieces:Array = [p1,p2,p3];
var lng:int = pieces.length;

for (var i : int = 0; i < lng; i++)
{
dragPoint = pieces[i];
dragPoint.addEventListener(MouseEvent.MOUSE_DOWN, setPoint);
}

function setPoint(e:MouseEvent):void
{
M.x = mouseX;
M.y = mouseY;
s = new Shape();
stage.addChild(s);
stage.addEventListener(MouseEvent.MOUSE_MOVE, drawing);
}


function drawing(e: MouseEvent):void
{
s.graphics.clear();
s.graphics.lineStyle(4,0x000000,1);
s.graphics.moveTo(M.x,M.y);
N.setTo(mouseX,mouseY);
s.graphics.lineTo(N.x,N.y);
stage.addEventListener(MouseEvent.MOUSE_UP, end);
}


function end(e:MouseEvent):void
{

stage.removeEventListener(MouseEvent.MOUSE_MOVE, drawing);
for (var i: int = 0; i < lng;i++)


{
dragPoint = pieces[i];
cible = getChildByName(dragPoint.name + "_target");
if (dragPoint.hitTestPoint(M.x,M.y) && cible.hitTestPoint(N.x,N.y))
{
dragPoint.removeEventListener(MouseEvent.MOUSE_DOWN, setPoint);
}

else if (dragPoint.hitTestPoint(M.x,M.y, false))
{
s.graphics.clear();
}
}
}
.......................................................
Re_Bonjour,

Voici ce que j'ai pu faire en termes de classe:

1. la classe RelierFlexche.as qui décrit contient 3 méthodes: setM() (se positionner), draw() pour dessiner et end() pour arrêter le dessin.

2. la classe Main pour instancier la classe RelierFleche.

3. le fichier Relier.fla qui contient les clips de départ et d'arrivée. Le problème c'est que contrairement à lq pré,fière représentation M écriture procédurale le programme marche convenablement alors qu'écrit en classes et particulièrement la fonction end() ne fonctionne pas et les instructions M

if (hitTestPoint(M.x,M.y) && cible.hitTestPoint(N.x,N.y))

{

removeEventListener(MouseEvent.MOUSE_DOWN, setM);

}

else if (hitTestPoint(M.x,M.y, false))

{

s.graphics.clear();

}

ne donnent aucun effet et ceci est visible sur le fichier RelierFleche.fla




2 réponses

hichem1967 Messages postés 3 Date d'inscription mardi 19 juillet 2016 Statut Membre Dernière intervention 21 juillet 2016
20 juil. 2016 à 22:07
3eme image:
0
Attention que si vous êtes habitué aux langages objets compilé les versions scripts sont largement inférieures à celles de classe(l'héritage entre autres).
Pour AS3 je ne pourrais pas vous aider mais la spécification ECMA script qui est à l'origine de action script et de javascript fonctionne sur le modèle de prototype plus que de classes.
En gros tout les objets sont des fonctions avec des attributs.
Cela permet des avantages pratiques non négligeables(et à aussi des inconvénients comme la sécurité ) et cela reste une astuce pour se calquer sur les programmation objets que peuvent avoir C++ ou Java par exemple.

Donc pas besoin de main non plus pour maintenir un pattern de type MVC, on se contentera d'un manager en guise de main et pas de multi-threading(les scripts étant interprétés il n'y a pas le rapport avec le processeur et la gestion de la mémoire que peut avoir un langage compilé.

Bon celà qui ne vous aidera pas mais ce que je veux dire c'est que la POO en script si elle est inspiré des langages compilés à aussi ses propres particularités qui nécessitent une autre réflexion qu'avec un langage "vraiment" objet(donc des classes).

Avec Flash il y a quand même compilation mais c'est encore autre chose, c'est aussi pour l'encapsulation qu est un principe récurent et permet de manipuler timeline et scène inclus au programme, et rends la Vue plus dépendante que dans les pattern MVC classique.

Attention aussi aux noms de fonctions qui seraient des mots réservés(comme draw, end, point.... il y a des chances que des fonctions/objets existent déjà) et cela posera problème.

Pour repérer vos erreurs vous avez le débogueur, il vous indiquera déjà si le programme comporte des erreurs et lesquelles.
Une bonne habitude(et convention) est d'écrire les noms de classes avec une majuscule et les instances objets en minuscule. Cela évite les confusions et permet une fois habitué une meilleure lecture. Les deux doivent toujours être écris différement(sinon comment l fait à comprendre le programme que vous faites référence à "bob" l'instance ou "bob" la classe-soit la structure qu'auront toutes les instance de bob).

Sinon pas de raisons que vos instances de classes ne soient pas créés et que votre programme ne marche pas.
Enfin sauf qu'en procédural sur Flash en actionscript c'est l'encapsulation et la timeline qui aurons le rôle d'indiquer une partie de l'algorithmique du programme...et ce sont ces mauvaises méthodes qui ont poussé Adobe après le rachat de Flash à aller vers AS3 et de meilleures habitudes de programmation.

Même si comme on a remarqué cela n'a pas sauvé Flash du désastre d'être un logiciel complètement dépassé(et remplacé par des API javascript libre et gratuites utiliser et incluses dans les pages web ce que n'aura jamais été Flash et pose des problèmes insidieux ainsi qu'une concurrence commerciale et industrielle dans un domaine ou la normalisation et l'ouverture ainsi que la gratuité d'utilisation et d'accès au sources du programme sont des piliers et axe de l'évolution technologique).
0
hichem1967 Messages postés 3 Date d'inscription mardi 19 juillet 2016 Statut Membre Dernière intervention 21 juillet 2016
21 juil. 2016 à 20:10
Bonjour sanchopansa et Merci beaucoup pour ces précieux conseils. J'ai bien changé les noms de mes fonctions pour éviter les mots réservés de Flash. J'ai également controlé le débogueur mais il ne m'indique aucune erreur ni compilation ni exécution. Toujours pas de changement, la fonction (end) devenue (FinDessine) n'a pas aboutit. J'aurai souhaité des indications techniques, mais merci beaucoup comme même pour votre réponse et pour vos conseils.
0