• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
Locked
0

[French] Animate CC / AIR : Fichier "parent" et "enfants" (.apk et swf)

Community Beginner ,
May 08, 2016 May 08, 2016

Copy link to clipboard

Copied

(I'm sorry, I don't speak english   )

Bonjour,

je cherche vainement de l'aide depuis des semaines pour résoudre un problème... Je tente ici.

Voilà, je souhaite créer une sorte de "livre dont vous êtes les héros", où un fichier parent (.apk) va charger des chapitres du livre ("swf" sur un serveur). Comme une page correspond à une image-clé de la scène principale (de chaque chapitre, donc fichier enfant "swf"), le lecteur va pouvoir sauvegarder sa lecture en enregistrant la position de la tête de lecture.

Alors, j'arrive bien à créer l'apk qui va charger la séquence enfant, mais mon problème réside dans l'enregistrement/chargement de la position de la tête de lecture... Je mets ces fichiers pour exemple pour exemple. Si, par exemple, j'arrive dans la "seqEnfant1", que je sauvegarde, et recharge aussitôt, que je finis la "seqEnfant1", au lieu d'arriver à la position (1) de la "seqEnfant2", la tête de lecture se positionne dans le numéro de l'image-clé enregistré. Si j'ai sauvegardé alors que j'étais en image-clé 3 de la "seqEnfant1", j'arriverai en image-clé 3 de la "seqEnfant2" au lieu d'arriver à l'image 1 !

Voici les principaux codes :

Code principal du fichier "parent" (.apk)

import flash.filesystem.File;import flash.display.Loader;

stop();

var toGo = 1;

var saveLocale:SharedObject= SharedObject.getLocal("saveMonJeu",'/');

var loader:Loader = new Loader();

addChild(loader);

  new1.addEventListener(MouseEvent.CLICK, nouvellePartie);

  charge1.addEventListener(MouseEvent.CLICK, chargeDonnees);

  loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);

function nouvellePartie(event:MouseEvent):void {

  toGo = 1;

  loader.load(new URLRequest('seqEnfant1.swf'));

}

function chargeDonnees(event:MouseEvent):void {

  loader.unloadAndStop(true);

  if(saveLocale.data.numImage!= undefined) {

  //pistecricket.stop();

  toGo = saveLocale.data.numImage;

  loader.load(new URLRequest(saveLocale.data.seqName));

  }else{

  toGo = 1;

  loader.load(new URLRequest('seqEnfant1.swf'));

  }

}

function onCompleteHandler(loadEvent:Event){

  loadEvent.currentTarget.content.loader = loader;

  loadEvent.currentTarget.content.chargeDonneesAct = chargeDonnees;

  loadEvent.currentTarget.content.onCompleteHandler = onCompleteHandler;

  loadEvent.currentTarget.content.gotoAndStop(toGo);

}

/////////////

Code principal du fichier "seqEnfant1" :

import flash.display.Loader;

var seqName = 'seqEnfant1.swf';

var saveLocale:SharedObject= SharedObject.getLocal("saveMonJeu",'/');

var chargeDonneesAct;

var loader:Loader;

btn.sauvegarder.addEventListener(MouseEvent.CLICK, sauveDonnees);

btn.charger.addEventListener(MouseEvent.CLICK, chargeDonnees);

btn.kit.addEventListener(MouseEvent.CLICK, kiter);

function kiter(event:MouseEvent):void {loader.unloadAndStop(true);}

function sauveDonnees(event:MouseEvent):void {

    saveLocale.clear();

  saveLocale.data.numImage = MovieClip(root).currentFrame;

  saveLocale.data.seqName = seqName;

  saveLocale.flush();

}

function chargeDonnees(event:MouseEvent):void {   

  chargeDonneesAct(event);

}

Bouton de la fin de la "seqEnfant1" qui doit lancer "seqEnfant2" en position (1) et vider la mémoire de "seqEnfant1":

stop();

var toGO = 1;

croix1.addEventListener(MouseEvent.CLICK, croix1FC);

function croix1FC(event:MouseEvent):void

{

  loader.unloadAndStop(true);

  loader.load(new URLRequest('seqEnfant2.swf'));

  loader.contentLoaderInfo.addEventListener(Event.COMPLETE, aller);

  }

function aller(loadEvent:Event){

  loadEvent.currentTarget.content.onCompleteHandler = aller;

  loadEvent.currentTarget.content.gotoAndPlay(1);

}

Vous pouvez télécharger ces fichiers pour exemple.

MERCI !!!

(ça fait des semaines que je tourne en rond... je tente des tas de codes, mais ça ne marche pas)

TOPICS
Development

Views

313

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
May 09, 2016 May 09, 2016

Copy link to clipboard

Copied

Hello,

Ton problème vient de ta frame 4 de seqEnfant1.swf, et plus précisément de ton listener  loader.contentLoaderInfo.addEventListener(Event.COMPLETE, aller);.

Dans ton projet, tu utilises tout le temps le même objet "loader". Et une fois arrivé sur la frame 4, tu ajoutes ce listener à ton objet, mais tu ne l'enlèves jamais ! Ca veut dire qu'à chaque fois que tu cliques sur le bouton "Charger", tu vas recharger le SWF, l'évènement COMPLETE va être déclenché, et ta méthode "aller" va de nouveau être appelée (et elle va repositionner la tête de lecture sur la frame 1). Si tu veux le constater par toi-même, ajoute la ligne "trace("Methode aller() appelée !"); dans la méthode aller et tu verras.

La manière la plus simple et rapide pour corriger ce problème est d'enlever le listener dans ta méthode aller, comme ceci =>

function aller(loadEvent:Event){

  loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, aller);

  //loadEvent.currentTarget.content.onCompleteHandler = aller;

  loadEvent.currentTarget.content.gotoAndPlay(1);

}

De plus, je n'ai pas compris pourquoi tu définis la méthode "aller" en tant que onCOmpleteHandler ?!?

En faisant ça, ton projet fonctionne. Mais pour être honnête, ton code est un peu "bricolé" et t'as pas mal de problèmes de références qui vont vite te poser soucis si ton projet se développe davantage. Si tu le peux, forme toi encore sur la programmation orientée objet et la gestion des références entre les instances d'objets.

Je te conseille également de centraliser ton code dans "Parent". Par exemple, faire une méthode "chargerSWF(nomfichier:String, frame:Number) qui s'occupe de fermer le SWF actuellement affiché, charger le nouveau SWF, et le positionner sur la bonne frame. Et du coup dans ta frame 4, tu appelles cette méthode plutôt que réécrire le code de chargement !

Préviens moi si mon fix fonctionne pour toi 🙂

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
May 10, 2016 May 10, 2016

Copy link to clipboard

Copied

LATEST

bonjour Julien... merci beaucoup...

ça marche en local, sur PC... et ça marche bien !

mais une fois que je mets l'apk (de "parent") sur ma tablette... rien ne se passe quand je fais "nouvelle partie" (il ne semble par charger le swf sur mon serveur). 😕

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines