Forums Développement Multimédia

Aller au contenu

erreur : ScrollPan/endDrag()

CODE probleme

1 réponse à ce sujet

#1 slidespleen

    Ceinture Orange

  • Members
  • PipPipPip
  • 43 messages

Posté 26 March 2015 - 20:17 PM

bonsoir a tous et encore une fois merci de me lire!
j'aurai besoin d'une piste pour resoudre un probleme sur mon appli.
je vous explique j'ai creer une petite appli qui fonctionne ters bien, se composant en frame(1) de Actions et graphisme! mais maintenant pour avancer j'ai besoin de changer totalement le graphisme et l'action donc j'ai creer une image cle action et graphisme en frame(2).
j'accede par une fonction mouseevent.click de Actions(1) pour aller en frame(2)par un
"gotoAndStop(2)".
donc quand je clique sur mon bouton dans la frame(1) ca m'envoie sur la frame(2) sans probleme!
mais j'ai comme l'impression que la action(1) continu en action(2) alors que sur la timeline il n'y es pas!!
en frame(2) j'ai juste le rectangle stage ce qui es normal car j'ai rien mis d'autre mais si je fais un clique sur ce stage de la frame(2) j'ai une erruer en output:

TypeError: Error #1009/ il est impossible d'acceder a la propriete ou a la methode d'une reference d'objet nul.
at fl.containers::ScrollPane/endDrag()

ce qui me fais bizarre c'stt que j'ai un scrollpane dans ma frame(1) mais pourquoi il m'en parle d'en la frame(2)??
merci a vous
slidespleen

#2 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6934 messages

Posté 26 March 2015 - 22:21 PM

Bonjour,

Citation

se composant en frame(1) de Actions et graphisme! mais maintenant pour avancer j'ai besoin de changer totalement le graphisme et l'action donc j'ai creer une image cle action et graphisme en frame(2)

Stop ! Freine des quatre fers ;)
C'est une mauvaise manière de procéder et tu va accumuler les problèmes au fur et à mesure que tu avance.

L'idée c'est de se dire que le code et le scénario n'ont rien à voir l'un avec l'autre.
Il est fortement déconseillé de placer du code sur des frames du scénario quand on veut faire une appli.
Une fois pour toute le scénario de Flash c'est fait pour faire des anims et AS3 c'est fait pour faire le reste, gmlgmlgmlgml :)

La chose à comprendre, c'est qu'avec le code (AS3) tu peux ajouter et supprimer des "objets" (clips ou sprites) quand bon te semble. Quand on saisit ça, la suite logique c'est de ne plus utiliser le scénario de Flash pour afficher chaque panneau ou état d'une appli. Puisqu'on peut le faire en code, on va plutôt créer des panneaux qu'on met au chaud en bibliothèque, et les afficher quand on en a besoin.

Bref, je me lance dans un truc qui va prendre du temps.... alors on va essayer de faire court pour les explications techniques.

Le code erreur qui t'es renvoyé est un grand classique, le programme ne trouve pas une référence à un objet dans le code.
C'est tout à fait normal, puisque tu as changé de frame dans le scénario, mais que le code lui (puisqu'il est en partie indépendant du scénario), continue à tourner, sauf si tu conditionne toutes les fonctions qui tournaient à la frame précédente (ce qui est fastidieux....).

En gros, pour faire simple :
- en frame 1 tu lance une fonction qui regarde ce que fait l'objet "A" posé sur ta scène.
- tu passe en frame 2 mais la fonction de la frame 1 tourne toujours
- en frame 2 "A" n'existe plus sur la scène = > le code plante et te renvoie une erreur (référence à l'objet introuvable)

Revenons à ta préocupation principale :

Citation

pour avancer j'ai besoin de changer totalement le graphisme et l'action

Imaginons qu'on sépare le code et les graphismes, ce sont deux choses bien distinctes.
D'un côté tu va préparer tous les graphismes, chaque panneau, chaque changement d'état, etc....
Tu va loger tout ça bien au chaud dans la bibliothèque de Flash et tu va les exporter pour AS avec un nom de classe.
(c'est chaud la fin de ma phrase ? Regarde la doc de Flash à "exporter pour actionscript" ;) pour faire simple ça permet à un objet de la bibliothèque d'être utilisé avec le code sans avoir besoin de le poser sur la timeline. L'explication réelle c'est qu'on crée une classe pour un objet qui va hériter d'une classe native de Flash, mais peu importe...)
Bien, tes panneaux sont prêts, tu as par exemple les clips "Intro", "Etape1", "Etape2" exportés pour AS dans la biblio.

Passon au code, pour le moment tu n'as absolument rien sur la scène ni dans la timeline (scénario) de Flash.
Sur la première frame vide, tu ouvres le panneau d'actions et tu va rédiger un programme...
Avant de rédiger un programme on fait généralement une petite étude préalable.
Ca nous permet de définir ce qu'on appelle des algorithmes, en gros des raisonnements logiques écrits dans ta langue maternelle.
D'eux découlent les différentes instructions que l'on va donner au programme pour fonctionner correctement.

Houlà.... mais je me lance dans un cours.... revenons à nos moutons, ton programme.

Admettons que l'on veuille d'abord afficher le panneau d'intro, puis au clic sur un bouton qui se trouve dans le panneau d'intro on passe à l'étape 1 et on passe à l'étape 2 lors d'un clic sur un autre bouton se trouvant dans le panneau "etape1", puis on revient à l'intro avec un dernier clic, en gros on fait défiler les panneaux...

On peut imaginer le code suivant :

// variables globales
var intro:Intro;
var etape1:Etape1;
var etape2:Etape2;
var liste:Array;
var etat:int;


init();

// initialisation du programme
function init():void{
       
        // paramètres de départ
        etat = 0;
       
        // création des objets
        intro = new Intro();
        etape1 = new Etape1();
        etape2 = new Etape2();
       
        // ajoute l'interaction des boutons
        intro.boutonNext.addEventListener(MouseEvent.CLICK, changeEtat);
        etape1.boutonNext.addEventListener(MouseEvent.CLICK, changeEtat);
        etape2.boutonNext.addEventListener(MouseEvent.CLICK, changeEtat);
       
        // crée une liste des états
        liste = [intro,etape1,etape2];
       
        // ajoute l'intro à la liste d'affichage
        addChild(intro);
}

// changement d'état dans l'application
function changeEtat(e:MouseEvent):void{
        removeChild(liste[etat]);                       // supprime le panneau en cours
        etat++;                                                         // incrémente l'état
        if(etat>=liste.length) etat = 0;        // si la référence dépasse la taille de la liste on revient au début
        addChild(liste[etat]);                          // ajoute le nouvel état
}

Comme tu peux le voir je n'utilise pas les frames du scénario (voir source fournie en bas de cette réponse).

Une fois cette étape franchie, il faut à présent réfléchir au fonctionnement du programme d'une manière plus abstraite que "chaque état du programme sur une nouvelle frame du scénario". On sait qu'on peut afficher ou retirer de l'affichage n'importe quel objet (ou presque) à l'aide du code, on sait également qu'on peut déclencher des fonctions lors des interactions utilisateur ou en réponse à des déclencheurs (horloge, mouvement, ...). On peut donc imaginer le programme comme une suite d'instructions logiques à exécuter en fonction de certains stimulis.

"Si je clique sur tel bouton, supprime tel panneau et affiche tel autre".
"Si je bouge ma souris sur ce panneau, affiche tel autre panneau par dessus"
etc...

Bienvenue dans le joyeux royaume de l'algorithmique...
Le but du jeu est de décrire toutes les actions de ton programme en français.
De repérer les doublons et les trucs pas logique et de les corriger, puis de synthétiser le tout.
Une fois cette étape franchie, y a plus qu'a coder....

Une petite source pour te mettre le pied à l'étrier.

Bon courage.

Fichier(s) joint(s)





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