I. Introduction▲
À travers ces quelques cours généralistes, apprenez les bases de la programmation.
Avec la méthode "Développement Facile", vous allez acquérir les bases qui vous seront nécessaires pour devenir un développeur professionnel.
Retrouvez ici, un extrait de la formation "Développement Facile", composée de nombreux cours professionnels pour vous aider à progresser rapidement.
II. Comment utiliser les tableaux simple et à plusieurs dimensions dans votre langage de programmation ?▲
Une des bases de la programmation est l'utilisation des tableaux.
Dans cette vidéo, découvrez comment les créer et interagir avec.
Ci-dessous, l'exemple de code.
/*
*
The
Initial
Developer
of
the
Original
Code
is
Matthieu
-
http://www.programmation-facile.com/
Portions
created
by
the
Initial
Developer
are
Copyright
(C)
2013
the
Initial
Developer.
All
Rights
Reserved.
Contributor(s)
:
*/
package
{
import
flash.
display.
MovieClip
;
import
flash.
display.
DisplayObject;
import
com.
demonsters.
debugger
.
MonsterDebugger;
import
com.
actionscriptfacile.
ui.
text
.
UITextField;
import
flash.
display.
Sprite;
import
flash.
events.
Event;
/*
*
*
Exemple
d'utilisation
tableaux
en
ActionScript
*
*
@author
Matthieu
*/
public
class
Main extends
Sprite
{
public
function
Main
()
{
//
attend
la
fin
de
l'initialisation
de
la
scène
this
.
addEventListener
(Event.
ADDED_TO_STAGE,
onReady,
false
,
0
,
true
);
}
/*
*
*
Démarrage
de
l'application.
*
*/
protected
function
onReady
(event :
Event) :
void
{
this
.
removeEventListener
(Event.
ADDED_TO_STAGE,
onReady);
//
Init
De
MonsterDebugger
MonsterDebugger.
initialize
(this
);
MonsterDebugger.
trace
(this
,
"
Manipulation
des
données
"
);
this
.
useArray
();
this
.
multiDimensionalArray
();
}
/*
*
*
Les
tableaux
à
plusieurs
dimensions.
*
Parcourir
les
tableaux.
*
*/
private
function
multiDimensionalArray
() :
void
{
var
aCountryList:
Array
=
new
Array
();
aCountryList[
0
]
=
[
"
Californie
"
,
"
Alabama
"
,
"
Arizona
"
]
;
aCountryList[
1
]
=
[
"
Bretagne
"
,
"
Auvergne
"
,
"
Aquitaine
"
,
"
Isère
"
]
;
aCountryList[
2
]
=
[
"
Suisse
"
,
"
Australie
"
,
"
Inde
"
]
;
aCountryList[
3
]
=
[
"
Japon
"
]
;
aCountryList[
4
]
=
[
"
Chine
"
,
"
Russie
"
]
;
MonsterDebugger.
trace
(this
,
"
---->
multiDimensionalArray
"
);
MonsterDebugger.
trace
(this
,
"
Pays
:
"
+
aCountryList[
3
]
[
0
]
);
//
affiche
Japon
MonsterDebugger.
trace
(this
,
"
Pays
:
"
+
aCountryList[
4
]
[
1
]
);
//
affiche
Russie
MonsterDebugger.
trace
(this
,
"
Pays
:
"
+
aCountryList[
0
]
);
//
affiche
le
tableau
des
Etats
Unis
trace
("
test
"
);
//
parcours
d'un
tableau
à
plusieurs
dimensions
for
(var
j :
int
=
0
;
j <
aCountryList.
length
;
j+
+
)
{
MonsterDebugger.
trace
(this
,
"
Liste
des
éléments
de
la
2e
dimension
à
la
position
"
+
j +
"
du
1er
tableau
"
);
for
(var
k :
int
=
0
;
k <
aCountryList[
j]
.
length
;
k+
+
)
{
MonsterDebugger.
trace
(this
,
"
Pays
ou
Etat
:
"
+
aCountryList[
j]
[
k]
);
}
}
MonsterDebugger.
trace
(this
,
"
parcours
rapide
d'un
tableau
à
plusieurs
dimensions
"
);
//
parcours
rapide
d'un
tableau
for
each (var
aListEtats :
Array
in
aCountryList)
{
for
each (var
sEtats :
String
in
aListEtats)
{
MonsterDebugger.
trace
(this
,
"
Etat
ou
Pays
:
"
+
sEtats);
}
}
var
aFruits:
Array
=
[
'
pomme
'
,
'
orange
'
,
'
banane
'
,
'
pêche
'
,
'
clémentine
'
]
;
//
parcours
d'un
tableau
for
(var
i :
int
=
0
;
i <
aFruits.
length
;
i+
+
)
{
MonsterDebugger.
trace
(this
,
"
Position
"
+
i +
"
du
tableau
des
fruits,
il
y
a
"
+
aFruits[
i]
);
}
//
recherche
dans
un
tableau
var
sSearch:
String
=
"
banane
"
;
i=
0
;
while
( i <
aFruits.
length
&
&
sSearch !
=
aFruits[
i]
)
{
i+
+
;
}
trace
("
Position
"
+
i +
"
du
fruit
"
+
sSearch);
MonsterDebugger.
trace
(this
,
"
Position
"
+
i +
"
du
fruit
"
+
sSearch);
//
parcours
rapide
d'un
tableau
for
each (var
sFruit :
String
in
aFruits)
{
MonsterDebugger.
trace
(this
,
"
Fruit
:
"
+
sFruit);
}
}
/*
*
*
Utilisation
pratique
des
tableaux.
*
*/
private
function
useArray
() :
void
{
/*
*
*
Array.forEach
procède
à
une
navigation
simple
*
sur
chaque
élément
à
partir
d'une
fonction
dédiée
*
*/
var
aFruits:
Array
=
[
'
pomme
'
,
'
orange
'
,
'
banane
'
,
'
pêche
'
,
'
clémentine
'
]
;
aFruits.
forEach
(afficheAll);
//
Permet
d'itérer
simplement
au
sein
d'un
tableau.
/*
*
*
la
classe
Vector
est
comme
la
classe
Array
*
la
classe
Vector
est
un
tableau
dont
les
éléments
possèdent
tous
le
même
type
de
données.
*
plus
dinformations
sur
:
*
http://help.adobe.com/fr_FR/FlashPlatform/reference/actionscript/3/Vector.html
*
*
Au
niveau
des
performances
:
*
Dans
tous
les
cas
où
vous
utilisez
un
objet
Array
dont
tous
les
éléments
possèdent
le
même
type
de
données,
*
il
est
préférable
d'utiliser
une
occurrence
de
l'objet
Vector.
*
*/
var
vaFruits:
Vector.
<
String
>
=
new
<
String
>
[
'
pomme2
'
,
'
orange2
'
,
'
banane2
'
,
'
pêche2
'
,
'
clémentine2
'
]
;
vaFruits.
forEach
(afficheAllVector);
//
Permet
d'itérer
simplement
au
sein
d'un
tableau.
/*
*
*
Array.every
*
Exécute
la
fonction
de
navigation
pour
trouver
le
type
d'élément
et
renvoie
false.
*
Il
est
donc
très
facile
de
déterminer
si
un
tableau
contient
un
type
de
valeurs
attendues.
*
*/
var
aData:
Array
=
[
12
,
'
pomme
'
,
'
orange
'
,
32
,
'
banane
'
,
'
pêche
'
,
28
,
'
clémentine
'
]
;
//
déterminer
si
le
tableau
contient
des
nombres
var
bNombres:
Boolean
=
aData.
every
(testElements);
//
affiche :
false
MonsterDebugger.
trace
(this
,
"
que
des
nombres
dans
le
tableau
aData
:
"
+
bNombres);
var
aDataN:
Array
=
[
12
,
32
,
28
]
;
bNombres =
aDataN.
every
(testElements);
//
affiche :
true
MonsterDebugger.
trace
(this
,
"
que
des
nombres
dans
le
tableau
aDataN
:
"
+
bNombres);
/*
*
*
Array.map
*
Exécute
la
fonction
de
navigation.
*
Permet
de
créer
un
nouveau
tableau.
*
*/
//
création
d'un
nouveau
tableau
à
partir
du
retour
de
la
fonction
affiche.
var
aFruitsFormat:
Array
=
aFruits.
map
(elementToUpperCase);
//
affiche :
Pomme,
Orange,
Banane
MonsterDebugger.
trace
(this
,
aFruitsFormat);
/*
*
*
Array.filter
*
Exécute
la
fonction
de
navigation.
*
Permet
de
filtrer
les
éléments
d'un
tableau.
*
*/
var
aFruitsDetails:
Array
=
[
{
fruit&
#160;
:
'
pomme
'
,
calorie&
#160;
:
48
}
,
{
fruit&
#160;
:
'
orange
'
,
calorie&
#160;
:
40
}
,
{
fruit&
#160;
:
'
banane
'
,
calorie&
#160;
:
94
}
,
{
fruit&
#160;
:
'
abricots
'
,
calorie&
#160;
:
45
}
,
{
fruit&
#160;
:
'
pêche
'
,
calorie&
#160;
:
50
}
,
{
fruit&
#160;
:
'
clémentine
'
,
calorie&
#160;
:
88
}
]
&
#160;
;
var
aFruitsRiches:
Array
=
aFruitsDetails.
filter
(filterElement);
//
création
d'un
nouveau
tableau
en
supprimant
les
éléments
inférieurs
à
50
calories
aFruitsRiches.
forEach
(afficheAllFruits);
/*
*
*
Array.some
*
Exécute
la
fonction
de
navigation.
*
Permet
de
savoir
si
un
élément
existe
au
moins
une
fois
dans
un
tableau.
*
*/
var
aPersonnes:
Array
=
[
{
prenom&
#160;
:
'
Nicolas
'
,
age&
#160;
:
50
,
sexe&
#160;
:
'
H
'
}
,
{
prenom&
#160;
:
'
Frédéric
'
,
age&
#160;
:
30
,
sexe&
#160;
:
'
H
'
}
,
{
prenom&
#160;
:
'
Alice
'
,
age&
#160;
:
28
,
sexe&
#160;
:
'
F
'
}
,
{
prenom&
#160;
:
'
Yannick
'
,
age&
#160;
:
29
,
sexe&
#160;
:
'
H
'
}
]
&
#160;
;
var
bsearchFemme:
Boolean
=
aPersonnes.
some
(searchFemme);
//
affiche
true
MonsterDebugger.
trace
(this
,
"
une
femme
dans
le
tableau
aPersonnes
:
"
+
bsearchFemme);
var
aPersonnes2:
Array
=
[
{
prenom&
#160;
:
'
Nicolas
'
,
age&
#160;
:
50
,
sexe&
#160;
:
'
H
'
}
,
{
prenom&
#160;
:
'
Frédéric
'
,
age&
#160;
:
30
,
sexe&
#160;
:
'
H
'
}
,
{
prenom&
#160;
:
'
François
'
,
age&
#160;
:
28
,
sexe&
#160;
:
'
H
'
}
,
{
prenom&
#160;
:
'
Yannick
'
,
age&
#160;
:
29
,
sexe&
#160;
:
'
H
'
}
]
&
#160;
;
bsearchFemme =
aPersonnes2.
some
(searchFemme);
//
affiche
false
MonsterDebugger.
trace
(this
,
"
une
femme
dans
le
tableau
aPersonnes2
:
"
+
bsearchFemme);
/*
*
*
Array.indexOf
et
Array.lastIndexOf
*
Permet
de
rechercher
si
un
élément
existe
et
de
connaître
sa
position.
*
*
indexOf
pour
la
position
du
1er
élément
trouvé.
*
lastIndexOf
pour
la
position
du
dernier
élément
trouvé.
*
*
Possibilité
de
rechercher
un
élément
de
type
primitif
(number,
string)
et
de
type
composite
(MovieClip,
DisplayObject).
*/
var
aPersonnesListe:
Array
=
[
'
Nicolas
'
,
'
Yannick
'
,
'
Caroline
'
,
'
Yannick
'
,
'
Antoine
'
]
;
var
positionDebut:
int
=
aPersonnesListe.
indexOf
('
Yannick
'
);
var
positionFin:
int
=
aPersonnesListe.
lastIndexOf
('
Yannick
'
);
var
positionNulle:
int
=
aPersonnesListe.
indexOf
('
François
'
);
MonsterDebugger.
trace
(this
,
"
1ère
position
du
prénom
Yannick
:
"
+
positionDebut);
//
affiche :
1
MonsterDebugger.
trace
(this
,
"
dernière
position
du
prénom
Yannick
:
"
+
positionFin);
//
affiche :
3
MonsterDebugger.
trace
(this
,
"
position
(inxistante)
du
prénom
François
:
"
+
positionNulle);
//
élément
non
trouvé
affiche :
-1
/*
*
*
utilisé
également
pour
rechercher
un
élément
de
type
primitif
(number,
string)
et
de
type
composite
(MovieClip,
DisplayObject).
*
une
recherche
par
référence
d'objets.
*/
var
oDisplay:
DisplayObject =
new
MovieClip
();
var
oDisplayAutre:
DisplayObject =
new
MovieClip
();
var
aTableau:
Array
=
[
oDisplay]
&
#160;
;
//
stock
une
référence
au
clip
oDisplay
dans
un
tableau
var
positionClip:
int
=
aTableau.
indexOf
(oDisplay);
var
positionAutre:
int
=
aTableau.
lastIndexOf
(oDisplayAutre);
MonsterDebugger.
trace
(this
,
"
recherche
du
clip
oDisplay
:
"
+
positionClip);
//
affiche :
0,
clip
trouvé
MonsterDebugger.
trace
(this
,
"
recherche
du
clip
oDisplayAutre
:
"
+
positionAutre);
//
affiche :
-1,
clip
inexistant
/*
*
*
d'autres
fonction
utiles
sur
:
*
http://livedocs.adobe.com/flash/9.0_fr/ActionScriptLangRefV3/Array.html
*
*
splice
pour
supprimer
un
élément
d'un
tableau.
*
Par
exemple
var
aTableau:Array
=
aTableauComplet.splice(
index,
1);
//
supprime
un
seul
élément
du
tableau
complet
à
la
position
index
*/
var
aTableauComplet:
Array
=
new
Array
("
maison
"
,
"
voyages
"
,
"
voiture
"
,
"
plage
"
,
"
montagne
"
,
"
parc
"
);
var
aTabMini:
Array
=
aTableauComplet.
splice
(2
,
1
);
//
supprime
l'élément
voiture
--
aTabMini
contient
l'élément
supprimé
MonsterDebugger.
trace
(this
,
"
Array
splice
"
);
MonsterDebugger.
trace
(this
,
aTableauComplet);
MonsterDebugger.
trace
(this
,
aTabMini);
/*
*
*
Il
y
a
aussi
les
méthodes
push(),
pop(),
shift(),
unshift().
*
*
La
méthode
push()
ajoute
un
ou
plusieurs
éléments
à
la
fin
d'un
vecteur
ou
d'un
tableau
array.
*
La
méthode
unshift()
ajoute
un
ou
plusieurs
éléments
au
début
d'un
vecteur
ou
d'un
tableau
array
*
et
renvoie
la
nouvelle
longueur
du
vecteur.
*
La
méthode
pop()
supprime
le
dernier
élément
du
vecteur
et
renvoie
cet
élément.
La
propriété
length
du
vecteur
est
diminuée
d'une
unité
lorsque
cette
fonction
est
appelée
*
*/
var
avMois:
Vector.
<
String
>
=
new
<
String
>
[
'
Janvier
'
,
'
Février
'
,
'
Mars
'
,
'
Avril
'
]
;
avMois.
push
("
Mai
"
);
avMois.
push
("
Juin
"
,
"
Juillet
"
);
MonsterDebugger.
trace
(this
,
"
Array
push
"
);
MonsterDebugger.
trace
(this
,
avMois);
var
avDuree:
Vector.
<
int
>
=
new
<
int
>
[
20
,
26
,
32
,
36
]
;
var
nNbreElts:
int
=
avDuree.
push
(45
,
56
,
67
);
//
ajout
à
la
fin
du
tableau
MonsterDebugger.
trace
(this
,
"
Nombre
d'éléments
dans
le
vecteur
après
l'ajout
:
"
+
nNbreElts);
nNbreElts =
avDuree.
unshift
(3
,
10
);
//
ajout
au
début
du
tableau
MonsterDebugger.
trace
(this
,
"
Nombre
d'éléments
dans
le
vecteur
après
l'ajout
:
"
+
nNbreElts);
MonsterDebugger.
trace
(this
,
"
tableau
aevc
unshift:
"
);
MonsterDebugger.
trace
(this
,
avDuree);
}
/*
*
*
Fonction
de
navigation
passée
en
paramètre
d'un
tableau
*
pour
itérer
et
traiter
les
données
au
sein
du
tableau.
*
*
Il
est
possible
d'ajouter
vos
propres
traitements
pour
un
affichage
de
données,
remplir
un
formulaire...
*
*
@param
element
:
l'élément
du
tableau
en
cours
de
lecture.
*
@param
index
:
la
position
de
l'élément
dans
le
tableau.
*
@param
tableau
:
le
tableau
complet.
*
*/
private
function
afficheAll (element&
#160;
:
*
,
index
:
int
,
tableau:
Array
):
void
{
var
sContentTb:
String
=
"
Element
:
"
+
element +
'
,
position
:
'
+
index
+
'
,
contenu
:
'
+
tableau;
MonsterDebugger.
trace
(this
,
sContentTb);
var
oText:
UITextField =
this
.
addText
(sContentTb);
oText.
y =
index
*
15
;
this
.
addChild
(oText);
//
affiche
chaque
élément
du
tableau
dans
un
champ
texte
}
/*
*
*
Fonction
de
navigation
passée
en
paramètre
d'un
tableau
*
pour
itérer
et
traiter
les
données
au
sein
du
tableau.
*
*
Il
est
possible
d'ajouter
vos
propres
traitements
pour
un
affichage
de
données,
remplir
un
formulaire...
*
*
@param
element
:
l'élément
du
tableau
en
cours
de
lecture.
*
@param
index
:
la
position
de
l'élément
dans
le
tableau.
*
@param
tableau
:
le
tableau
complet.
*
*/
private
function
afficheAllVector (element&
#160;
:
String
,
index
:
int
,
tableau:
Vector.
<
String
>
):
void
{
var
sContentTb:
String
=
"
Element
:
"
+
element +
'
,
position
:
'
+
index
+
'
,
contenu
:
'
+
tableau;
MonsterDebugger.
trace
(this
,
sContentTb);
var
oText:
UITextField =
this
.
addText
(sContentTb);
oText.
y =
300
+
index
*
15
;
this
.
addChild
(oText);
//
affiche
chaque
élément
du
tableau
dans
un
champ
texte
}
/*
*
*
Fonction
de
navigation
passée
en
paramètre
d'un
tableau
*
pour
itérer
et
de
traiter
les
données
au
sein
du
tableau.
*
*
Il
est
possible
d'ajouter
vos
propres
traitements
pour
un
affichage
de
données,
remplir
un
formulaire...
*
*
@param
element
:
l'élément
du
tableau
en
cours
de
lecture.
*
@param
index
:
la
position
de
l'élément
dans
le
tableau.
*
@param
tableau
:
le
tableau
complet.
*
*/
private
function
afficheAllFruits (element&
#160;
:
*
,
index
:
int
,
tableau:
Array
):
void
{
var
sContentTb:
String
=
"
Fruit
:
"
+
element.
fruit +
'
,
Calories
:
'
+
element.
calorie;
MonsterDebugger.
trace
(this
,
sContentTb);
var
oText:
UITextField =
this
.
addText
(sContentTb);
oText.
y =
200
+
index
*
15
;
this
.
addChild
(oText);
//
affiche
chaque
élément
du
tableau
dans
un
champ
texte
}
/*
*
*
Fonction
de
navigation
passée
en
paramètre
d'un
tableau
*
pour
itérer
et
de
traiter
les
données
au
sein
du
tableau.
*
*
Détermine
si
un
tableau
contient
un
type
de
valeurs
attendues
(des
nombres)
*
*
@param
element
:
l'élément
du
tableau
en
cours
de
lecture.
*
@param
index
:
la
position
de
l'élément
dans
le
tableau.
*
@param
tableau
:
le
tableau
complet.
*
*/
private
function
testElements (element&
#160;
:
*
,
index
:
int
,
tableau:
Array
):
Boolean
{
return
(element is Number
);
}
/*
*
*
Fonction
de
navigation
passée
en
paramètre
d'un
tableau
*
Permet
de
créer
un
nouveau
tableau.
*
*
Formatage
des
caractères
des
éléments
du
tableau
:
1ère
lettre
en
majuscule
et
les
autres
en
minuscules.
*
*
@param
element
:
l'élément
du
tableau
en
cours
de
lecture.
*
@param
index
:
la
position
de
l'élément
dans
le
tableau.
*
@param
tableau
:
le
tableau
complet.
*
*/
private
function
elementToUpperCase (element&
#160;
:
*
,
index
:
int
,
tableau:
Array
):
String
{
var
sText:
String
=
element.
charAt
(0
).
toUpperCase
()+
element.
substr
(1
).
toLowerCase
();
var
oText:
UITextField =
this
.
addText
(sText);
oText.
y =
100
+
index
*
15
;
this
.
addChild
(oText);
//
affiche
chaque
élément
du
tableau
dans
un
champ
texte
return
sText;
}
/*
*
*
Fonction
de
navigation
passée
en
paramètre
d'un
tableau
*
Permet
de
créer
un
nouveau
tableau.
*
*
Pour
les
filter
les
éléments
d'un
tableau
*
Renvoie
uniquement
les
éléments
supérieurs
ou
égaux
à
50
calories.
*
*
@param
element
:
l'élément
du
tableau
en
cours
de
lecture.
*
@param
index
:
la
position
de
l'élément
dans
le
tableau.
*
@param
tableau
:
le
tableau
complet.
*
*/
private
function
filterElement (element&
#160;
:
*
,
index
:
int
,
tableau:
Array
):
Boolean
{
return
element.
calorie >=
50
;
}
/*
*
*
Fonction
de
navigation
passée
en
paramètre
d'un
tableau
*
La
fonction
de
navigation
est
exécutée
jusqu'à
ce
qu'elle
renvoie
true.
*
*
Permet
de
savoir
si
un
élément
existe
au
moins
une
fois
dans
un
tableau
*
Renvoie
true
si
il
y
a
au
moins
une
femme
dans
le
tableau.
*
*
@param
element
:
l'élément
du
tableau
en
cours
de
lecture.
*
@param
index
:
la
position
de
l'élément
dans
le
tableau.
*
@param
tableau
:
le
tableau
complet.
*
*/
private
function
searchFemme (element&
#160;
:
*
,
index
:
int
,
tableau:
Array
):
Boolean
{
return
(element.
sexe =
=
'
F
'
);
}
/*
*
*
Création
d'un
champ
texte.
*
*/
private
function
addText
(sValue:
String
) :
UITextField
{
var
oTxtField:
UITextField =
new
UITextField
();
oTxtField.
text
=
sValue;
oTxtField.
selectable
=
false
;
oTxtField.
autoSizeLeft
();
oTxtField.
changeFormat
("
size
"
,
13
);
//
changement
de
la
taille
de
la
police
du
texte
oTxtField.
changeFormat
("
font
"
,
"
Arial
"
);
//
changement
de
la
taille
de
la
police
du
texte
oTxtField.
changeFormat
("
color
"
,
Math
.
random
() *
0X006f77);
//
changement
de
la
couleur
return
oTxtField;
}
}
}
III. Comment utiliser les boucles en programmation ?▲
Un élément essentiel dans la programmation est de pouvoir répéter plusieurs fois un algorithme.
Vous verrez, dans cette vidéo, comment résoudre ce problème avec l'utilisation des boucles.
Ci-dessous, l'exemple de code.
package
application.
app.
view
{
import
flash.
geom.
Point;
import
flash.
display.
Sprite;
import
application.
app.
ApplicationFacade;
import
org.
puremvc.
as3.
interfaces.
IMediator;
import
org.
puremvc.
as3.
interfaces.
INotification;
import
org.
puremvc.
as3.
patterns.
mediator.
Mediator;
/*
*
*
Permet
de
construire
notre
menu
et
d'interagir
avec
nos
composants
graphiques.
*
*
@author
matth
*/
public
class
ViewKartIA extends
Mediator implements
IMediator
{
public
static
const
NAME :
String
=
"
ViewKartIA
"
;
//
intelligence
artificielle
private
var
oKart :
Sprite;
public
var
oLineTestRace :
Sprite;
//
ligne
de
test
du
circuit
private
var
oRace :
Sprite;
//
référence
au
clip
circuit
/*
variables
ajustement
kart
*/
public
var
speed_decay:
Number
;
public
var
rotation_step:
Number
;
//
vitesse
de
rotation
public
var
nAcceleration :
Number
;
//
accélération
du
kart
public
var
nMaxSpeed :
Number
;
//
vitesse
maximum
du
kart
public
var
nSpeed :
Number
;
//
vitesse
du
kart
public
var
nAngleTest :
Number
;
//
angle
pour
la
ligne
de
test
public
var
nPrecision :
int
;
//
la
précision
:
plus
c'est
élevé
plus
c'est
précis,
et
plus
lent
pour
la
simulation
public
var
nSizeTest :
int
;
//
la
longueur
pour
les
tests
d'anticipation
des
collisions
public
var
nNumberSteps :
int
;
//
le
nombre
d'étapes
requis
pour
valider
les
tests
public
var
nTurnTolerance :
int
;
//
la
tolérance
pour
tourner
public
function
ViewKartIA
(viewComponent :
Object
)
{
super
(NAME,
viewComponent);
this
.
setupUi
();
}
/*
*
*
Initialisation
de
l'interface
utilisateur.
*
*/
private
function
setupUi
() :
void
{
//
création
et
configuration
du
kart
oKart =
new
KartIA1
();
stageV.
addChild
(oKart);
oLineTestRace =
new
Sprite
();
oKart.
addChild
(oLineTestRace);
}
/*
*
*
Initialisation
des
variables
pour
une
nouvelle
partie
*
*/
private
function
startGame
() :
void
{
//
position
de
départ
du
kart
oKart.
x =
450
;
oKart.
y =
300
;
oKart.
rotation =
0
;
nAngleTest =
90
;
nPrecision =
13
;
nSizeTest =
63
;
nNumberSteps =
13
;
nTurnTolerance =
13
;
speed_decay =
0
.
96
;
rotation_step =
10
;
//
vitesse
de
rotation
nAcceleration =
0
.
33
;
//
accélération
du
kart
nMaxSpeed =
5
;
//
vitesse
maximum
du
kart
nSpeed =
0
;
//
vitesse
du
kart
}
/*
*
*
Déplace
le
kart
IA
en
fonction
des
tests
de
collision
du
circuit.
*
*/
private
function
moveKart
() :
void
{
var
angle_step :
Number
=
nAngleTest *
2
/
nPrecision;
var
sight_point :
Point;
var
global_sight_point :
Point;
var
turn_left :
int
=
0
;
//
contient
le
résultat
du
test
de
collision
var
bCollision :
Boolean
=
false
;
//
collision
avec
le
circuit
?
oLineTestRace.
graphics.
clear
();
oLineTestRace.
graphics.
lineStyle
(1
,
0x00C5DF);
//
détermine
la
prochaine
trajectoire
du
kart
(test
avec
les
lignes)
for
(var
i :
int
=
0
;
i <=
nPrecision;
i+
+
)
{
for
(var
j :
int
=
1
;
j <=
nNumberSteps;
j+
+
)
{
oLineTestRace.
graphics.
moveTo
(0
,
-
15
);
sight_point =
new
Point
(nSizeTest /
nNumberSteps *
j *
Math
.
cos
((-
90
-
nAngleTest +
angle_step *
i) *
0
.
0174532925
),
nSizeTest /
nNumberSteps *
j *
Math
.
sin
((-
90
-
nAngleTest +
angle_step *
i) *
0
.
0174532925
));
global_sight_point =
oKart.
localToGlobal
(sight_point);
//
quitte
la
boucle
en
cas
de
collision
prévue
du
circuit
et
du
kart
if
(oRace.
hitTestPoint
(global_sight_point.
x,
global_sight_point.
y,
true
))
break
;
}
if
(i <
nPrecision /
2
) turn_left +
=
j;
else
turn_left -
=
j;
oLineTestRace.
graphics.
lineTo
(sight_point.
x,
sight_point.
y);
}
//
accélération
si
turn_left
est
plus
petit
que
la
tolerance
*
2
if
(nSpeed <
nMaxSpeed &
&
Math
.
abs
(turn_left) <
nTurnTolerance *
2
)
nSpeed +
=
nAcceleration;
var
speed_x :
Number
=
Math
.
sin
(oKart.
rotation *
0
.
0174532925
) *
nSpeed;
var
speed_y :
Number
=
-
Math
.
cos
(oKart.
rotation *
0
.
0174532925
) *
nSpeed;
oKart.
y +
=
speed_y;
//
mise
à
jour
de
la
position
du
kart
IA
oKart.
x +
=
speed_x;
var
point_left :
Point =
new
Point
(-
9
,
0
);
var
point_right :
Point =
new
Point
(9
,
0
);
var
point_front :
Point =
new
Point
(0
,
-
13
);
var
point_back :
Point =
new
Point
(0
,
13
);
point_left =
oKart.
localToGlobal
(point_left);
point_right =
oKart.
localToGlobal
(point_right);
point_front =
oKart.
localToGlobal
(point_front);
point_back =
oKart.
localToGlobal
(point_back);
//
gestion
voiture
et
circuit
collision
if
(oRace.
hitTestPoint
(point_left.
x,
point_left.
y,
true
) &
&
oRace.
hitTestPoint
(point_front.
x,
point_front.
y,
true
))
{
oKart.
rotation +
=
5
;
nSpeed *
=
0
.
85
;
bCollision =
true
;
}
if
(oRace.
hitTestPoint
(point_right.
x,
point_right.
y,
true
) &
&
oRace.
hitTestPoint
(point_front.
x,
point_front.
y,
true
))
{
oKart.
rotation -
=
5
;
nSpeed *
=
0
.
85
;
bCollision =
true
;
}
if
(oRace.
hitTestPoint
(point_front.
x,
point_front.
y,
true
))
{
nSpeed *
=
0
.
55
;
bCollision =
true
;
}
if
(oRace.
hitTestPoint
(point_back.
x,
point_back.
y,
true
))
{
nSpeed *
=
0
.
55
;
bCollision =
true
;
}
if
(!
bCollision)
{
//
tourne
à
gauche
ou
à
droite
selon
la
collision
du
kart
et
des
limites
du
circuit
if
(Math
.
abs
(turn_left) >
nTurnTolerance)
{
if
(turn_left >
0
) oKart.
rotation -
=
rotation_step *
(nSpeed /
nMaxSpeed);
else
oKart.
rotation +
=
rotation_step *
(nSpeed /
nMaxSpeed);
}
}
if
(Math
.
abs
(nSpeed) >
0
.
3
) nSpeed *
=
speed_decay;
else
nSpeed =
0
;
}
/*
*
*
Transtypage
du
viewComponent
en
son
type
actuel.
*
*/
protected
function
get
stageV
() :
Sprite
{
return
viewComponent as Sprite;
}
/*
*
*
Notifications
attendues.
*
*/
override public
function
listNotificationInterests
() :
Array
{
return
[
ApplicationFacade.
ON_ENTER_FRAME,
ApplicationFacade.
RACE_READY]
;
}
/*
*
*
Gestion
des
notifications.
*
*/
override public
function
handleNotification
(note :
INotification) :
void
{
switch
(note.
getName
())
{
case
ApplicationFacade.
RACE_READY:
oRace =
Sprite
( note.
getBody
() );
this
.
startGame
();
break
;
case
ApplicationFacade.
ON_ENTER_FRAME:
if
( oRace !
=
null
) this
.
moveKart
();
break
;
}
}
}
}
IV. Comment utiliser les conditions if, else et switch en programmation ?▲
Un autre élément essentiel en programmation est la gestion des conditions.
Apprenez dans cette vidéo, à vous servir des conditions if, else et switch.
Ci-dessous, l'exemple de code.
/*
*
The
Initial
Developer
of
the
Original
Code
is
Matthieu
-
http://www.programmation-facile.com/
Portions
created
by
the
Initial
Developer
are
Copyright
(C)
2013
the
Initial
Developer.
All
Rights
Reserved.
Contributor(s)
:
*/
package
application.
app.
view
{
import
flash.
geom.
Point;
import
flash.
display.
Sprite;
import
application.
app.
ApplicationFacade;
import
org.
puremvc.
as3.
interfaces.
IMediator;
import
org.
puremvc.
as3.
interfaces.
INotification;
import
org.
puremvc.
as3.
patterns.
mediator.
Mediator;
/*
*
*
Permet
de
construire
notre
menu
et
d'interagir
avec
nos
composants
graphiques.
*
*
@author
matth
*/
public
class
ViewKartIA2 extends
Mediator implements
IMediator
{
public
static
const
NAME :
String
=
"
ViewKartIA2
"
;
//
intelligence
artificielle
private
var
oKart :
Sprite;
public
var
oLineTestRace :
Sprite;
//
ligne
de
test
du
circuit
private
var
oRace :
Sprite;
//
référence
au
clip
circuit
/*
variables
ajustement
kart
*/
public
var
speed_decay:
Number
;
public
var
rotation_step:
Number
;
//
vitesse
de
rotation
public
var
nAcceleration :
Number
;
//
accélération
du
kart
public
var
nMaxSpeed :
Number
;
//
vitesse
maximum
du
kart
public
var
nSpeed :
Number
;
//
vitesse
du
kart
public
var
nAngleTest :
Number
;
//
angle
pour
la
ligne
de
test
public
var
nPrecision :
int
;
//
la
précision:
plus
c'est
élevée
plus
c'est
précis,
et
plus
lent
pour
la
simulation
public
var
nSizeTest :
int
;
//
la
longueur
pour
les
tests
d'anticipation
des
collisions
public
var
nNumberSteps :
int
;
//
le
nombre
d'étape
requis
pour
valider
les
tests
public
var
nTurnTolerance :
int
;
//
la
tolérance
pour
tourner
public
function
ViewKartIA2
(viewComponent :
Object
)
{
super
(NAME,
viewComponent);
this
.
setupUi
();
}
/*
*
*
Initialisation
de
l'interface
utilisateur.
*
*/
private
function
setupUi
() :
void
{
//
création
et
configuration
du
kart
oKart =
new
KartIA2
();
stageV.
addChild
(oKart);
oLineTestRace =
new
Sprite
();
oKart.
addChild
(oLineTestRace);
}
/*
*
*
Initialisation
des
variables
pour
une
nouvelle
partie
*
*/
private
function
startGame
() :
void
{
//
position
de
départ
du
kart
oKart.
x =
450
;
oKart.
y =
300
;
oKart.
rotation =
0
;
nAngleTest =
90
;
nPrecision =
13
;
nSizeTest =
63
;
nNumberSteps =
13
;
nTurnTolerance =
13
;
speed_decay =
0
.
96
;
rotation_step =
13
;
//
vitesse
de
rotation
nAcceleration =
0
.
63
;
//
accélération
du
kart
nMaxSpeed =
4
,
8
;
//
vitesse
maximum
du
kart
nSpeed =
0
;
//
vitesse
du
kart
}
/*
*
*
Déplace
le
kart
IA
en
fonction
des
tests
de
collision
du
circuit.
*
*/
private
function
moveKart
() :
void
{
var
angle_step :
Number
=
nAngleTest *
2
/
nPrecision;
var
sight_point :
Point;
var
global_sight_point :
Point;
var
turn_left :
int
=
0
;
//
contient
le
résultat
du
test
de
collision
var
bCollision :
Boolean
=
false
;
//
collision
avec
le
circuit
?
oLineTestRace.
graphics.
clear
();
oLineTestRace.
graphics.
lineStyle
(1
,
0x00C5DF);
//
détermine
la
prochaine
trajectoire
du
kart
(test
avec
les
lignes)
for
(var
i :
int
=
0
;
i <=
nPrecision;
i+
+
)
{
for
(var
j :
int
=
1
;
j <=
nNumberSteps;
j+
+
)
{
oLineTestRace.
graphics.
moveTo
(0
,
-
15
);
sight_point =
new
Point
(nSizeTest /
nNumberSteps *
j *
Math
.
cos
((-
90
-
nAngleTest +
angle_step *
i) *
0
.
0174532925
),
nSizeTest /
nNumberSteps *
j *
Math
.
sin
((-
90
-
nAngleTest +
angle_step *
i) *
0
.
0174532925
));
global_sight_point =
oKart.
localToGlobal
(sight_point);
//
quitte
la
boucle
en
cas
de
collision
prévue
du
circuit
et
du
kart
if
(oRace.
hitTestPoint
(global_sight_point.
x,
global_sight_point.
y,
true
))
break
;
}
if
(i <
nPrecision /
2
) turn_left +
=
j;
else
turn_left -
=
j;
oLineTestRace.
graphics.
lineTo
(sight_point.
x,
sight_point.
y);
}
//
accélération
si
turn_left
est
plus
petit
que
la
tolerance
*
2
if
(nSpeed <
nMaxSpeed &
&
Math
.
abs
(turn_left) <
nTurnTolerance *
2
)
nSpeed +
=
nAcceleration;
var
speed_x :
Number
=
Math
.
sin
(oKart.
rotation *
0
.
0174532925
) *
nSpeed;
var
speed_y :
Number
=
-
Math
.
cos
(oKart.
rotation *
0
.
0174532925
) *
nSpeed;
oKart.
y +
=
speed_y;
//
mise
à
jour
de
la
position
du
kart
IA
oKart.
x +
=
speed_x;
var
point_left :
Point =
new
Point
(-
9
,
0
);
var
point_right :
Point =
new
Point
(9
,
0
);
var
point_front :
Point =
new
Point
(0
,
-
13
);
var
point_back :
Point =
new
Point
(0
,
13
);
point_left =
oKart.
localToGlobal
(point_left);
point_right =
oKart.
localToGlobal
(point_right);
point_front =
oKart.
localToGlobal
(point_front);
point_back =
oKart.
localToGlobal
(point_back);
//
gestion
voiture
et
circuit
collision
if
(oRace.
hitTestPoint
(point_left.
x,
point_left.
y,
true
) &
&
oRace.
hitTestPoint
(point_front.
x,
point_front.
y,
true
))
{
oKart.
rotation +
=
5
;
nSpeed *
=
0
.
85
;
bCollision =
true
;
}
if
(oRace.
hitTestPoint
(point_right.
x,
point_right.
y,
true
) &
&
oRace.
hitTestPoint
(point_front.
x,
point_front.
y,
true
))
{
oKart.
rotation -
=
5
;
nSpeed *
=
0
.
85
;
bCollision =
true
;
}
if
(oRace.
hitTestPoint
(point_front.
x,
point_front.
y,
true
))
{
nSpeed *
=
0
.
55
;
bCollision =
true
;
}
if
(oRace.
hitTestPoint
(point_back.
x,
point_back.
y,
true
))
{
nSpeed *
=
0
.
55
;
bCollision =
true
;
}
if
(!
bCollision)
{
//
tourne
à
gauche
ou
à
droite
selon
la
collision
du
kart
et
des
limites
du
circuit
if
(Math
.
abs
(turn_left) >
nTurnTolerance)
{
if
(turn_left >
0
) oKart.
rotation -
=
rotation_step *
(nSpeed /
nMaxSpeed);
else
oKart.
rotation +
=
rotation_step *
(nSpeed /
nMaxSpeed);
}
}
if
(Math
.
abs
(nSpeed) >
0
.
3
) nSpeed *
=
speed_decay;
else
nSpeed =
0
;
}
/*
*
*
Transtypage
du
viewComponent
en
son
type
actuel.
*
*/
protected
function
get
stageV
() :
Sprite
{
return
viewComponent as Sprite;
}
/*
*
*
Notifications
attendues.
*
*/
override public
function
listNotificationInterests
() :
Array
{
return
[
ApplicationFacade.
ON_ENTER_FRAME,
ApplicationFacade.
RACE_READY]
;
}
/*
*
*
Gestion
des
notifications.
*
*/
override public
function
handleNotification
(note :
INotification) :
void
{
switch
(note.
getName
())
{
case
ApplicationFacade.
RACE_READY:
oRace =
Sprite
( note.
getBody
() );
this
.
startGame
();
break
;
case
ApplicationFacade.
ON_ENTER_FRAME:
if
( oRace !
=
null
) this
.
moveKart
();
break
;
}
}
}
}
V. Comment éviter les erreurs fatales dans vos applications ?▲
Dans cette vidéo, apprenez à gérer les erreurs, qu'elles soient due à un problème de code ou à une mauvaise manipulation de l'utilisateur.
Avec les exceptions, vous ou vos utilisateurs, saurez rapidement comment les résoudre avec un message clair.
Ci-dessous, la classe AppliError.
/*
*
The
Initial
Developer
of
the
Original
Code
is
Matthieu
-
http://www.programmation-facile.com/
Portions
created
by
the
Initial
Developer
are
Copyright
(C)
2013
the
Initial
Developer.
All
Rights
Reserved.
Contributor(s)
:
*/
package
{
import
flash.
geom.
Point;
import
flash.
display.
DisplayObject;
import
com.
actionscriptfacile.
ui.
text
.
UITextField;
/*
*
*
Personnalisation
des
erreurs.
*
*
@author
Matthieu
*/
public
class
AppliError extends
Error
{
public
function
AppliError
(message
:
*
=
"
"
,
id :
*
=
0
)
{
super
(message
,
id);
}
/*
*
*
Affiche
le
message
d'erreur
*
en
conservant
la
charte
graphique
de
notre
application.
*
*/
public
function
showError
(oPoint:
Point) :
DisplayObject
{
var
oText:
UITextField =
this
.
addText
( "
--->
ERREUR
:
"
+
message
,
oPoint);
return
oText;
}
/*
*
*
Création
d'un
champ
texte.
*
*/
private
function
addText
(sValue:
String
,
oPoint:
Point) :
UITextField
{
var
oTxtField:
UITextField =
new
UITextField
();
oTxtField.
text
=
sValue;
oTxtField.
selectable
=
true
;
oTxtField.
multiline
=
true
;
//
plusieurs
lignes
dans
le
champ
texte
oTxtField.
autoSizeLeft
();
/*
Passage
par
référence
*/
var
oCoord:
Point =
oPoint;
//
dans
ce
cas
là,
les
coordonnées
de
oPoint
sont
passées
comme
une
référence
à
l'objet
oCoord
oTxtField.
x =
oCoord.
x;
//
les
textes
sont
les
uns
sous
les
autres
oTxtField.
y =
oCoord.
y;
oCoord.
y +
=
50
;
//
modifie
donc
les
valeurs
de
oPoint
oTxtField.
maxHeight =
oTxtField.
height
=
100
;
oTxtField.
background
=
true
;
oTxtField.
backgroundColor
=
0x006f77;
oTxtField.
changeFormat
("
size
"
,
28
);
//
changement
de
la
taille
de
la
police
du
texte
oTxtField.
changeFormat
("
font
"
,
"
Arial
"
);
//
changement
de
la
taille
de
la
police
du
texte
oTxtField.
changeFormat
("
color
"
,
Math
.
random
()*
0xffffff);
//
changement
de
la
couleur
return
oTxtField;
}
}
}
Ci-dessous, un exemple permettant de capturer les erreurs.
/*
*
The
Initial
Developer
of
the
Original
Code
is
Matthieu
-
http://www.programmation-facile.com/
Portions
created
by
the
Initial
Developer
are
Copyright
(C)
2013
the
Initial
Developer.
All
Rights
Reserved.
Contributor(s)
:
*/
package
{
import
flash.
display.
DisplayObject;
import
flash.
geom.
Point;
import
com.
as3facile.
DefaultButton;
import
flash.
events.
MouseEvent;
import
com.
actionscriptfacile.
ui.
text
.
UITextField;
import
flash.
display.
Sprite;
import
flash.
events.
Event;
import
com.
demonsters.
debugger
.
MonsterDebugger;
/*
*
*
Exemple
d'utilisation
Singleton
et
Display
Object.
*
*
*
@author
Matthieu
*/
public
class
MainException extends
Sprite
{
private
var
oPointXY:
Point;
//
position
du
champ
texte
public
function
MainException
()
{
//
attend
la
fin
de
l'initialisation
de
la
scène
this
.
addEventListener
(Event.
ADDED_TO_STAGE,
onReady,
false
,
0
,
true
);
}
/*
*
*
Démarrage
de
l'application.
*
*/
protected
function
onReady
(event :
Event) :
void
{
this
.
removeEventListener
(Event.
ADDED_TO_STAGE,
onReady);
//
Init
De
MonsterDebugger
MonsterDebugger.
initialize
(this
);
MonsterDebugger.
trace
(this
,
"
test
classe
point
"
);
//
construction
de
la
page
this
.
setupUI
();
this
.
erreurCapture
();
}
/*
*
*
Capture
des
erreurs
pendant
l'exécution
de
l'application.
*
*/
private
function
erreurCapture
() :
void
{
var
aTableauVide:
Array
;
//
var
aTableauVide:Array
=
new
Array();//
écriture
correcte
try
{
aTableauVide.
push
("
Bonjour
"
);
}
catch
(error:
Error
)
{
MonsterDebugger.
trace
(this
,
"
L'objet
tableau
n'a
pas
été
initialisé
!
"
+
error.
message
);
//
affiche
le
message
et
continue
l'exécution
du
code
}
finally
{
MonsterDebugger.
trace
(this
,
"
Instruction
exécutée
dans
tous
les
cas
;)
"
);
}
//
personnalisation
des
messages
d'erreurs
try
{
if
( !
aTableauVide )
{
throw
new
Error
("
Le
tableau
n'a
pas
été
initialisé
"
);
//
envoie
ce
message
à
catch
}
aTableauVide.
push
("
Bonjour
"
);
}
catch
(error:
Error
)
{
var
oText:
UITextField =
this
.
addText
( "
ERREUR
:
"
+
error.
message
,
oPointXY);
this
.
addChild
(oText);
}
//
personnalisation
des
erreurs
try
{
if
( !
aTableauVide )
{
throw
new
AppliError
("
Err
perso
:
Tableau
vide
!
"
);
//
envoie
ce
message
à
catch
}
aTableauVide.
push
("
Bonjour
"
);
}
catch
(error:
AppliError)
{
var
oTextError:
DisplayObject =
error.
showError
(oPointXY);
this
.
addChild
(oTextError);
}
}
/*
*
*
Création
d'un
bouton.
*
*/
private
function
setupUI
():
void
{
oPointXY =
new
Point
(10
,
50
);
var
oBtnStart:
DefaultButton =
new
DefaultButton
();
oBtnStart.
getObject
().
label =
"
Gooo
!
"
;
oBtnStart.
getObject
().
x =
230
;
oBtnStart.
getObject
().
y =
10
;
oBtnStart.
getObject
().
addEventListener ( MouseEvent.
CLICK,
onAddText );
this
.
addChild
(oBtnStart);
}
/*
*
*
Lance
l'affichage
des
interfaces
avec
le
debug.
*
*/
private
function
onAddText
(event :
MouseEvent) :
void
{
var
oText:
UITextField =
this
.
addText
( "
Du
texte
en
exemple...
"
,
oPointXY);
this
.
addChild
(oText);
//
le
texte
de
debug
par
dessus
tout
le
reste
var
oTextDebug:
UITextField =
this
.
addText
( "
Coucou,
c'est
moi
le
debug
!
"
,
oPointXY);
this
.
addChild
(oTextDebug);
//
un
autre
texte
var
oTextAutre:
UITextField =
this
.
addText
( "
Et
encore
un
texte.
"
,
oPointXY);
this
.
addChild
(oTextAutre);
}
/*
*
*
Création
d'un
champ
texte.
*
*/
private
function
addText
(sValue:
String
,
oPoint:
Point) :
UITextField
{
var
oTxtField:
UITextField =
new
UITextField
();
oTxtField.
text
=
sValue;
oTxtField.
selectable
=
true
;
oTxtField.
multiline
=
true
;
//
plusieurs
lignes
dans
le
champ
texte
oTxtField.
autoSizeLeft
();
/*
Passage
par
référence
*/
var
oCoord:
Point =
oPoint;
//
dans
ce
cas-là,
les
coordonnées
de
oPoint
sont
passées
comme
une
référence
à
l'objet
oCoord
oTxtField.
x =
oCoord.
x;
//
les
textes
sont
les
uns
sous
les
autres
oTxtField.
y =
oCoord.
y;
oCoord.
y +
=
80
;
//
modifie
donc
les
valeurs
de
oPoint
/*
passage
par
copie
de
valeurs
*
var
oCoord:Point
=
new
Point(
oPoint.x,
oPoint.y);//
dans
ce
cas-là,
les
coordonnées
de
oPoint
sont
passées
comme
une
valeur
oTxtField.x
=
oCoord.x;
oTxtField.y
=
oCoord.y;//
les
textes
sont
empilés
les
uns
sur
les
autres
oCoord.y
+=
80;//
modifie
donc
les
valeurs
de
oCoord
*/
oTxtField.
maxHeight =
oTxtField.
height
=
100
;
oTxtField.
background
=
true
;
oTxtField.
backgroundColor
=
Math
.
random
()*
0xffffff;
oTxtField.
changeFormat
("
size
"
,
28
);
//
changement
de
la
taille
de
la
police
du
texte
oTxtField.
changeFormat
("
font
"
,
"
Arial
"
);
//
changement
de
la
taille
de
la
police
du
texte
oTxtField.
changeFormat
("
color
"
,
Math
.
random
()*
0X006f77);
//
changement
de
la
couleur
return
oTxtField;
}
}
}
VI. Comment connaître le type d'une variable ?▲
En ActionScript vous pouvez connaître le type d'une variable grâce aux opérateurs instanceof, is et as.
Apprenez, dans cette vidéo, à vous en servir.
La classe.
/*
*
The
Initial
Developer
of
the
Original
Code
is
Matthieu
-
http://www.programmation-facile.com/
Portions
created
by
the
Initial
Developer
are
Copyright
(C)
2013
the
Initial
Developer.
All
Rights
Reserved.
Contributor(s)
:
*/
package
{
import
flash.
events.
IEventDispatcher;
import
flash.
display.
DisplayObject;
import
flash.
geom.
Point;
import
com.
as3facile.
DefaultButton;
import
flash.
events.
MouseEvent;
import
com.
actionscriptfacile.
ui.
text
.
UITextField;
import
flash.
display.
Sprite;
import
flash.
events.
Event;
import
com.
demonsters.
debugger
.
MonsterDebugger;
/*
*
*
Exemple
d'utilisation
Singleton
et
Display
Object.
*
*
*
@author
Matthieu
*/
public
class
MainInstance extends
Sprite
{
private
var
oPointXY:
Point;
//
position
du
champ
texte
public
function
MainInstance
()
{
//
attend
la
fin
de
l'initialisation
de
la
scène
this
.
addEventListener
(Event.
ADDED_TO_STAGE,
onReady,
false
,
0
,
true
);
}
/*
*
*
Démarrage
de
l'application.
*
*/
protected
function
onReady
(event :
Event) :
void
{
this
.
removeEventListener
(Event.
ADDED_TO_STAGE,
onReady);
//
Init
De
MonsterDebugger
MonsterDebugger.
initialize
(this
);
MonsterDebugger.
trace
(this
,
"
test
classe
point
"
);
//
construction
de
la
page
this
.
setupUI
();
this
.
testInstance
();
}
/*
*
*
Opérateur
instanceof
*
Permet
de
savoir
si
un
objet
est
une
instance
de
telle
ou
telle
classe.
*
*/
private
function
testInstance
() :
void
{
var
oSprite:
Sprite =
new
Sprite
();
//
prise
en
compte
de
l'héritage
et
interface
//
avec
is
MonsterDebugger.
trace
(this
,
"
instanceof
Sprite
:
"
);
//
true
MonsterDebugger.
trace
(this
,
oSprite is Sprite);
//
true
MonsterDebugger.
trace
(this
,
"
instanceof
DisplayObject
:
"
);
//
true
MonsterDebugger.
trace
(this
,
oSprite is DisplayObject);
//
true
MonsterDebugger.
trace
(this
,
"
instanceof
IEventDispatcher
:
"
);
//
true
MonsterDebugger.
trace
(this
,
oSprite is IEventDispatcher);
//
true
MonsterDebugger.
trace
(this
,
"
instanceof
Number
:
"
);
//
false
MonsterDebugger.
trace
(this
,
oSprite is Number
);
//
false
//
avec
as
MonsterDebugger.
trace
(this
,
"
as
Sprite
:
"
);
//
object
Sprite
MonsterDebugger.
trace
(this
,
oSprite as Sprite);
//
object
Sprite
MonsterDebugger.
trace
(this
,
"
as
DisplayObject
:
"
);
//
object
Sprite
MonsterDebugger.
trace
(this
,
oSprite as DisplayObject);
//
object
Sprite
MonsterDebugger.
trace
(this
,
"
as
IEventDispatcher
:
"
);
//
null
MonsterDebugger.
trace
(this
,
oSprite as Number
);
//
null
/*
trace(oSprite
is
Sprite);
//
true
trace(oSprite
is
DisplayObject);//
true
-
héritage
trace(oSprite
is
IEventDispatcher);//
true
-
interface
trace(oSprite
is
Number);
//
false
trace(oSprite
as
Sprite);
//
object
Sprite
trace(oSprite
as
DisplayObject);//
object
Sprite
trace(oSprite
as
Number);
//
null
*/
}
/*
*
*
Création
d'un
bouton.
*
*/
private
function
setupUI
():
void
{
oPointXY =
new
Point
(10
,
50
);
var
oBtnStart:
DefaultButton =
new
DefaultButton
();
oBtnStart.
getObject
().
label =
"
Gooo
!
"
;
oBtnStart.
getObject
().
x =
230
;
oBtnStart.
getObject
().
y =
10
;
oBtnStart.
getObject
().
addEventListener ( MouseEvent.
CLICK,
onAddText );
this
.
addChild
(oBtnStart);
}
/*
*
*
Lance
l'affichage
des
interfaces
avec
le
debug.
*
*/
private
function
onAddText
(event :
MouseEvent) :
void
{
var
oText:
UITextField =
this
.
addText
( "
Du
texte
en
exemple...
"
,
oPointXY);
this
.
addChild
(oText);
//
le
texte
de
debug
par
dessus
tout
le
reste
var
oTextDebug:
UITextField =
this
.
addText
( "
Coucou,
c'est
moi
le
debug
!
"
,
oPointXY);
this
.
addChild
(oTextDebug);
//
un
autre
texte
var
oTextAutre:
UITextField =
this
.
addText
( "
Et
encore
un
texte.
"
,
oPointXY);
this
.
addChild
(oTextAutre);
}
/*
*
*
Création
d'un
champ
texte.
*
*/
private
function
addText
(sValue:
String
,
oPoint:
Point) :
UITextField
{
var
oTxtField:
UITextField =
new
UITextField
();
oTxtField.
text
=
sValue;
oTxtField.
selectable
=
true
;
oTxtField.
multiline
=
true
;
//
plusieurs
lignes
dans
le
champ
texte
oTxtField.
autoSizeLeft
();
/*
Passage
par
référence
*/
var
oCoord:
Point =
oPoint;
//
dans
ce
cas
là,
les
coordonnées
de
oPoint
sont
passées
comme
une
référence
à
l'objet
oCoord
oTxtField.
x =
oCoord.
x;
//
les
textes
sont
les
uns
sous
les
autres
oTxtField.
y =
oCoord.
y;
oCoord.
y +
=
80
;
//
modifie
donc
les
valeurs
de
oPoint
/*
passage
par
copie
de
valeurs
*
var
oCoord:Point
=
new
Point(
oPoint.x,
oPoint.y);//
dans
ce
cas-là,
les
coordonnées
de
oPoint
sont
passées
comme
une
valeur
oTxtField.x
=
oCoord.x;
oTxtField.y
=
oCoord.y;//
les
textes
sont
empilés
les
uns
sur
les
autres
oCoord.y
+=
80;//
modifie
donc
les
valeurs
de
oCoord
*/
oTxtField.
maxHeight =
oTxtField.
height
=
100
;
oTxtField.
background
=
true
;
oTxtField.
backgroundColor
=
Math
.
random
()*
0xffffff;
oTxtField.
changeFormat
("
size
"
,
28
);
//
changement
de
la
taille
de
la
police
du
texte
oTxtField.
changeFormat
("
font
"
,
"
Arial
"
);
//
changement
de
la
taille
de
la
police
du
texte
oTxtField.
changeFormat
("
color
"
,
Math
.
random
()*
0X006f77);
//
changement
de
la
couleur
return
oTxtField;
}
}
}
VII. Comment découpler vos classes, les rendre indépendantes ?▲
Dans cette vidéo, apprenez à vous servir des interfaces pour simplifier vos classes.
L'interface IContainer :
/*
*
*
*
Le
Framework
de
Composants
AS3
de
la
Formation
AS3
Facile
*
Développé
par
Matthieu
est
mis
à
disposition
*
selon
les
termes
de
la
licence
Creative
Commons
Paternité
-
*
Partage
des
Conditions
Initiales
à
l'Identique
3.0
Unported.
*
*
Licensed
under
the
CREATIVE
COMMONS,
Version
3;
*
you
may
not
use
this
file
except
in
compliance
with
the
License.
*
You
may
obtain
a
copy
of
the
License
at
*
*
http://creativecommons.org/licenses/by-sa/3.0/
*
*
This
program
comes
with
ABSOLUTELY
NO
WARRANTY.
*
*
The
Initial
Developer
of
the
Original
Code
is
*
Matthieu
--
www.formation-actionscript.com
--
matthieu@actionscript-facile.com
*
Framework
AS3
Facile
Copyright
(C)
2010
Matthieu
*
*/
package
com.
formation_actionscript.
ui
{
import
flash.
display.
MovieClip
;
/*
*
*
All
objects
than
implement
IContainer
must
have
all
this
function.
*
*/
public
interface
IContainer
{
function
getDisplayed
() :
Boolean
;
function
move
(nX :
Number
=
NaN
,
nY :
Number
=
NaN
) :
void
function
setHeight
(iHeight :
Number
) :
void
function
getHeight
() :
Number
function
setWidth
(iWidth :
Number
) :
void
function
getWidth
() :
Number
function
getPosition
() :
Object
;
function
getMovieClip
() :
MovieClip
;
function
remove
() :
Boolean
;
function
destruct
() :
Boolean
;
function
toString
() :
String
;
}
}
Exemple d'interface IFactoryIngredientsPizza :
/*
*
The
Initial
Developer
of
the
Original
Code
is
Matthieu
-
http://www.programmation-facile.com/
Portions
created
by
the
Initial
Developer
are
Copyright
(C)
2013
the
Initial
Developer.
All
Rights
Reserved.
Contributor(s)
:
*/
package
fabriquepizza.
fabriqueingredients
{
import
fabriquepizza.
ingredients.
Fromage;
import
fabriquepizza.
ingredients.
Legumes;
import
fabriquepizza.
ingredients.
Moules;
import
fabriquepizza.
ingredients.
Pate;
import
fabriquepizza.
ingredients.
Poivrons;
import
fabriquepizza.
ingredients.
Sauce;
/*
*
*
@author
Matthieu
*
Interface
pour
la
fabrication
qui
va
créer
toutes
nos
garnitures
de
pizza.
*
Tout
ce
qu'il
nous
faut
pour
confectionner
une
pizza.
*
*/
public
interface
IFactoryIngredientsPizza
{
function
creerPate
() :
Pate;
function
creerSauce
() :
Sauce;
function
creerFromage
() :
Fromage;
function
creerLegumes
() :
Legumes;
function
creerPoivrons
() :
Poivrons;
function
creerMoules
() :
Moules;
}
}
VIII. Recevez gratuitement la formation "Développement Facile"▲
Si vous souhaitez aller plus loin dans le développement informatique,
vous pouvez recevoir gratuitement la formation "Développement Facile" avec des cours pas à pas, accompagnés de codes source commentés.
Ainsi, vous progressez à votre rythme, avec un suivi personnalisé et individuel. Vous avez la possibilité de poser toutes vos questions techniques à la fin de chaque cours.
Cliquez simplement ici pour recevoir gratuitement la formation "Développement Facile"Cliquez simplement ici pour recevoir gratuitement la formation Développement Facile
IX. Remerciements▲
Merci beaucoup à l'équipe de rédaction de Developpez.com de contribuer à la diffusion de ce tutoriel.
J'adresse également un merci tout particulier à Jacques Jeanjacques_jean pour sa relecture orthographique.