Forums Développement Multimédia

Aller au contenu

- - - - -

[AS3] Utilisation des boucles

TUTO

18 réponses à ce sujet

#1 achauvire

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 411 messages

Posté 24 February 2011 - 23:11 PM

Bonjour,

Ce tutoriel permet d'appréhender l'utilisation des boucles en ActionScript 3. Vous découvrirez ce qu'est une boucle et à quoi ça sert.

La syntaxe des différentes boucles sera présentée et des exemples de codes viendront agrémenter les explications.

Utilisation des boucles

Bonne lecture

#2 Billyben

    KlouChiPonshoñistäs

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2597 messages

Posté 24 February 2011 - 23:17 PM

Bonjour, encore un liens qui va servir!
juste une toute petite remarque, je ne sais pas si c'est délibéré, mais il te manque l'incrémentation du compteur dans tes 2 premiers exemples :mrgreen:

#3 dada

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 8510 messages

Posté 25 February 2011 - 02:17 AM

Salut,

Hou les vilaines boucles infinies dans le tuto sur les boucles. ;)
Ou alors c'est une boutade pour qu'on apprenne très vite qu'une boucle infinie ça fait jamais plaisir. ^^

Quelques remarques au passage :
On sent que tu n'avais pas trop d'exemple pertinent pour la boucle do..while (je sais, c'est moins facile d'en trouver ^^).
Tu peux prendre l'exemple d'une appli Air qui veut créer un fichier de log dans un dossier où d'autres existent et qui va incrémenter un index tant qu'un fichier de ce nom existe déjà.

En pseudo-code :
i = 0;
do {
  file.name = "log" + (++i);
} while (file.exist ());
file.write();



Ton exemple de boucle for..in ne compile pas. :( La variable d'une boucle for..in doit être typée en String, * ou Object. Le compilateur veut absolument que le type String passe.
Je ne vois pas vraiment d'intérêt à l'utiliser pour un Array, for ou while est plus adapté si on veut utiliser un index, sinon for each..in est plus optimisé.
Mais for..in est indispensable pour parcourir un Object ou un Dictionary par exemple, il faut juste savoir que l'ordre de parcourt des propriétés est alors incertain (tu sembles dire le contraire).

Un exemple :
var obj : Object = { "toto": 3, "titi": 45, "tata": 74 };

for ( var propriete : String in obj )
{
        trace( propriete, ":", obj[ propriete ] );
}
Le trace :

Citation

toto : 3
tata : 74
titi : 45

Au passage on peut expliquer que pour stocker autre chose que des String en propriétés (en clefs), il vaut mieux utiliser le Dictionary, plus optimisé (et avec la possibilité d'utiliser des clefs faibles -weak keys-).
var obj : Dictionary = new Dictionary(false);
obj[ this ] = "quelque chose";
obj[ new Sprite() ] = "autre chose";

for ( var propriete : Object in obj )
{
        trace( propriete, ":", obj[ propriete ] );
}

Citation

[object Sprite] : autre chose
[object Main] : quelque chose

Tu dis :

Citation

La boucle for in permet d'itérer les propriétés d'un objet ou les éléments d'un tableau.
La définition me semble assez confuse, car finalement toutes les boucles nous permettent d'itérer sur les éléments d'un tableau.

Pour être plus précis : la boucle for each..in permet d'itérer sur les valeurs, et la boucle for..in sur les clefs.
A noter qu'elles ne permettent d'itérer que sur les propriétés créées dynamiquement, ce qui implique que la classe de la collection soit déclarée "dynamic" (Array, Object, Dictionary, XML, XMLList, MovieClip, etc). :)


Pour la boucle for, tu peux ajouter qu'aucune des instructions n'est obligatoire (à l'extrême "for ( ; ; ) {}" compilera mais fera une boucle infinie). :)


Bon courage pour la suite. :)

#4 achauvire

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 411 messages

Posté 25 February 2011 - 09:10 AM

Voir le messageBillyben, le 24 February 2011 - 23:17 PM, dit :

juste une toute petite remarque, je ne sais pas si c'est délibéré, mais il te manque l'incrémentation du compteur dans tes 2 premiers exemples :mrgreen:


Voir le messagedada, le 25 February 2011 - 02:17 AM, dit :

Salut,

Hou les vilaines boucles infinies dans le tuto sur les boucles. ;)
Ou alors c'est une boutade pour qu'on apprenne très vite qu'une boucle infinie ça fait jamais plaisir. ^^


Et moins qui pensait que ça passerait inaperçu !!!

:oops:

C'est corrigé

Modifié par Tannoy, 25 February 2011 - 09:10 AM.


#5 achauvire

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 411 messages

Posté 25 February 2011 - 09:12 AM

Voir le messagedada, le 25 February 2011 - 02:17 AM, dit :

On sent que tu n'avais pas trop d'exemple pertinent pour la boucle do..while (je sais, c'est moins facile d'en trouver ^^).
Tu peux prendre l'exemple d'une appli Air qui veut créer un fichier de log dans un dossier où d'autres existent et qui va incrémenter un index tant qu'un fichier de ce nom existe déjà.

En pseudo-code :
i = 0;
do {
  file.name = "log" + (++i);
} while (file.exist ());
file.write();

Mince encore démasqué sur l'exemple du do...while !!!

Merci pour ton exemple, je le mettrais en place ce midi.

:Hola:

#6 achauvire

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 411 messages

Posté 25 February 2011 - 13:34 PM

J'ai fait des corrections suite à vos remarques pertinentes.

Merci

#7 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 25 February 2011 - 13:58 PM

Salut Tannoy

Ayé tu en as marre des traduction ?! :mrgreen:

Donc tu t'attaques à du lourd.
Non je blague pas. Pour une fois je ne pratique pas l'ironie : ce type de choses est le plus épineux à transmettre vu qu'on s'adresse, par le fait, à un public très néophyte.
Forcément on ne se souvient plus de comment ça fait de rencontrer une structure de contrôle pour la première fois, et pour peu qu'on ait la malchance d'avoir tout compris tout de suite le jour où on nous les a "enseignées", et bien on ne voit pas ce qu'il y a à dire de plus que sur la doc.

Tu t'y es néanmoins appliqué - à ne pas refaire la doc - et c'est sûr que ce sera moins rébarbatif que se lire les pages qu'on sait \o/

Le difficile aussi c'est de trouver des exemples parlants compréhensibles et motivants par un public qui découvre - ou presque - le langage. Autant te dire que le do… while est aussi mon cauchemar ;) et que sauf à faire un blabla (illustré de peudo-code) j'ai toujours pas trouvé (mais tu me motives à y re-réfléchir).

Pour les autres structures et du point de vue d'AS3, donc de flash, considérons un public qui vient de l'environnement graphique, trator, toshop… qui s'est pris de goût pour l'animation et se trouve confronté à coder des petites choses (pour commencer).

:arrow: La boucle for illustrée dans un trace, c'est bien mais ça ne suffit pas (ceux à qui ça suffit ont trouvé leur bonheur dans la doc).
Ça mériterait d'être expliqué - quitte à ce que ceux à qui ça pose zéro problème sautent l'explication -

Quant à l'exemple de la table de multiplication, c'est du trace déguisé ;) Au passage : la démo est jolie comme tout et donne envie, super !

Donc en imaginant un public qui a un bagage minimum et tout frais : addChild et consœurs

On peut utiliser une boucle :
pour aligner des instances dans un clip - c'est un peu capilotracté je te l'accorde, mais ça fait une première mise en œuvre -
pour rendre visible/invisible des clips un sur deux (ce qui révise le modulo et remet une couche sur les booleens)
pour distribuer des instances en une grille (pcq ça, j'ai vu tellement d'horreur (y compris ds des "template" vendus) que je le passe systématiquement en cours et à mon avis ça ne ferait pas de mal sur un tuto ;)


Je reviens à l'exemple de la calculette. Avec le public que j'imagine, est-il nécessaire de passer par du transtypage et de la conversion - avec le risque d'induire quantité de confusions - pour récupérer une valeur depuis le nom du bouton ?

var numBouton:int=me.target.name.substr(2)

…il me semble que ça suffirait… quitte à le découper en deux lignes :roll:

Et puis peut-être aussi préciser que l'exemple a tété choisi à titre de mise en œuvre, mais que ds la vrai vie, avec probablement plus de 4 boutons on procéderait autrement (dans un conteneur avec capture. Tu peux : le tuto existe ;))


:arrow: Le while, c'est le moment ou jamais de l'illustrer avec

while (clip.numChildren) {
        clip.removeChildAt(0);
}
 

… et d'en profiter pour glisser que "tout ce qui n'est pas faux est vrai" (d'où la redondance du spontané clip.numChildren>0 ;)


:arrow: Vachement bien d'avoir pris le temps d'expliquer les break et label :Hola:


Voilà ce que je peux ajouter aux remarques de Dada, avec un grand merci renouvelé d'avoir pris le temps d'étoffer cette page, par ailleurs indispensable :) :)

[edit] le temps que j'écrive tout ça tu as passé des modifs semble-t-il.
Désolée d'être à la traine :?

Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos

#8 dada

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 8510 messages

Posté 25 February 2011 - 20:17 PM

while (clip.numChildren) {
        clip.removeChildAt(0);
}
Je te reprends ici, car il y a une mauvaise pratique : laisser le Flash Player convertir un nombre en booléen, et qui est surtout dans le cadre d'un tuto une cause de confusion.

L'instruction while attend un Boolean, hors clip.numChildren est un int.
Pourquoi ça marche ? Parce qu'un nombre différent de zéro est converti (pendant l'exécution) à true, et zéro à false.
Qu'est ce qu'on veut vérifier comme condition ? -> Que le nombre d'enfants est supérieur à zéro, donc on l'écrit. :D

while (clip.numChildren > 0) {
        clip.removeChildAt(0);
}

Sinon, l'exemple est bien. :)

Et il te plaît pas mon exemple de do..while ? ;)
J'ai mis du pseudo code parce que je n'utilise pas suffisament Air (jamais en fait :P) pour connaître par coeur l'API, mais je peux regarder pour le vrai code.

EDIT : En gros, le code ressemblerait à ça (non testé), peut-être un peu compliqué pour illustrer une boucle.
var logFile : File;

var filePrefix : String = "monFichier";
var fileSuffix : int = 1;

// Tant que le fichier existe on continue à chercher. Il se peut qu'aucun n'existe,
// dans ce cas le do n'est exécuté qu'une fois.
do
{
        logFile = File.applicationDirectory.resolvePath( filePrefix + fileSuffix++ );
} while ( logFile.exists );

// On a trouvé le nom de fichier qui permet de ne pas en écraser un autre, donc on l'écrit.
var stream : FileStream = new FileStream();
stream.open( logFile, FileMode.WRITE );
stream.writeUTF( "Coucou" );
stream.close();


#9 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 25 February 2011 - 23:24 PM

Voir le messagedada, le 25 February 2011 - 20:17 PM, dit :

while (clip.numChildren) {
        clip.removeChildAt(0);
}
Je te reprends ici, car il y a une mauvaise pratique :

ha oui ? C'est pas bien de lui laisser faire la conversion ? Ben zutalors. J'ai la flemme de vérifier… je te crois sur parole.
… et je prends bonne note ;)


Citation

Et il te plaît pas mon exemple de do..while ? ;)

Raa comment il est susceptible :D ai-je dt qu'il ne me plaisait pas ? Je me suis solidarisée du trou d'imagination de Tannoy. Il est bien ton exemple :roi:


Merci de la vigilance ;)
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos

#10 dada

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 8510 messages

Posté 25 February 2011 - 23:54 PM

Voir le messageNataly, le 25 February 2011 - 23:24 PM, dit :

C'est pas bien de lui laisser faire la conversion ?
C'est surtout pas bien pour un tuto, pour quelqu'un qui n'est pas habitué au code c'est déjà confu, alors autant être précis.
Ça veut dire quoi en français : "Tant que le nombre d'enfant" ?
Alors que : "Tant que le nombre d'enfants est supérieur à zéro", ça veut dire quelque chose. :)

D'un point de vue technique, c'est là où l'AS3 est pas assez strict, il ne devrait pas laisser passer ça, c'est une erreur de type, on place un int là où un Boolean est attendu.

#11 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 26 February 2011 - 02:46 AM

Voir le messagedada, le 25 February 2011 - 23:54 PM, dit :

C'est surtout pas bien pour un tuto, pour quelqu'un qui n'est pas habitué au code c'est déjà confus, alors autant être précis.
Ça veut dire quoi en français : "Tant que le nombre d'enfant" ?

ah, tu me rassures :eusa_doh: autrement ce n'est pas une "faute" de code et ce n'est pas plus lent (c'est ça que j'ai pas regardé), c'est juste qu'on profite de la conversion implicite ?

S'entend qu'on en profiterait (ds le tuto) pour expliquer, (d'où le "tout ce qui n'est pas faux est vrai" - null, zéro "étant" faux -)

Quel chinois ce chat ! (mais là c'est la poêle qui se fout du chaudron :P)
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos

#12 dada

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 8510 messages

Posté 26 February 2011 - 03:09 AM

Voir le messageNataly, le 26 February 2011 - 02:46 AM, dit :

ah, tu me rassures :eusa_doh: autrement ce n'est pas une "faute" de code et ce n'est pas plus lent
Ça ne semble pas être plus lent, mais théoriquement ça reste une erreur de type, même si Flash Player la prend en charge.

Citation

Quel chinois ce chat !
Chinois, chinois, hum... :roll: Tu veux dire, hum... quoi en fait ? :D

#13 * *** DAMDAM *** *

    Ceinture Blanche

  • Members
  • Pip
  • 1 messages

Posté 11 March 2011 - 11:43 AM

Bonjour,
Je ne sais pas si c'est très approprier car je débute en action script et j'avais d'abord commencé par le livre de thibault Imbert "Pratique de l'action script 3" mais j'ai vite été largué et je me suis tourné vers cette plateforme.
Bref, dans les premières page du livre au chapitre II et nouveau type de primitif... Des test d'éxécution avec et sans conversion montre que l'on peut perdre + de400% du temps d'exécution lorsque l'AVM converti le type.
Je crois bien que ça un rapport mais si ce n'est pas le cas... Recentrez moi...

Concernant les tutos disponibles j'ai appris des choses en une semaine que je n'avais pas compris en 3 mois..
Il sont plutôt bien fait pour apprendre les bases... CONTINUEZ.


Voir le messageNataly, le 26 February 2011 - 02:46 AM, dit :

ah, tu me rassures :eusa_doh: autrement ce n'est pas une "faute" de code et ce n'est pas plus lent (c'est ça que j'ai pas regardé), c'est juste qu'on profite de la conversion implicite ?

S'entend qu'on en profiterait (ds le tuto) pour expliquer, (d'où le "tout ce qui n'est pas faux est vrai" - null, zéro "étant" faux -)

Quel chinois ce chat ! (mais là c'est la poêle qui se fout du chaudron :P)


#14 Bernard Albert

    Ceinture Blanche

  • Members
  • Pip
  • 5 messages

Posté 29 April 2011 - 11:23 AM

Bonjour,
Je suis débutant en AS3 et je suis l'excellent Tuto de Tannoy sur les boucles. J'ai un petit pblm avec son fichier fla qui donne l'interface pour l'exemple des multiplications.
Je ne peux le charger car je possède Flash CS3.
QQ pourrait' il me le convertir en CS3?

Merci d'avance

Bernard Albert



Le lien : Mon lien

Fichier(s) joint(s)

  • Fichier joint  base.fla   57.5 Ko   1 téléchargement(s)


#15 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 29 April 2011 - 11:25 AM

Hop

Fichier(s) joint(s)

  • Fichier joint  base.fla   42.5 Ko   5 téléchargement(s)


#16 Bernard Albert

    Ceinture Blanche

  • Members
  • Pip
  • 5 messages

Posté 29 April 2011 - 11:37 AM

Voir le messageDldler, le 29 April 2011 - 11:25 AM, dit :

Hop
Merci Didier c'est génial c'est Top
Bernard Albert

#17 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 29 April 2011 - 13:13 PM

Tant qu'à y être, je le rajoute au tuto. Voilà c'est fait.
Merci Dldler ;)

#18 achauvire

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 411 messages

Posté 29 April 2011 - 13:17 PM

Merci Didier et lilive.

Bernard, je pense que mon idée de la demande sur le forum était bonne. :smile:

#19 Bernard Albert

    Ceinture Blanche

  • Members
  • Pip
  • 5 messages

Posté 29 April 2011 - 13:46 PM

Voir le messageTannoy, le 29 April 2011 - 13:17 PM, dit :

Merci Didier et lilive.

Bernard, je pense que mon idée de la demande sur le forum était bonne. :smile:
Tu as raison Tannoy excellente idée est tour est en ordre à présent



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP