Forums Développement Multimédia

Aller au contenu

sauvegarder / charger la position de la "tête de lecture"

PAO Flash

26 réponses à ce sujet

#1 FredericHunter

    Ceinture Jaune

  • Members
  • PipPip
  • 28 messages

Posté 19 February 2013 - 16:16 PM

bonjour à tous,
(je suis nouveau, et j'espère poster au bon endroit)

voilà, je travaille avec un petit groupe de jeunes sur un projet de "livre dont vous êtes le héros" (très très basique). L'idée est simple... il y a une série de petit texte et d'illustrations, et le joueur (lecteur) choisit d'aller à droite ou à gauche. Au fur et à mesure, on avance dans le livre...

Je les accompagne, mais je n'y connais pas grand chose... j'ai réussi à créer des liens, vers telles ou telles images clés. Jusque là, ça va.

Par contre, nous cherchons une solution pour pouvoir sauvegarder (et donc charger ensuite) la partie en cours... c'est à dire, enregistrer / charger la position de la tête de lecture dans l'histoire / séquence. Je pense que ça doit être possible, mais je n'ai aucune idée de comment procéder....

pourriez-vous m'aiguiller, s'il vous plaît ?
Si vous avez une idée, n'hésitez surtout pas à être très explicite et détaillé, car ce n'est pas simple pour moi.

merci de votre attention,
Frederic

#2 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 19 February 2013 - 16:44 PM

Bonjour Frederic.

Il faut que tu précises un peu dans quel orientation tu travailles, parce que la réponse peut-être différente selon les cas.

Ce "livre" est destiné à quel usage ?
- à être visité sur une page web ?
- à être lu sur un ordinateur comme application autonome ?
- sur une tablette tactile ?
Selon l'usage, on va faire "sortir" et "rentrer" des infos de façon différente.

#3 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6994 messages

Posté 20 February 2013 - 11:32 AM

Salut,

Pour compléter ce que dit Didier, vous pouvez déjà vous renseigner sur : SharedObject

A lire : http://help.adobe.co...aredObject.html

#4 FredericHunter

    Ceinture Jaune

  • Members
  • PipPip
  • 28 messages

Posté 20 February 2013 - 13:44 PM

bonjour, merci pour vos premières réponses.
Oui, excusez-moi de ne pas avoir été assez précis.

L'idée est ensuite d'exporter le fichier au format ".apk" pour pouvoir les utiliser sur nos tablettes et les tablettes des enfants.

#5 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 20 February 2013 - 13:57 PM

Salut Frederic :)

je souscris au deux commentaires précédents : tout dépend mais le cookie est probablement la solution qui vous conviendrait le mieux : facile à mettre en œuvre et c'est cohérent de stocker sur le disque de l'utilisateur là où il en est.

En complément de la doc mise en lien par M.Spi, je dépose donc - sait-on jamais- la "fiche de pompe" idoine.

Les deux premiers "tester" écrivent le cookie, tu ne peux donc rien voir, mais tu pourras modifier le contenu des champs pour faire St Thomas à la lecture.
Le troisième le lit, et "trace" dans la fausse fenêtre de sortie.
le dernier efface (oui, bon c'est un peu écrit dessus ;))

(les champs sont accessibles au copier/coller)

jouez bien !

Fichier(s) joint(s)


Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos

#6 FredericHunter

    Ceinture Jaune

  • Members
  • PipPip
  • 28 messages

Posté 20 February 2013 - 14:12 PM

merci, je vais regarder ça, mais je ne suis pas sûr d'y arriver... :) j'ai ouvert le fichier, je n'ai rien compris. Je vais m'y pencher (je ne suis pas développeur).

#7 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 20 February 2013 - 14:24 PM

Voir le messageFredericHunter, le 20 February 2013 - 14:12 PM, dit :

j'ai ouvert le fichier, je n'ai rien compris.

A mon avis c'est à consulter après avoir lu la doc ;)

Je viens de chercher ds le wiki, sans succès. Ça mérite peut-être une page :roll: A voire si la doc et la fiche te suffisent, sans quoi, explication pour explication je sens bien que je vais la faire cette page ;)
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos

#8 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6994 messages

Posté 20 February 2013 - 14:32 PM

J'avais une explication in situ ici : http://forums.mediab...uver_et_charger
Mais ça demanderai d'être sorti du contexte pour mieux être appréhendé.

#9 FredericHunter

    Ceinture Jaune

  • Members
  • PipPip
  • 28 messages

Posté 20 February 2013 - 14:36 PM

merci Nataly... bon, j'ai bien regardé votre flash, et j'ai à peu près compris la logique... j'ai aussi lu la documentation qui m'est apparue très compliquée, et, pour l'essentiel, (il me semble ?) inappropriée à mon problème.

je pense que je dois faire quelque chose comme ça, utiliser SharedObject.getLocal() pour enregistrer le cookie, qui identifie la position de la tête de lecture. Mais je ne vois pas comment "convertir" (je ne sais pas si j'emploie le bon terme) la position de la tête de lecture en une variable ?

[merci aussi Monsieur Spi] je vais regarder votre lien...

#10 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6994 messages

Posté 20 February 2013 - 14:40 PM

Citation

"convertir" (je ne sais pas si j'emploie le bon terme) la position de la tête de lecture en une variable ?

var positionTete:int = scenario.currentFrame();

Tu crée une variable "positionTete" (ou ce que tu veux) qui va stocker la position de la tête de lecture.
Et pour récupérer cette position tu utilise le conteneur du jeu (ici je met "scenario" mais ça peut être autre choses voire même le scénario principal du projet), affublé de la méthode "currentFrame()" qui permet de savoir à quel numéro de frame se trouve la tête de lecture dans l'objet que tu as ciblé (ici "scenario").

#11 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6994 messages

Posté 20 February 2013 - 14:50 PM

Pour faire simple, je part du postulat que ton jeu est contenu dans un clip conteneur nommé "scenario" :

A l'ouverture du jeu, création du cookie "saveMonJeu" sur la machine où tourne le jeu :

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

Dans la foulée, en même temps qu'on crée la variable "saveLocale", on vérifie si le cookie nommé « saveMonJeu » existe.
Si il n’existe pas il est créé automatiquement.

Quand j'ai besoin de sauver mes données (fermeture du jeu ou point de sauvegarde) :

function sauveDonnees():void{
        saveLocale.data.numImage = scenario.currentFrame();
        saveLocale.flush();
}

J'appelle la fonction "sauveDonnees" qui va aller créer une variable "numImage" dans le cookie et lui passer la valeur de la frame en cours pour le clip "scenario", puis qui met à jour le cookie ("flush") avec ces nouvelles infos.

Lorsque j'ai besoin de récupérer des infos du cookie (lancement du jeu ou point de chargement) :
function chargeDonnees():void{
        if (saveLocale.data.numImage!= undefined) {
                scenario.gotoAndStop(saveLocale.data.numImage);
        }
}

Si la variable "numImage" qui se trouve dans le cookie existe bien (ne renvoie pas "undefined"), j'indique au clip "scenario" que la tête de lecture doit être positionnée comme indiqué dans la variable.

#12 FredericHunter

    Ceinture Jaune

  • Members
  • PipPip
  • 28 messages

Posté 20 February 2013 - 16:01 PM

merci Monsieur Spi... je crois que j'ai compris le raisonnement. J'ai reproduit en pratique, mais j'ai un message d'erreur :

Voici le message dans le panneau "sortie" :

ArgumentError: Error #1063: Non-correspondance du nombre d'arguments sur essaiSave_fla::MainTimeline/sauveDonnees(). 0 prévu(s), 1 détecté(s).

le code que j'ai utilisé :

j'ai appliqué le chargement au bouton "save1" et la sauvegarde aux bouton "charge1"


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

save1.addEventListener(MouseEvent.CLICK, sauveDonnees);
function sauveDonnees():void{
                saveLocale.data.numImage = this.currentFrame();
                saveLocale.flush();
}

charge1.addEventListener(MouseEvent.CLICK, chargeDonnees);

function chargeDonnees():void{
                if (saveLocale.data.numImage!= undefined) {
                           this.scenario.gotoAndStop(saveLocale.data.numImage);
                }
}
 

j'ai appliqué tout ça à une petite séquence de 10 images toutes simples, avec un bouton "suivant", un bouton "précédent", 10 images clés (numérotées), un bouton "sauvegarder" et un bouton "charger" .

voici le lien vers le "fla" : http://tatidede.free...p/essaiSave.fla

d'où peut venir mon erreur ?

#13 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 20 February 2013 - 16:22 PM

Hello.

L'erreur est "à-peu-près" claire, à la lecture du message :

Citation

ArgumentError: Error #1063: Non-correspondance du nombre d'arguments sur essaiSave_fla::MainTimeline/sauveDonnees(). 0 prévu(s), 1 détecté(s).
Il y a non concordance des arguments entre ton code et ce qui se passe ensuite. Précisemment dans l'appel de la fonction sauveDonnees qui a zéro arguments attendus, mais 1 est détecté…

Je sais. Ce n'est pas beaucoup plus clair quand on débute.

En résumé :
tu as écrit une fonction sauveDonnees sans passage de paramètre, elle devrait donc s'appeler comme ceci :
sauveDonnees();

…mais quelqu'un essaye de l'appeler ainsi :
sauveDonnees(un_argument);

Celui qui appelle ta fonction, c'est l'écouteur de l'événement.
Et il faut savoir que tout les écouteurs d'événement appellent leur fonction associée en balançant l'événement lui même en argument.
Et cela, même si tu n'en as pas besoin.

A toi de le retenir, de déclarer cet argument quand tu écris ta fonction, et il n'y aura plus d'erreur.
Tu peut donner le nom que tu veux a cet argument. Le plus souvent on utilise event ou e
et on lui donne un type (c'est mieux de prendre de suite les bonnes pratiques) correspondant à l'événement que l'on a écouter.

Tout ça pour expliquer juste une petite modification de la déclaration de ta fonction sauveDonnees et chargeDonnes :
function sauveDonnes(event:MouseEvent):void {
   // suite
 
}

#14 FredericHunter

    Ceinture Jaune

  • Members
  • PipPip
  • 28 messages

Posté 20 February 2013 - 16:56 PM

merci dldler... je suis vraiment embêté, mais ça ne fonctionne pas (j'ai compris ce que tu disais, je crois).

L'erreur annoncée est



TypeError: Error #1006: value n'est pas une fonction.
at essaiSave2_fla::MainTimeline/sauveDonnees()
 

je remets le code que j'ai écrit :


var saveLocale:SharedObject= SharedObject.getLocal("saveMonJeu");save1.addEventListener(MouseEvent.CLICK, sauveDonnees);
function sauveDonnees(event:MouseEvent):void {
            saveLocale.data.numImage = this.currentFrame();
            saveLocale.flush();
}

charge1.addEventListener(MouseEvent.CLICK, chargeDonnees);
function chargeDonnees(event:MouseEvent):void {     if (saveLocale.data.numImage!= undefined) {
                           this.scenario.gotoAndStop(saveLocale.data.numImage);
            }
}
 



et le lien vers le fichier mis à jour :
http://tatidede.free.../essaiSave2.fla

#15 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6994 messages

Posté 20 February 2013 - 17:05 PM

this.scenario.gotoAndStop(saveLocale.data.numImage);

Ton jeu est dans un clip nommé "scenario" ?
Moi j'avais juste pris ça pour l'exemple, mais à toi d'adapter, si tu mets :

saveLocale.data.numImage = this.currentFrame();

Tu dois aussi mettre :

if (saveLocale.data.numImage!= undefined) {
    this.gotoAndStop(saveLocale.data.numImage);
}


#16 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 20 February 2013 - 17:18 PM

Petite précision pour un grand débutant* :


la syntaxe "à point" permet de cibler une variable, propriété ou fonction détenue par un objet, comme ceci :

// Pour cibler une propriété nommée "une_prop" détenue par un objet nommé "un_objet"
un_objet.une_prop;

Ainsi, quant tu copies/colles le code de Mr Spi :
this.scenario.gotoAndStop(saveLocale.data.numImage);

Tu dois comprendre : j'appelle la fonction gotoAndStop d'un objet qui s'appelle scenario

As-tu un objet qui s'appelle scenario ? C'est la question posée.
Sans doute que non, puisque ça grince. Alors, sans doute un autre nom, ou juste "this", mais ça, il n'y a que toi qui sait. C'est toi qui a créé les objets…


* aucune insulte. On l'a tous été. Après, on conseille souvent aux débutants de plutôt faire quelques tutoriels avant de se lancer dans un projet perso, mais tant que tu montres que tu t'investis dans la compréhension de la chose, on te soutiendra

#17 FredericHunter

    Ceinture Jaune

  • Members
  • PipPip
  • 28 messages

Posté 20 February 2013 - 17:31 PM

merci à tous... (j'ai beaucoup de mal à comprendre, mais je vous assure que je fais de mon mieux ; donc, le terme grand débutant est encore trop flatteur ^_^)...

oui, j'ai juste mis "this.", car tout se passe sur la séquence principale et il me semble que c'est ce que je devais faire ?... c'était une erreur de ma part d'oublier de le remettre, que j'aurais pu trouver...par contre, j'ai toujours le message d'erreur, et je ne vois vraiment pas. Je suis embêté de vous enquiquiner avec ça...

purée que ça me stresse.

j'ai ce message d'erreur quand je clique sur le bouton enregistrer

TypeError: Error #1006: value n'est pas une fonction.
at essaiSave2_fla::MainTimeline/sauveDonnees()
 



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

save1.addEventListener(MouseEvent.CLICK, sauveDonnees);

function sauveDonnees(event:MouseEvent):void {
            saveLocale.data.numImage = this.currentFrame();
            saveLocale.flush();
}

charge1.addEventListener(MouseEvent.CLICK, chargeDonnees);
function chargeDonnees(event:MouseEvent):void {
  if (saveLocale.data.numImage!= undefined) {
            this.gotoAndStop(saveLocale.data.numImage);
                    }
}
 


#18 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 20 February 2013 - 17:48 PM

currentFrame est une propriété. Une variable. Une valeur.
Donc, pas de () pour récupérer cette valeur.

Les () sont placés après le nom d'une fonction pour lancer l'exécution du code.

#19 FredericHunter

    Ceinture Jaune

  • Members
  • PipPip
  • 28 messages

Posté 20 February 2013 - 17:53 PM

ça marche !!! :)
oh, purée... MERCI beaucoup à tous... dldler, Monsieur Spi, et Nataly.... Merci vraiment !! :) ... purée, que ça fait du bien ! :)

#20 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 20 February 2013 - 17:58 PM

Ta joie est communicative ! J'en profite :cool: même si sur ce coup là je n'ai pas été d'une grande aide :P
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos

#21 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6994 messages

Posté 20 February 2013 - 18:05 PM

Citation

currentFrame est une propriété. Une variable. Une valeur.
Donc, pas de () pour récupérer cette valeur.

Rôhh mais oui tu as raison, je sais pas où j'ai été pécher cette parenthèse, erreur de ma part...... :oops:

#22 FredericHunter

    Ceinture Jaune

  • Members
  • PipPip
  • 28 messages

Posté 21 February 2013 - 09:48 AM

... *gloups*
je viens de me rendre compte que j'ai finalement un soucis... l'ensemble du livre est défini dans des séquences (une dizaine) qui font office de "chapitre". J'ai tenté d'adjoindre -totale improvisation- un "current.Scene" mais, ça ne fonctionne pas... je vous mets ma bêtise, ça vous fera sans doute rigoler... J'ai voulu reproduire la logique, mais le soucis, c'est que la scène est un nom, pas une variable....


var saveLocale:SharedObject= SharedObject.getLocal("saveMonJeu");
save1.addEventListener(MouseEvent.CLICK, sauveDonnees);
function sauveDonnees(event:MouseEvent):void {
            saveLocale.data.numImage = this.currentFrame;
            saveLocale.data.numScene = this.currentScene;
            saveLocale.flush();
}

charge1.addEventListener(MouseEvent.CLICK, chargeDonnees);
function chargeDonnees(event:MouseEvent):void {
  if (saveLocale.data.numImage!= undefined) {
            this.gotoAndStop(saveLocale.data.numImage, “saveLocale.data.numScene);
                    }
}
 


#23 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 21 February 2013 - 10:25 AM

Bonjour Frederic

Tu n'es pas loin. Bravo.
Bon, là en plus ce n'est pas tout a fait de ta faute. La logique de Flash est disons, bancale.

La propriété currentScene renvoie un objet de type scene (et c'est bien la séquence courante, donc tu as juste).

Par contre, la fonction gotoAndStop() prend 2 paramètres.
- le premier pour l'image > un nombre ou un nom (là, tu as bon)
- le second… un nom … (ce qu'on appelle un String dans le jargon) et pas un objet de type scene, alors qu'on pourrait s'y attendre, ni un nombre alors que ça serait possible.
Il faut donc utiliser uniquement le nom de la séquence.

Tu as 2 solutions :
1 - tu sauvegarde la séquence en tant qu'objet, mais tu gotoAndStop vers le nom de la séquence
ou
2 - tu sauvegardes le nom de la séquence uniquement, et tu fais un gotoAndStop directement vers le nom sauvegardé (moi, je ferais ça)

Ah…
Et le nom d'une scène, c'est sa propriété .name
… alors fais quelques tests avec this.currentScene.name
Le reste de ta logique est bonne.
;-)

#24 FredericHunter

    Ceinture Jaune

  • Members
  • PipPip
  • 28 messages

Posté 21 February 2013 - 12:06 PM

après un immense effort de réflexion, j'ai l'impression que ça marche :) ... (j'ai peur de me réjouir, et que ça plante dans le "livre" en "conditions réelles" // là, j'ai fait un exemple tout bête)...

je mets le code si ça peut intéresser d'autres débutants :

j'ai modifié en mettant un "root", comme ça j'ai mis mes boutons charger/sauvegarder dans un clip avec le code ActionScript, et je peux mettre ce même clip dans toutes mes séquences... :)




var saveLocale:SharedObject= SharedObject.getLocal("saveMonJeu");
save1.addEventListener(MouseEvent.CLICK, sauveDonnees);
function sauveDonnees(event:MouseEvent):void {
            saveLocale.data.numImage = MovieClip(root).currentFrame;
  saveLocale.data.numSeq = MovieClip(root).currentScene.name;
            saveLocale.flush();
}

charge1.addEventListener(MouseEvent.CLICK, chargeDonnees);
function chargeDonnees(event:MouseEvent):void {
  if (saveLocale.data.numImage!= undefined) {
           MovieClip(root).gotoAndStop(saveLocale.data.numImage, saveLocale.data.numSeq);
                    }
}
 

... merci dldler :)

#25 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 21 February 2013 - 12:25 PM

Alors, juste un petit avis perso, si tu comptes continuer à programmer (et même là, si tu as plein de séquences dans le livre en conditions réelles).

Autant que possible, il faut garder le code à portée de main afin de pouvoir le modifier facilement.
Ça le rend aussi plus polyvalent.
Imagine si tu ajoutes une fonction de sauvegarde auto, tu vas t'adresser au bouton ? Ou reécrire les fonctions ?
Ça serait dommage. Il vaudrait mieux laisser tes fonctions sur le scénario principal. Tu pourras t'en servire au besoin et sans faire appel au bouton.

Pour cela, dans ton clip de navigation (celui ou tu as mis les boutons), tu poses l'écouteur sur le bouton, mais en ciblant la fonction de retour comme ceci :

save1.addEventListener(MouseEvent.CLICK, MovieClip(root).sauveDonnees);
charge1.addEventListener(MouseEvent.CLICK, MovieClip(root).chargeDonnees);

NB : je ne travailles jamais avec les séquences, donc je n'assure pas à 100% que le principe fonctionne.
Mais Ça serait une bonne idée de vérifier sur ta version simplifier avant de te lancer sur l'autre… la vraie.

#26 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6994 messages

Posté 21 February 2013 - 16:59 PM

Salut,

[EDIT] bon j'avais écrit ce qui suit ce matin avant que ma connexion plante, du coup je ne sais pas si c'est encore d'actualité, mais je le mets quand même, si ça peut servir.....
[/EDIT]

Le problème est en fait qu'a part certains animateurs, personne ne travaille avec des séquences, quand on fait un programme comme un jeu elles sont source d'erreurs et peu pratiques. Pour bien faire, si tu veux t'éviter des prises de tête, il faudrait revoir la structure de ton jeu, je m'explique :

Tu fais un jeu où tu envoie la tête de lecture du scénario à un endroit pour afficher la "page" ou le "chapitre" du livre dont vous êtes le héros.

Techniquement le joueur doit pouvoir passer d'un chapitre à l'autre comme il veut et sans restriction.

De ton côté tu dois réfléchir à une structure non plus linéaire, c'est à dire avec des séquences qui représente des passages et des fames sur ces séquences qui représentent des chapitres ou des paragraphes, mais éclatée, c'est à dire avec un stock de pages (qui représente tout le livre) dans lequel tu peux piocher et afficher le passage qui t'intéresse.

Pour faire ça c'est un peu comme une recette de cuisine, il te faut tout d'abord des ingrédients :

Un clip dit "conteneur" peut faire l'affaire pour stocker tous les chapitres, tu vas donc commencer par créer un clip vide que tu va appeler "Livre" (avec une majuscule), et dans lequel tu va mettre sur chaque frame un chapitre ou un paragraphe différent.

Ce clip est dans la bibliothèque de Flash, il te faut à présent l'exporter pour ActionScript afin de pouvoir l'utiliser dans un programme, pour cela tu fais un clic droit dessus, tu va dans les "propriétés" et tu coche la case "exporter pour AS". Automatiquement Flash te génère un nom de classe "Livre" s'y rapportant. Quand tu as fini tu supprime le clip de la scène afin qu'il ne soit plus présent que dans la bibliothèque.

Ok l'étape 1 est faite, tu as un conteneur "Livre" exporté pour AS, qui contient toutes les pages ou chapitres ou paragraphes, un sur chaque frame.

Sur la scène tu n'as rien, juste du vide.
Sur le scénario principal tu as uniquement une frame vide.
Tout le code de ton jeu va se trouver à un seul endroit, la frame vide du scénario principal.
Tous les graphismes et les animations de ton jeu se trouve dans un seul endroit, le conteneur "Livre".

On s'est déjà simplifié la vie à ce niveau, on a deux parties distinctes et isolées, le contenu et le code.

Bien à présent il te faut penser au programme, on va s'intéresser à ses possibilités principales, tout le programme est inscrit sur la frame vide du scénario principal.

Le livre est ouvert devant le joueur, quand c'est à lui de jouer ce dernier peut choisir d'aller vers un paragraphe ou un autre, donc sur une frame ou une autre du livre.

On commence par poser le livre devant le joueur, tout d'abord on en crée une copie depuis la bibliothèque :

var livre:Livre = new Livre();

Puis on le place au bon endroit sur la scène :


livre.x = 80;
livre.y = 50;
 

Puis on affiche la première page (par défaut la page 1) pour le joueur :

livre.gotoAndStop(1);

Et enfin on affiche le livre sur la scène :

addChild(livre);

Ok le livre est en place, reste à voir comment le joueur joue.

Pour jouer le joueur dispose d'une interface avec deux boutons, là tu as le choix, soit les deux boutons permettent juste d'aller au chapitre suivant ou précédent, soit ils permettent d'envoyer à un chapitre situé où on veut dans le bouquin (histoire de ne pas avoir un truc trop linéaire), on va prendre la deuxième option pour compliquer un peu et te donner un exemple plus complet.

Tout d'abord il faut créer deux boutons pour l'interface, là c'est très simple, même procédure que pour le livre, tu crée deux clips exportés pour AS depuis la bibliothèque et tu viens les afficher sur la scène :

var suivant:Suivant = new Suivant();
var precedent:Precedent = new Precedent();
 

Tu les places :

suivant.x = 450;
suivant.y = 50;
precedent.x = 50;
precedent.y = 50;
 

Tu les affiches :

addChild(suivant);
addChild(precedent);
 

Ok tu as le livre et deux boutons qui n'ont pour le moment pas d'interactivité.

Si on admet que chaque bouton peut envoyer sur n'importe quel chapitre ou paragraphe du livre, il faut pour chaque paragraphe enregistrer les deux "directions" possibles, pour cela on va utiliser un tableau.

var pages:Array = [];

On va remplir ce tableau de manière à ce que pour chaque page du livres (frame du clip "Livre") on ait deux destinations possibles, pour cela on va utiliser des petits tableaux dans le tableau principal :


pages = [
                        [10,1],
                        [8,11],
                        [28,3],
                        [9,14],
                        [8,6],
                        [21,30],
                        [8,5],
                        [32,12]
]
 

A toi de mettre autant de sous tableaux que de pages (frames) dans ton livre, avec à chaque fois deux directions (frames) possibles.

Bon à présent l'objectif est que lorsque le joueur cliques sur un des boutons de la page en cours, il soit redirigé vers la page prévue.

On commence par créer l'interactivité des boutons :

suivant.addEventListener(MouseEvent.CLICK, pageSuivante);
precedent.addEventListener(MouseEvent.CLICK, pagePrecedente);
 

Puis on crée les fonctions des boutons :

function pageSuivante(e:Event):void{
        livre.gotoAndStop(pages[livre.currentFrame][1]);
}

function pageSuivante(e:Event):void{
        livre.gotoAndStop(pages[livre.currentFrame][0]);
}
 

Ce que tu dois noter ici c'est la manière dont je vais chercher les infos dans le tableau :

pages[livre.currentFrame][0];
pages[livre.currentFrame][1];
 

J'ai un tableau de références "pages".
Je vais à la référence qui concerne la page en cours : pages[livre.currentFrame]
Ce qui me renvoie un tableau avec deux entrées (les deux directions possibles).
Pour récupérer la bonne direction dans ce tableau je lui indique l'index de mon choix : pages[livre.currentFrame][0];
0 étant le premier index du tableau (qui correspond à gauche).
1 étant le deuxième index du tableau (qui correspond à droite).
Un tableau commençant toujours à l'index 0.

Et c'est presque tout, la principale fonctionnalité du programme est en place, le reste c'est de l'habillage et des effets.
Si tu arrive à restructurer ton programme de la sorte tu va t'éviter beaucoup de galères.
Je te remet le programme complet d'un coup ici :


var livre:Livre = new Livre();
livre.x = 80;
livre.y = 50;
livre.gotoAndStop(1);
addChild(livre);
var suivant:Suivant = new Suivant();
var precedent:Precedent = new Precedent();
suivant.x = 450;
suivant.y = 50;
precedent.x = 50;
precedent.y = 50;
addChild(suivant);
addChild(precedent);
var pages:Array = [
                        [10,1],
                        [8,11],
                        [28,3],
                        [9,14],
                        [8,6],
                        [21,30],
                        [8,5],
                        [32,12]
];

suivant.addEventListener(MouseEvent.CLICK, pageSuivante);
precedent.addEventListener(MouseEvent.CLICK, pagePrecedente);

function pageSuivante(e:Event):void{
        livre.gotoAndStop(pages[livre.currentFrame][1]);
}

function pageSuivante(e:Event):void{
        livre.gotoAndStop(pages[livre.currentFrame][0]);
}
 




[EDIT 2] Après relecture, l'intérêt de ce code c'est que tu peux ajouter autant de directions que tu le veux par chapitre du livre, si tu as par exemple 4 directions possibles (suivant les actions que fait le héros) tu peux très bien mettre 4 boutons qui correspondent aux 4 directions possibles. Pour faire ça il te suffit de regarder combien il y a de directions possible pour le chapitre où on se trouve, puis d'afficher le nombre de boutons en conséquence.

#27 FredericHunter

    Ceinture Jaune

  • Members
  • PipPip
  • 28 messages

Posté 22 February 2013 - 09:34 AM

> dldler : oui, dès que je trouve un code (que je comprends), je le note dans un petit fichier Word, en me faisant une petite explication... bon, le fichier n'est pas bien long. Mais je le complète au fur et à mesure... :)

> dldler et Monsieur Spi : j'ai appris,trop tard, qu'utiliser les séquences étaient une mauvaise idée... je le saurai pour la prochaine fois. Je vais copier tout ce que vous avez écrit (notamment tes conseils, Monsieur Spi) pour voir tout ça à tête reposée... la semaine fut longue, j'ai la tête pleine comme une citrouille, et c'est pas encore Halloween.

merci à tous... et comme dirait Terminator "I'll be back" (soon)...



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