Un mémo perso pour les bouts de codes qu’on utilise tout le temps et qui ont changés en as3.
Pour créer une instance d’une classe dynamiquement créee :
import flash.utils.getDefinitionByName; var dynamicClass:String = "btn" + i; var classRef:Class = getDefinitionByName(dynamicClass) as Class; var myBtn = new classRef(); addChild(myBtn);
Désormais, en AS3, si une sprite est placé au-dessus d’un bouton, la zone cliquable du bouton n’est plus active. Pour le rendre à nouveau cliquable, il faut changer la propriété mouseEnabled de la sprite qui la recouvre :
mySprite.mouseEnabled = false;
buttonMode sur un movieClip avec un champ dynamique
Lorsque l’on crée un clip avec un champ texte dynamique et qu’on veut lui appliquer des comportements de bouton, le curseur de la souris ne change pas au survol du texte. Les champs texts émettant des événements TextEvent, cela provoque une confusion dans le flux des événements. Il faut alors désactiver cette diffusion par un mouseChildren = false;
mc.buttonMode = true; mc.mouseChildren = false; mc.addEventListener(MouseEvent.CLICK, clickHandler); function clickHandler(e:MouseEvent):void{ trace(e); }
GetURL :
import flash.net.navigateToURL; import flash.net.URLRequest; navigateToURL(new URLRequest("myURL"), "_blank");
Xml
Pour faire une boucle avec des noeuds xml, on n’utilise pas la propriété xml.length mais la fonction du même nom !
for (i= 0 ; i < xml.length() ; i++) { ... }
objet Sound
Pour loader un son dans la bibliothèque (feu attachMovie)
var mySound:mySoundId = new mySoundId(); // où mySoundId et le nom de liaison du son dans la bibliothèque
Pour loader un son et lui appliquer un volume
var mySound:mySoundId = new mySoundId(); var channel:SoundChannel = new SoundChannel(); var transform:SoundTransform = new SoundTransform(0.5); // (volume à 50%) channel = mySound.play(0, 0, transform);
Pour autoriser au flash de lire sur n'importe quel domaine
import flash.system.Security; Security.allowDomain("*");
Pour loader une librairie externe
var ldr:Loader = new Loader(); var url:String = "loaded.swf"; var urlReq:URLRequest = new URLRequest(url); ldr.load(urlReq); addChild(ldr); ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); function completeHandler(event:Event):void { var domain:ApplicationDomain = ldr.contentLoaderInfo.applicationDomain; // MonClip est le nom de la classe que l'on veut atteindre dans le clip loadé var MonClip:Class = domain.getDefinition("MonClip") as Class; trace(domain.getDefinition("MonClip")); var monClip = new MonClip(); addChild(monClip); }
Pour récupérer les flashVar de l'embed
dans le swfObject de l'html :
var flashvars = { varName:"maVariable" };
dans l'as :
import flash.display.LoaderInfo; var myFlashVar:String = loaderInfo.parameters.varName;
Pour intégrer des polices
import flash.text.Font; import flash.system.ApplicationDomain; // Application domain var fontDomain:ApplicationDomain = loader.getMovieClip("fonts").loaderInfo.applicationDomain; // fonts var FedraSerifAProDemiClass:Class = fontDomain.getDefinition("FedraSerifAProDemi") as Class; Font.registerFont(FedraSerifAProDemiClass);
Puis pour l'utiliser :
import flash.text.TextFormat; import flash.text.Font import flash.text.TextField; var format:TextFormat = new TextFormat(); var txt:TextField; format.font = "Fedra Serif A Pro Demi"; txt.embedFonts=true; txt.setTextFormat(format);
asfunction en AS3 : TextEvent.LINK remplace asfunction en AS3.
var textfield:TextField = new TextField(); textfield.htmlText = "Ceci permet de passer des paramètres dans un champ texte dynamique"; textfield.addEventListener(TextEvent.LINK, linkHandler); addChild(textfield); function linkHandler(e:TextEvent):void { trace(e.type); // link trace(e.text); // param:valeur,param2:valeur }
Pour effacer tous les displayObjects d'une sprite :
while (mySprite.numChildren) mySprite.removeChildAt(0);
BulkLoader, loaderInfo, applicationDomain :
Pour accéder d'un swf chargé, à une classe "Bar" d'une librairie parent :
var foo:* = this.loaderInfo.applicationDomain.getDefinition("Bar");
Pour activer le lissage sur une image loadée via bulkLoader :
private function onImageLoaded(evt:Event):void { evt.target.removeEventListener(Event.COMPLETE, onImageLoaded); var bitMap : Bitmap = _loader.getBitmap(evt.target.id); bitMap.smoothing = true;//turn on smoothing }
Pour copier une image chargée via bulkLoader :
var_img: Bitmap = new Bitmap(_loader.getBitmapData(id).clone());
Pour couper la Netconnexion d'un flv chargé par le composant FLVPlayback : Même en utilisant la méthode myFlvPlayback.stop(), le composant continue à charger le flv.
player.getVideoPlayer(0).close();
XML et ECMAScript
Pour trouver les noeud avec l'attribut "monTroisiemeID" :
var monNoeud:XMLList = item.attribute("monTroisiemeID");
Pour trouver le noeud dont l'attribut id = "monTroisiemeID" :
var monNoeud:XMLList = item.(@id == "monTroisiemeID");
Hello Trân, ‘espère que tu va bien.
Ce petit memo tombe bien car je voulais parler avec toi de ces choses qui ont changé*
J’avais pris pour habitude en as2 de créer un main.swf qui allait loader tout les contenues (swf/xml/img)
ce même main ne contenant aucun autre éléments a part du code était très léger et me permettait de faire un loader qui commençait vraiment à 0% (tu voie de quoi je parle j’en suis sure)
C’est naturellement que j’ai commencé mes projets as3 avec cette même approche.
Au passage je t’invite à checker la version alpha de casa pour l’ as3 svn.as3.casaframework.org…
Seulement voilà, le duplicateMovieClip ayant disparu je me suis rendu compte que les addchild de clips liés dans les library (ton memo1) de swf loadés n’été pas supportés.
Obligé donc de lier mes movieclips depuis la library du main pour pouvoir faire mes addchild.
Cet élément se trouvant être un bloc texte avec une typo incluse cela fait vite grimper les Ko.
Quelle méthode utilise tu pour pallier à cela? Ne me dit pas que tu fais tout dans un seul et même swf~
J’ai d’autres points à voir avec toi mais on en parlera plus tard.
En espérant partager un repas prochainement avec toi
hello Adrien,
Pour loader des swf externes, je te conseilles d’utiliser la librairie bulkloader (http://code.google.com/p/bulk-loader/). C’est très bien fait et simple à utiliser. ça te permet de gérer de multiples chargement.
Tu peux toujours faire des “attachMovie” de tes clips de ta bibliothèque, ainsi que des “duplicate”. Dans ta bibliothèque tu crées un clip. Tu lui spécifies comme nom de classe MonClip, comme classe de base flash.display.MovieClip
Ensuite sur la timeline, tu peux faire :
var monClip:MonClip = new MonClip(); addChild(monClip);
t
tu perd l’ "attachMovie" quand tu passe dans un clip qui load un swf.
var monClip:MonClip = new MonClip(); addChild(monClip);
ca c’est bon quand tu travail sur un seul fla.
si MonClip viens d’une librairie loadé ca renvoi null.
Il faut utiliser getDefinition() et ApplicationDomain.
Je l’ai rajouté à la liste, et t’envoie un exemple.
c’est top, j’essaye ca dans la journée!
Dis, je peu participer à ton memo?
salut Tran
un petit coucou en passant.
figures-toi que ton mémo AS3 "Pour loader une librairie externe" m’a bien aidé ! je me mets enfin ;) au chargement dyn de bibliotheque en AS3. vieux motard que j’aimais …
portes toi bien
à pluche
Cédric
Merci pour ces infos qui nous permettront d’avancer dans nos démarches. Je relaie sur mon blog perso ….