Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

[FLASH] APPROCHE DE L'AS PAR LE DESSIN (AVEC L'API DE FLASH)


Information sur le tutorial

Catégorie :ActionScripts Date de création : 10/08/2005 02:29:59 Vu : 14 097 fois

Note :
7,56 / 10 - par 9 personnes
7,56 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (23)
Ajouter un commentaire et/ou une note

Description

Quelques bases de tracé dynamique...

Tutorial

Bonjour,

Ce tutoriel est  inspiré  du livre  “Actionscript en action“ de Joey Lott.
et d’un code de Blacknight91titi.

Il s’adresse à ceux qui (commen moi évidemment) ont télécharger une
bonne quarantaine de sources et n’ont toujours rien capter en AS.
C’est juste une piste.


Pour commencer ouvre un nouveau .fla, dans fenêtre choisis le panneau Action et le panneau Info.

Le panneau Info peut te servir entre autre à te situer sur la scène avec les coordonnées x et y .

Le trait.

Nous allons d’abord créer un nouveau MovieClip vide. (pour y insrire notre trait).
Inscrit ce code dans la boîte de dialogue (panneau Action :-)

this.createEmptyMovieClip("montrait",1);

//this ->est utilisé pour cibler le MovieClip.
//montrait -> comme on aurait pu l’appeler moncafé ou monhuître.
//1 -> définit son niveau.


Ensuite on vas définir les propriétés du trait.
Code :

montrait.lineStyle(3.0,0x000000,100);

//3.0 -> l’épaisseur de montrait.
//0x000000 -> sa couleur (ici noir).
//100 -> le pourcentage de son alpha.

Pour donner un point de départ au trait nous allons utilisé les coordonnées x et y .
(par défaut les coordonnés partent du coin en haut à gauche de la scène) :

montrait.moveTo(90,224);

//90 ->x
//224 -> y

Et on lui donne un point d’arrivée :

montrait.lineTo(275,224);

la courbe.

this.createEmptyMovieClip("macourbe",1);
//on crée le clip.

macourbe.lineStyle(3,0x000000,100);
//on définit les propriétés.

macourbe.moveTo(97,224);
//1er point (x,y)

macourbe.curveTo(186,180,275,224);
//point de croisée des tangentes, second point.(x,y,x,y).

le carré.

this.createEmptyMovieClip("moncarré", 1);
moncarré.lineStyle(3,0x000000,100);
moncarré.moveTo(97,229);

//(x,y) en bas à gauche.

moncarré.lineTo(97,98)
;
//(x,y) en haut à gauche.

moncarré.lineTo(280,98);
//(x,y) en haut à droite.

moncarré.lineTo(280,229);
//(x,y) en bas à droite.

moncarré.lineTo(97,229);
//on relie au 1er point.

Une forme avec droite et courbe.

this.createEmptyMovieClip("maforme",1);
maforme.lineStyle(3,0x000000,100);
maforme.moveTo(97,229);
maforme.lineTo(97,98);
maforme.curveTo(185,50,280,98);
maforme.lineTo(280,229);
maforme.curveTo(185,277,97,229);


La même forme avec un remplissage.

this.createEmptyMovieClip("maforme",1);
maforme.beginFill(0xD9D9DB,100);

//on commence le remplissage.
//0xD9D9DB,100 -> couleur (ici gris) et alpha.

maforme.lineStyle(3,0x000000,100);
maforme.moveTo(97,229);
maforme.lineTo(97,98);
maforme.curveTo(185,50,280,98);
maforme.lineTo(280,229);
maforme.curveTo(185,277,97,229);
maforme.endFill();

// on termine le remplissage


Le dégradé

(cette fois j'écris le code comme tu le trouveras dans un .fla)

Linéaire:

this.createEmptyMovieClip("mondégradé",1);
        //on crée un nouveau clip
mondégradé
.lineStyle(1.5,0x7C7C7C,100);
with (this.mondégradé){
        remplissage=
"linear";
        //remplissage de type linéaire
        couleurs=[0x0000FF,0x00FF00,0x0000FF];
        //couleurs (ici haut, millieu, bas)
        alphas=[100,100,100];
        ratios= [0,127,255];
        //s'exprime en % de 0 à 255 %
matrix={matrixType:
"box",x:25,y:0,w:100,h:100,r:Math.PI/2};
        //matrice : ici tu change les paramètres x,y du dégradé
        //hauteur,largeur et direction

beginGradientFill(remplissage,couleurs,alphas,ratios,matrix);
        moveTo(25,0);
        lineTo(125,0);
        lineTo(125,100);
        lineTo(25,100);
        lineTo(25,0);
endFill;
        //on ferme le remplissage
}


Radial:

this.createEmptyMovieClip("mondégradé",1);
mondégradé.lineStyle(1.5,0x7C7C7C,100);
with (this.mondégradé){
        remplissage="radial";
        //remplissage de type radial
        couleurs=[0xFFFFFF,0x000000];
        //couleurs (ici blanc au centre noir au bord)
        alphas=[100,100];
        ratios= [0,255];   
matrix={matrixType:"box",x:180,y:100,w:200,h:200,r:Math.PI/2};
beginGradientFill(remplissage,couleurs,alphas,ratios,matrix);
        moveTo(92,68);
        lineTo(470,68);
        lineTo(470,327);
        lineTo(92,327);
        lineTo(92,68);
endFill;
}


Le cercle.

(voilà je reprend ma façon d'écrire ... plus facile..)

Pour le cercle c’est un peu plus compliqué. Car si tu utilise quatre courbes pour ce faire ça va te donner un cercle pas rond.

this.createEmptyMovieClip("moncercle",1);
moncercle.lineStyle(3,0x000000,100);
moncercle.moveTo(106,160);
moncercle.curveTo(106,80,186,80);
moncercle.curveTo(266,80,266,160);
moncercle.curveTo(266,240,186,240);
moncercle.curveTo(106,240,106,160);


Car il s’agit là de courbes de Bézier quadratiques (3 points d’ancrage).
Nous utiliserons donc huit curveTo() afin de se rapprocher au mieux de quatre courbes de Bézier cubiques (4 points d’ancrage).

Voici une technique :

MovieClip.prototype.drawCircle=function(rayon,x,y) {
//on crée la méthode

var monangle=Math.PI/4;
//il s'agit de calculer l'angle des huit segments, 360°/8= 45°= ?/4radians

var ctrlDist=rayon/Math.cos(monangle/2);
//faut prendre une équerre, un compas...
//on calcule la distance entre les points

var angle=0;
//on intitialise l'angle

var rx,ry,ax,ay;
//on définit les variables locales

this.moveTo(x+rayon,y);
//premier point

for (var i=0;i<8;i++) {
//on répéte huit fois l'opération = huits segments

angle+=monangle;
//on incrémente l'angle de monangle pour créer le cercle

rx=x+Math.cos(angle-(monangle/2))*(ctrlDist);
ry=y+Math.sin(angle-(monangle/2))*(ctrlDist);

//points de contrôle

ax=x+Math.cos(angle)*rayon;
ay=y+Math.sin(angle)*rayon;

//points terminaux de la courbe

this.curveTo(rx,ry,ax,ay);
//on dessine le segment

    }
};


var moncercle=this.createEmptyMovieClip("moncercle",1);
//on crée le clip

moncercle.lineStyle(3,0x000000,100);
//on définit ses propriétés

moncercle.drawCircle(80,186,160);
//rayon,x,y

le ploygone régulier:

MovieClip.prototype.dPR=function(cotes,longueur,rotation,x,y){
//on invoque la méthode (dessine Polygone Régulier)

rotation=Math.PI*rotation/180;
//on convertit rotation de degrés en radians

var angle=(2*Math.PI)/cotes;
//2π/radians l'angle de ces segments = 2π / nb. de segments

var rayon=(longueur/2)/Math.sin(angle/2);
//longueur du rayon du cercle qui circonscrit le polygone

var px=(Math.cos(rotation)*rayon)+x;
var py=(Math.sin(rotation)*rayon)+y;

//trigonométrie: rayon est l'hypothénuse et rotation l'angle.

this.moveTo(px,py);
//se déplace au points de départ sans tracer de ligne

for (var i=1;i<=cotes;i++){
px=(Math.cos((angle*i)+rotation)*rayon)+x;
py=(Math.sin((angle*i)+rotation)*rayon)+y;
this.lineTo(px,py);

//on dessine chaque cotés. on calcule les coordonnées du sommet à l'aide
//des formules trigonométriques utilisées pour calculer px et py
    }
};

this.createEmptyMovieClip("monpolygone",1);
monpolygone.lineStyle(2,0x000000,100);
monpolygone.dPR(7,100,0,200,200);

Une forme complexe

Lorsque les coordonnées sont trop nombreuses (dans le cas d’une carte géographique par ex.) on
peut utiliser une technique pour charger les informations stockées un fichier externe.
On utilisera pour ça une boucle for() et un tableau a deux dimensions,
Voici une techique avec un fichier .txt, fichier que l’on créeras à l’aide du bloc-notes (TextEdit pour Mac).


Dans le bloc notes on mettras par ex :

point=166,201;151,200;134,189;120,175;111,156;108,133;114,120;140,106;168,95;199,94;212,101;229,113;243,118;
260,111;270,110;276,115,282,127;283,141;282,153;287,168;302,179;309,189;309,203;302,213;297,221;288,234;
282,246;276,257;271,271;261,283;252,298;249,313;242,322;232,321;224,313;215,298;206,286;201,269;202,240;203,245;
201,223;197,213;177,203;166,201

(c’est l’afrique… bon vite fait quoi !)

Et dans Flash :

ok = false;

//on coupe le onEnterFrame

Loader = new LoadVars();

//on crée un nouveau LoadVars()

Loader.load("file://Rafael/Desktop/Afrique/coordonnés.txt");
//on charge le fichier

Loader.onLoad = function(Success) {

//on définis la méthode onLoad

if (Success) {
//si c'est chargé

map = Loader.point.split(";");
//on sépare les ";" des coordonnées

for (j=0; j
map[j] = map[j].split(",");

//on sépare les ","

       }
_root.createEmptyMovieClip("clip", 1);

//on crée un clip

clip.lineStyle(2, 0x000000, 100);
//on lui donne des propriétés

clip.moveTo(map[0][0], map[0][1]);
//on donne le premier point en référence au tableau (map)

ok = true;
//on ouvre le onEnterFrame

   }
};
onEnterFrame = function () {

//on crée la fonction onEnterFrame

if (ok) {
//on exécute la condition if

if (i
i++;
clip.lineTo(map[i][0], map[i][1]);

//on dessine le tracé du premier au dernier point

} else {
//si autre condition

delete (onEnterFrame);
//on vide le clip
  
        }
    }
};



Voilà, je vous conseille vivement d’utiliser l’éditeur de dessin de Blacknight91titi que vous trouverez ici :
http://www.flashkod.com/code.aspx?ID=32515

Vous pouvez changer la vitesse ips soit dans le panneau propriétés soit en utilisant la fonction setInterval().

Si vous avez des questions n’hésitez pas si je peux j’y répondrais.
Et si y’a des erreurs ou mauvaises explications n’hésitez pas non plus.
A+.


(//)


10 août 2005 02:43:01 :
petites corrections ...
10 août 2005 02:52:05 :
petites corrections ...
10 août 2005 02:54:06 :
..petites corrections
10 août 2005 04:22:16 :
...
10 août 2005 04:25:52 :
...
12 août 2005 20:14:46 :
ajouts dégradés..
13 août 2005 14:44:52 :
ajout du polygone régulier
signaler à un administrateur
Commentaire de on_drag_on le 10/08/2005 02:37:56

voilà, j'espère que ça aidera certains à mieux comprendre comment décortiquer les sources.

signaler à un administrateur
Commentaire de Blacknight91titi le 10/08/2005 15:14:31

Super !
S'il est possible de mettre de la couleur dans le code sa serai peut être un peu plsu clair.
Concernant mno editeur de dessin le format rendu en .txt ne sera de la meêm syntaxe et ne vosu sera pas conséquent pas très utile...(voir ma source)

Mais sinon je pense que c'est une bonne initiative pour que les débutants apprenent a dessiner en AS.

Il faudrai juste rendre un peu plus clair le code ci dessus en éloignant s'il le faut les ligne du bord et en mettant de la couleur (je ne sais pas si l'on peut)

Bravo !

9/10

Blacknight

signaler à un administrateur
Commentaire de on_drag_on le 10/08/2005 15:56:46

re
ouais pour ta source (qui est carrément un plug-in) j'ai pas encore utilisé ttes ses fonctions...
pour la couleur tu as raison, dès que j'ai un peu de temps je corrige.
pour ce qui est de la façon d'écrire le code dans la boîte de dialogue, ben comme y'a mille façons je propose  
à chacuns d'aller voir un peu comment dans différentes sources et de trouver la sienne en étant le plus propre et logique pour soi.

je vois une erreur que j'arrive pas à corriger:

//il s'agit de calculer l'angle des huit segments, 360°/8= 45°= ?/4radians
360°/8= 45°/Pi/4 radians ... je n'arrive pas à inscrire le signe "Pi".

Merci pour ton comment!
A+.

signaler à un administrateur
Commentaire de Blacknight91titi le 10/08/2005 17:04:55

Je supose que le symbole "Pi" n'est pas acepter.
Laisse comme c'est sa devrait aller.
A moin de recopeir le code betement les gens le remplasseront.

Blacknight

signaler à un administrateur
Commentaire de Prouprou_Sensei le 10/08/2005 20:27:24

Sympa, ton tuto est complet et bien commenté.
Je trouve qu'il manque juste la partie de remplissage en degradé : beginGradientFill().

Merci.

signaler à un administrateur
Commentaire de on_drag_on le 10/08/2005 22:42:42

Merci, venant de ta part c'est motivant! :-)
C'est que j'ai encore pas mal de truc sympa du genre faire un carré aux coins arrondis paramétrable...
C'est vrai que beginGardientFill() est assez nécessaire, j'aurais pu/dû le mettre. Mais bon y'en a deux
(radial et linéaire) et y'a encore un truc que j'ai pas capté. Dès que j'ai compris je les mets.
A+.

signaler à un administrateur
Commentaire de on_drag_on le 12/08/2005 20:21:06

Ben Voili. Le dégardé linéaire et radial. Pour en savoir + sur les dégradés:
http://www.supersatori.com/tuts/gradientMatrix/
A++. (j'ai mis de couleur mais je vais pas tout refaire ... trop long).
(//)

signaler à un administrateur
Commentaire de on_drag_on le 12/08/2005 21:31:41

Merci à alise pour son aide pour le dégradé.

signaler à un administrateur
Commentaire de on_drag_on le 13/08/2005 14:46:37

j'ajoute encore le polygone régulier qui somme toute s'avère bien utile...
a+
(//)

signaler à un administrateur
Commentaire de LocalStone le 13/08/2005 17:23:39

Si j'avais su que y avait un tutoriel, j'aurais pas posé la question sur le forum ... Bravo !

signaler à un administrateur
Commentaire de lever le 26/09/2005 22:16:27

absolument génial c'est exactement ce que je cherchais, simple, clair et accessible au novice que je suis. Merci
à toi pour ton travail et à bientôt.
Lever

signaler à un administrateur
Commentaire de on_drag_on le 27/09/2005 16:45:15

bah', merci m'ssieurs!
(//)

signaler à un administrateur
Commentaire de crimaf le 23/01/2006 15:59:13

Super cette source !
Merci ça permet vraiment de comprendre comment dessiner en action script!

Petite question :
Pour la dernière figure, j'ai des erreurs lors de l'execution...
Est-ce qu'il ne manque pas des choses par ici :
  [   for (j=0; j
      map[j] = map[j].split(",");
      //on sépare les ","               ]
ou par là :
  [   if (i
      i++;
      clip.lineTo(map[i][0], map[i][1]);
      //on dessine le tracé du premier au dernier point     ]

Je suis débutante en AS peut-être que qqchose m'a échappé...
Crimaf

signaler à un administrateur
Commentaire de on_drag_on le 23/01/2006 18:04:06

... ah ben si, désolé :-/ ... et personne a rien dit ?? je devais être bien fatigué....

for (j=0; j< map.length; j++) {
map[j] = map[j].split(",");
}

et

if (i< map.length-1) {
i++;
clip.lineTo(map[i][0], map[i][1]);
}

voili, corrigé.
a+.
(//)

signaler à un administrateur
Commentaire de crimaf le 24/01/2006 09:32:30

Désolée de revenir à la charge... mais ça ne marche toujours pas pour moi, même apres corrections...
Heu... à priori, "i" serait "undefined" ?
Est-ce que tu vois d'où peut venir le problème ?

Merci,
Crimaf

signaler à un administrateur
Commentaire de on_drag_on le 24/01/2006 12:31:38

En effet, plus rien ... ça fonctionnait très bien avec MX et MX2004 , mais là, avec Flash 8 ,plus rien.
J'ai pas le temps de voir pourquoi, je suis débordé, désolé.
Je suis de retour début février... si tu trouves une solution n'hésite pas à poster.
A bientôt.
(//)

signaler à un administrateur
Commentaire de karabok le 06/02/2006 11:43:47

Super tutorial!!
est ce que c est possible de relier des clips dragables entre eux et que la ligne suivent les clips histoire de ne pas avoir une ligne statique????
svp.......

signaler à un administrateur
Commentaire de Nono_b le 07/06/2006 08:48:43

Code très pratique et clair même si c'est vrai que les couleurs auraient été un plus !!

Le dernier code ne me donne rien mais je vais trouver pourquoi dès que j'aurais du temps !
Sinon je demanderais juste un truc c'est comment tu gères les niveaux quand t'utilise un genre de truc comme ça ?
Car je n'arrive pas à tracer deux trucs sur le même niveau et en changeant de niveau sur tes programmes ça le fait or dans mon code à moi ça le fait pas ??!

signaler à un administrateur
Commentaire de mobone le 23/08/2007 15:31:08

et comment tu fais pour construire une ellipse en AS; svp ?

signaler à un administrateur
Commentaire de noname444 le 02/12/2007 17:07:06

super tuto qui m'as bien aidé merci.Saurais-tu te servir de beginBitmapFill (pour remplir un dessin d'une image ???

signaler à un administrateur
Commentaire de recep_a le 12/12/2007 14:52:45

voici le bon code :

ok = false;
i=0;
Loader = new LoadVars();
Loader.load("coordonnées.txt");
Loader.onLoad = function(Success)
{
if (Success)
{
map = Loader.point.split(";");
for (j=0; j<map.length;j++)
{
map[j] = map[j].split(",");
}
_root.createEmptyMovieClip("clip", 1);
clip.lineStyle(2.0,0x000000,100);
clip.moveTo(map[0][0], map[0][1]);
ok = true;
};
};
onEnterFrame = function ()
{
if (ok)
{
if (i<map.length-1)
{
i++;
clip.lineTo(map[i][0], map[i][1]);
}
else
{
delete(onEnterFrame);
}
}
};

signaler à un administrateur
Commentaire de h1fra le 01/01/2008 19:20:06

gg, très bon tuto, c'est vrai que ca pas forcement me servir mais on voit des trucs intérresant

signaler à un administrateur
Commentaire de a_tom_ique le 14/04/2008 23:25:18

bonjour, super tuto.
est ce qu'il serait possible d'intégrer à ça une espèce de fractale.
Je voudrais faire des lettres, je les ai déjà dessine en AS, et j'aimerais intégrer à ça une fractale aléatoire.
je ne sais pas si je me fais bien comprendre.
Bon merci d'avance.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,031 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.