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)
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 🙂
Copy link to clipboard
Copied
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). 😕