Forums Développement Multimédia

Aller au contenu

[RESOLU] Données partagées d'un SWF à un autre

AS3 _global CODE Actionscript SWF Chargement

15 réponses à ce sujet

#1 RolyMix

    Ceinture Orange

  • Members
  • PipPipPip
  • 48 messages

Posté 21 February 2014 - 16:02 PM

Bonjour à tous,

J'ai créé une application de videoguidage en AS2 avec une diffusion en EXE, et maintenant je souhaite l'adapter en AS3 pour une diffusion en application Android.

Dans mon appli, j'ai un player, et une multitude de SWF qui contiennent dans chaque, une video FLV et un petit clip que j'appelle pour masque la video si jamais on veut se servir de ce SWF video sans le player.

Pour être sur que c'est mon player qui est utilisé pour lancer les SWF video, j'utilisais une donnée rangées dans _global dans ma version AS2. Le player charge dynamiquement le SWF video qui va bien.

dans le player je mettais :
_global.ABCDE = "ma chaine de caractere codée";

et dans le swf video je testais mon mot de passe :

if (_global.ABCDE == undefined or !(_global.ABCDE == "ma chaine de caractere codée")) {
         monMasqueVideo.visible=true;
         maVideo.stop();
}
 

Ce qui arretait ma video et placait mon masque par dessus, masque contenant un petit message demandant de ne pas lancer le fichier sans le player.

Bref,... _global n'existe plus en AS3, et je cherche une méthode similaire.

J'ai essayer de faire une faire une donnée globale (déclarée sans private) dans ma classe principale.

package {
       
   import flash.display.MovieClip;
   public class MainVideo extends MovieClip {
         var myPassword:String = "ma chaine de caractere codée";
...
 

et dans le fichier SWF Video, pour permettre la compilation, j'ai ajouté :


//pour permettre la compilation et ne pas avoir d'erreur
if (myPassword == null) {
         var myPassword:String = "- ERROR -";
}

//test du mot de passe
if (myPassword == "- ERROR -" || !(myPassword == "ma chaine de caractere codée")) {
         monMasqueVideo.visible=true;
         maVideo.stop();
}

 


Mais je me rends compte que myPassword n'est jamais créé et n'a jamais de contenu...

J'ai du coup essayer avec les SharedObject
Le player y place un mot de passe comme ceci

         private var password:SharedObject;
               
                private function initPassword():void {
                        password = SharedObject.getLocal("password");
                        password.data.ABCDE = "ma chaine de caractere codée";
                        password.flush();
                }

et la Video le lit et le vérifie


         private var myObjectPassword:SharedObject;
         private var myPassword:String = "-ERROR-";
               
                public function MainVideo():void {

                 //récupération de la mémoire mot de passe
                 myObjectPassword= SharedObject.getLocal("password");
                 myPassword= myObjectPassword.data.ABCDE;
                 
                   //test du mot de passe
                   if (myPassword== "- ERROR -" || !(myPassword== "ma chaine de caractere codée")) {
                         monMasqueVideo.visible=true;
                         maVideo.stop();
                   }

 

mais apparemment les SharedObject ne sont pas partagés puisque je ne retrouve pas de valeur dans la donnée lue sur le SWF Video.

Bon j'ai cherché, promis je ne suis pas venu supplier votre aide directement... mais bon il faut que j'avance... qui peut m'aider ? Merki

#2 t-servi.com

  • Members
  • PipPipPipPipPipPipPipPip
  • 765 messages

Posté 21 February 2014 - 21:44 PM

Salut,
Tu dois déclarer le mot de passe en static, à mon avis.
A+.
Jean.
PS : http://help.adobe.co...18a9b90204-7f25

#3 RolyMix

    Ceinture Orange

  • Members
  • PipPipPip
  • 48 messages

Posté 25 February 2014 - 14:22 PM

Bonjour ! alors j'ai essayé en passant la donnée en statique et ça ne fonctionne pas mieux.

J'ai l'impression que les deux animation travaillent dans deux univers différents...

#4 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6997 messages

Posté 25 February 2014 - 14:47 PM

Salut,

Essayes une variable à la fois publique et statique dans ta classe Main :

public static var motDePasse:String = "mot de passe";

Ou directement avec un méthode publique dans ta classe Main :

public function motDePasse():String { return "mot de passe"}

Sinon tu peux tenter :

if (_global == null ) {
        var _global = this ;
}
_global.ABCDE = "Test" ;
 


Pour savoir si tes SWF travaillent au même endroit, tente de tracer leurs parents.

#5 RolyMix

    Ceinture Orange

  • Members
  • PipPipPip
  • 48 messages

Posté 25 February 2014 - 15:03 PM

Merci pour ces pistes de recherche.

1) Pour la méthode public statique, c'est ce que je venais de faire.

2) Et comment je fait pour faire appel à la fonction créée dans mon animation chargée sans avoir d'erreur à la compilation ?

3) Peux tu m'expliquer comment me servir de cette méthode car je ne comprends pas comment elle fonctionne ni où l'intégrer...

Merci de ton aide

#6 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6997 messages

Posté 25 February 2014 - 15:25 PM

Re,

Citation

Et comment je fait pour faire appel à la fonction créée dans mon animation chargée sans avoir d'erreur à la compilation ?

Ben pour moi y a erreur de conception à ce niveau, ce n'est pas un enfant qui va demander au parent ce qu'il doit faire, mais au parent à dire à l'enfant ce qu'il doit faire. A mon sens tes vidéos devraient toujours commencer par un voile bleu par défaut, et ta classe Main devrait supprimer le voile bleu de l'enfant chargé, puis lancer la vidéo.

Ceci résoudrait ton problème de mot de passe crypté qui de toute façon serait visible en décompilant le code (donc ne servirait à rien) sauf si tu le met en tant que donnée dynamique appelée depuis un élément externe (base de donnée ou autre + PHP pour des appels côté serveur). De plus ça t'éviterai de devoir modifier le code de tes X vidéos à chaque fois que tu veux faire une modif.

Ce code placé dans la vidéo :

if (_global.ABCDE == undefined or !(_global.ABCDE == "ma chaine de caractere codée")) {

Indique le mot de passe final, puisqu'il le compare au mot de passe que l'on veut tester.
Il suffit donc de décompiler la vidéo pour trouver le bon mot de passe et c'est terminé.

Sinon, ton enfant plante et c'est normal puisque tu lui demande d'appeler une méthode ou une variable qui n'existe pas dans son propre scope au moment de la compilation, c'est pourquoi à mon sens ce n'est pas à l'enfant de faire cette vérification mais au parent.

Citation

Pour la méthode public statique, c'est ce que je venais de faire.

Normalement une variable publique et statique est accessible partout dans le scope.

La méthode la plus efficace à mon sens pour protéger la diffusion c'est de passer par du PHP qui va indiquer si tu es sur le bon serveur et autoriser ou non la diffusion.

#7 RolyMix

    Ceinture Orange

  • Members
  • PipPipPip
  • 48 messages

Posté 25 February 2014 - 16:03 PM

Tu as raison d'en revenir aux bases : les parents commandent les enfants. Comme tu l'auraas compris j'essaie de refaire ce que je faisait en AS2 pour l'AS3.

Pour la sécurité des vidéos, j'utilise un support mobile avec les vidéos dessus. Je ne passe pas par un server qui nécessiterai un accès internet haut débit partout.

Sinon pour revenir à la méthode pour commander l'animation enfant, mon loader correspondra à mon animation ? Je vais essayer de voir comment la commander.

#8 RolyMix

    Ceinture Orange

  • Members
  • PipPipPip
  • 48 messages

Posté 25 February 2014 - 17:09 PM

Bon je n'y arrive pas... j'arrive pas à accéder aux différentes propriétés de mon animation SWF chargée.

Je me suis demandé si il n'y avait pas une restriction au niveau des échanges entre les deux animations.

Je suis tombé la dessus
http://help.adobe.co...lowDomain%28%29

allowDomain() permet d'autoriser les échanges. C'est une propriété de la class Security.

Sur cette page on a un bel exemple de ce que je veux faire (en image)
Image IPB

Et curieusement eux, ne parle pas d'une erreur de référence quand il essaiera d'accéder à eggCount en passant par content (ce qui plante chez moi)

Comment puis-je faire ? C'est bête d'être bloqué la dessus... J'espère quand même que deux animation peuvent parler entre elles quand même, sinon c'est dommage...

EDIT : ah oui j'oubliais de dire que de toute façon le allowDomain() ne m'aide pas plus :D

#9 RolyMix

    Ceinture Orange

  • Members
  • PipPipPip
  • 48 messages

Posté 25 February 2014 - 17:35 PM

Pour poursuivre sur les pistes de mon problème, le positionnement du fichier dans l'arborescence de répertoire est-il important ?

En utilisant FlashDevelop, il m'installait mon APK quelque part (je ne suis pas sur précisement mais il me semble qu'il s'agit d'un répertoire
pkg:/data/local/tmp/
Mon fichier SWF, je l'ai au début placé dan sun repertoire accessible par l'USB
file://mnt/sdcard/...
Dans ce cas de figure ca ne fonctionne pas.

ensuite j'ai ajouté mon SWF aux sources de mon projet et changé le chemin en
swfs/ (car j'ai créé un répertoire swfs contenant mon swf)
Ca charge bien mon swf, je ne sais pas ou il ajoute le fichier (certainement dans pkg:/data/local/tmp/swfs ?) mais c'est pareil, pas de communication entre les deux fichiers...

Voila comme quoi je cherche ^^ pourtant ça a l'air tellement trivial... J'ai du mal la... je vais me rentrer à ma maison ^^ mais écrivez moi, j'ai mis mon projet sur ma dropbox, je testerai vos recommandation chez moi ;)

#10 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6997 messages

Posté 25 February 2014 - 17:36 PM

Re,

Je capte pas un truc, quand tu dis que tu charge les vidéos on est d'accord que tu as un "root", celui de ton application, dans lequel tu charge tes SWF (je suppose dans un conteneur que tu peux alors placer facilement sur ta scène).

Citation

Dans mon appli, j'ai un player, et une multitude de SWF qui contiennent dans chaque, une video FLV et un petit clip que j'appelle pour masque la video si jamais on veut se servir de ce SWF video sans le player.

Quand tu charge un swf(vidéo) dans ce conteneur (player), tu peux accéder aux propriétés et méthodes de ce swf depuis le "root" ou le conteneur.

Donc, dans ta vidéo (swf) sur la première frame tu met un carré bleu et un code : stop();
Sur la seconde frame tu pose la vidéo à lire.

Dans ton application principale, tu charge ton swf dans ton player, puis tu cible le conteneur et tu lui dit : monConteneur.Play();

Ensuite si tu veux absolument un mot de passe, dans ton swf (video) sur la première frame (ou dans une classe à toi de voir) tu ajoute :


function lanceToi(valeur=""):void{
        if (valeur == motdepasse) {
                play();
        }
}

 

Et depuis ton application tu écoute le chargement du swf(video) et lorsqu'il est terminé tu lance la fonction avec le bon paramètre :

monConteneur.lanceToi(motdepasse);

L'enfant sait comment il doit faire une chose de manière autonome mais c'est le parent qui lui dit quand la faire.

Reste à présent que ce n'est pas du tout sécurisé et va t'obliger à modifier le mot de passe de toutes tes vidéos dès que tu veux faire une modif... donc pour moi c'est tout aussi sécurisé que de mettre une image bleue en début de vidéo et de faire un play() au moment voulu.

#11 RolyMix

    Ceinture Orange

  • Members
  • PipPipPip
  • 48 messages

Posté 25 February 2014 - 17:49 PM

Ok pour la page bleue Mr Spi, je suis d'accord avec toi. Disons que ca m'aurait aussi permis de faire une différence entre différents jeux de videos... mais passons, pour commencer le dialogue ce sera parfait.

pour charger mon SWF j'utilise le code suivant :

         private var conteneurImage:Loader = new Loader();
         private const path:String = "swfs/";
 
         public function Main() {
         var mySWF:URLRequest = new URLRequest(path + "monAnim.swf");
         conteneurImage.load(mySWF);
...



j'ai même fait une variante en ajoutant le contexte d'execution
         var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain, null);
         conteneurImage.load(mySWF, loaderContext);

Mon objet Loader n'est pas un Movieclip, je peux pas faire utiliser la méthode play() avec...

conteneurImage.play();

 
cette ligne me renvoie une erreur

#12 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6997 messages

Posté 25 February 2014 - 18:22 PM

Essayes avec un transtypage : MovieClip(conteneurImage).play();

#13 RolyMix

    Ceinture Orange

  • Members
  • PipPipPip
  • 48 messages

Posté 26 February 2014 - 10:11 AM

Bon le transtypage est interdit apparemment. Juste pour préciser, je travail sous Air :)

Sur le forum j'avais trouvé ca
http://forums.mediab...s-de-swf-a-swf/

et ca semblait tellement simple, mais le test à .parent de mon fichier chargé me renvoie Null, ce qui montre qu'il doit y avoir quelque chose de plus... comme une contrainte de sécurité... non ? Je suis certains qu'avec Flash Player ça fonctionne nikel... pfff

#14 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6997 messages

Posté 26 February 2014 - 11:39 AM

Hello,

Ceci devrait marcher :

var video:MovieClip = new MovieClip();
var loader:Loader = new Loader();
var url:URLRequest = new URLRequest("anim.swf");

loader.load(url);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, finCharge);

function finCharge(e:Event):void{
        video = MovieClip(loader.content);
        addChild(video);
        video.play();
}
 

Tu crée un conteneur "video" qui est un clip vide.
Tu charge ton swf externe dans un objet "loader".
Tu attend la fin du chargement du swf.
Tu affecte le contenu du loader à ton clip "video".
Tu ajoute ta vidéo à la liste d'affichage.
Tu la manipule comme un objet normal.

La racine de ton SWF (la vidéo chargée) est à présent la racine de l'objet "video".

A lire à propos de la propriété "content" du loader : http://help.adobe.co...er.html#content

#15 RolyMix

    Ceinture Orange

  • Members
  • PipPipPip
  • 48 messages

Posté 26 February 2014 - 16:49 PM

Bon effectivement ça fonctionne bien comme ça : j'arrive à accéder aux méthodes et propriétés de ma vidéo.

Donc, le point clé de cette discussion :

Lorsque je charge un SWF, il faut que déclare le Loader.content comme Movieclip pour y accéder et y travailler.
Du coup, le clip swf chargé reconnait son "parent".

- sans déclaration de l'enfant dans Movieclip :
this = class de document
parent = null

- avec déclaration de l'enfant dans Movieclip :
this = class de document
parent = Loader
parent.parent = Main

Et du coup on remarque que la parent n'est pas de type "Movieclip" (apparemment normal puisque le Movieclip est une création depuis le loader... mais néanmoins curieux que sans déclaration, nous ne puission spas avoir de parent = Loader...)

Noter une petite chose aussi :
La Sandbox de sécurité ("Security.sandboxType") dans laquelle est chargé mon animation mère est "Application".
Si j'intègre mon SWF à mon projet directement, la Sandbox de sécurité de cette animation est aussi "Application" (appel par le chemin relatif), tout fonctionne bien.
Si j'utilise "file://mnt/sdcard/.../animation.swf" (endroit ou je copie par le câble USB sur la mémoire de ma tablette), la Sandbox de sécurité de cette animation est "localWithFile" (normal). Et dans ce cas de figure, je n'arrive pas à lancer des méthodes, mais je peux modifier des propriétés. De la même manière, "animationFille.parent" me renvoie "null".

Encore merci à Mr Spi pour ses recherches et explications et à t-servi.com pour sa réactivité.

J'espère que ces informations seront aussi claires pour celui qui lira qu'elles le sont pour moi aujourd'hui.

#16 RolyMix

    Ceinture Orange

  • Members
  • PipPipPip
  • 48 messages

Posté 26 February 2014 - 17:07 PM

Voir le messageRolyMix, le 25 February 2014 - 17:09 PM, dit :

Je suis tombé la dessus
http://help.adobe.co...lowDomain%28%29

Sur cette page on a un bel exemple de ce que je veux faire (en image)
Image IPB

Et curieusement eux, ne parle pas d'une erreur de référence quand il essaiera d'accéder à eggCount en passant par content (ce qui plante chez moi)

et au passage cette petite image de la doc est fausse car on a forcément une erreur d'accès à une propriété non définie à la compilation sur eggCount et DisplayEgg car "Loader.content" n'est pas Dynamique alors que "Movieclip" l'est.



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