AS3 : flash.display.AVM1Movie
Par DickRivers, vendredi 7 juillet 2006 à 02:24 :: Flash :: #98 :: rss
Comme vous le savez le player 9 intègre une nouvelle machine virtuelle appelée AVM2 (ActionScript Virtual Machine 2), cette machine virtuelle interprête le code AS3 et ne peut interprêter que celui-ci. De l'autre côté nous avons la AVM1 (ActionScript Virtual Machine 1) qui elle interprête l'Actionscript 1 et 2.
Le player 9 embarque donc les deux machines virtuelles, lorsqu'il détecte du code AS1 ou AS2 il lance la VM1, lorsqu'il rencontre de l'AS3 il lance la VM2. Si vous testez depuis Flash 9 une appli comportant du code AS1/AS2 et de l'AS3 Flash refusera de compiler celle-ci.
Ce qui paraît logique c'est soit l'un soit l'autre, par contre que se passe t-il si je charge un SWF version 8 ou antérieure donc un SWF AVM1 dans un SWF AS3 donc tournant sous la VM2, et bien bonne surprise les deux machines virtuelles tournent toutes les deux sans problème, vous pouvez donc charger sans problème un SWF 8 ou antérieure dans votre nouvelle appli AS3, un objet de type flash.display.AVM1Movie sera crée par la classe Loader, alors vous vous dites mortel je peux donc cibler mes objets sans problème une fois mon swf chargé
Pas si simple, la communication entre les deux SWF est donc réduite, les machines virtuelles étant différentes vous ne pouvez pas appeler une méthode dans le SWF AVM1Movie, ou bien accéder à ses objets ou propriétés.
Une chose intéressante, si vous ciblez la propriété _root au sein du SWF AVM1Movie chargé, la logique Flash voudrait que vous cibliez le scénario du SWF AS3 chargeant, dans ce cas absolument pas, vous ciblerez alors le _root du SWF chargé, exactement comme si vous aviez spécifié _lockroot = true dans le SWF chargé
Il est aussi impossible pour ce SWF AVM1Movie de charger des fichiers dans des _level, de la même manière le chargement d'autres SWF au sein du scénario du SWF AVM1 est aussi interdit.
On pense (Mama
) alors à un autre moyen de communication entre deux SWF, j'ai nommé : LocalConnection, et là c'est cool, on peut lire :
J'ai donc réalisé un petit exemple, un SWF AS3 compilé en player 9 (pastille bleue) charge un SWF AS1/AS2 compilé pour le player 8, avec LocalConnection je passe des infos de mon SWF AS3 vers mon SWF AS1/AS2, bien entendu la communication marche dans les deux sens
Cliquez simplement, pour passez une vitesse aléatoire au clip du SWF chargé.
Pour une communication par SharedObject, attention au moment de créer votre SharedObject en AS3 vous devrez spécifier le format AMF à utiliser, pour qu'un SWF AS1/AS2 puisse lire les données d'un SharedObject crée en AS3 vous devez impérativement spécifier le format AMF0 (flash.net.ObjectEncoding.AMF0) et non AMF3 (flash.net.ObjectEncoding.AMF3) valeur par défaut, par la propriété objectEncoding.
Ce qui paraît logique c'est soit l'un soit l'autre, par contre que se passe t-il si je charge un SWF version 8 ou antérieure donc un SWF AVM1 dans un SWF AS3 donc tournant sous la VM2, et bien bonne surprise les deux machines virtuelles tournent toutes les deux sans problème, vous pouvez donc charger sans problème un SWF 8 ou antérieure dans votre nouvelle appli AS3, un objet de type flash.display.AVM1Movie sera crée par la classe Loader, alors vous vous dites mortel je peux donc cibler mes objets sans problème une fois mon swf chargé
Pas si simple, la communication entre les deux SWF est donc réduite, les machines virtuelles étant différentes vous ne pouvez pas appeler une méthode dans le SWF AVM1Movie, ou bien accéder à ses objets ou propriétés.
Une chose intéressante, si vous ciblez la propriété _root au sein du SWF AVM1Movie chargé, la logique Flash voudrait que vous cibliez le scénario du SWF AS3 chargeant, dans ce cas absolument pas, vous ciblerez alors le _root du SWF chargé, exactement comme si vous aviez spécifié _lockroot = true dans le SWF chargé
Il est aussi impossible pour ce SWF AVM1Movie de charger des fichiers dans des _level, de la même manière le chargement d'autres SWF au sein du scénario du SWF AVM1 est aussi interdit.
On pense (Mama
) alors à un autre moyen de communication entre deux SWF, j'ai nommé : LocalConnection, et là c'est cool, on peut lire :
LocalConnection objects created in ActionScript 3.0 can communicate with LocalConnection objects created in ActionScript 1.0 or 2.0. The reverse is also true
J'ai donc réalisé un petit exemple, un SWF AS3 compilé en player 9 (pastille bleue) charge un SWF AS1/AS2 compilé pour le player 8, avec LocalConnection je passe des infos de mon SWF AS3 vers mon SWF AS1/AS2, bien entendu la communication marche dans les deux sens
Cliquez simplement, pour passez une vitesse aléatoire au clip du SWF chargé.
Pour une communication par SharedObject, attention au moment de créer votre SharedObject en AS3 vous devrez spécifier le format AMF à utiliser, pour qu'un SWF AS1/AS2 puisse lire les données d'un SharedObject crée en AS3 vous devez impérativement spécifier le format AMF0 (flash.net.ObjectEncoding.AMF0) et non AMF3 (flash.net.ObjectEncoding.AMF3) valeur par défaut, par la propriété objectEncoding.
Commentaires
1. Le vendredi 7 juillet 2006 à 09:54, par dehats
2. Le vendredi 7 juillet 2006 à 10:19, par mama
3. Le vendredi 7 juillet 2006 à 11:22, par Tek
4. Le vendredi 7 juillet 2006 à 14:14, par starmonkey
5. Le samedi 8 juillet 2006 à 14:38, par dehats
6. Le samedi 8 juillet 2006 à 18:15, par mama
7. Le samedi 8 juillet 2006 à 23:21, par starmonkey
8. Le vendredi 26 janvier 2007 à 12:35, par ACME
9. Le mardi 19 juin 2007 à 15:33, par TechnoGuru
10. Le mardi 3 juillet 2007 à 19:03, par Matt
11. Le mercredi 5 septembre 2007 à 10:43, par Thomas
Ajouter un commentaire