Erreur de fonction dans une classe [Résolu]

Signaler
Messages postés
1236
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
6 octobre 2010
-
Messages postés
1236
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
6 octobre 2010
-
Bonjour à tous,

Je suis entrain de créer une classe pour un lecteur vidéo avec chargement XML. Jusque-là tout fonctionne. Maintenant j'ai créé un clip bar de classe Bar dans laquelle est imbriqué un clip play_btn.
Je crée donc une fonction functionPlay et je place ma méthode play() dedans. Là il me sort une erreur: Un terme n'est pas défini et n'a pas de propriété. at Main/functionPlay().

Alors mes questions sont: sauriez-vous m'expliquer le pourquoi de cette erreur et, étant donné que je débute dans ces classes et que j'ai encore beaucoup de peine avec la logique AS3,est-ce que mon code vous semble "propre" ?

Voici mon code:

package

{
    import flash.display.*;
    import flash.events.*;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import fl.video.FLVPlayback;
   
    public class Main extends MovieClip
   
        {
            private var xmlURL:URLRequest = new URLRequest("videos.xml");
            private var xmlLoader:URLLoader = new URLLoader(xmlURL);
            private var player:FLVPlayback = new FLVPlayback();
            private var bar:Bar = new Bar();

                public function Main():void
       
                    {
                        xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
                        xmlLoader.load(xmlURL);
                        bar.play_btn.addEventListener(MouseEvent.CLICK, functionPlay);
                    }
       
                public function xmlLoaded(pEvt:Event):void
       
                    {
                        bar.y = 270;
                        player.width = 480;
                        player.height = 270;
                        player.autoPlay =false;
                        addChild(player);
                        addChild(bar)
                    }
                   
                public function functionPlay(pEvt:MouseEvent):void
               
                    {
                        var xml:XML = new XML (pEvt.target.data);
                        var xmlList:XMLList = xml.elements();
                        player.play(xmlList[1].@stream);
                    }
                   
            }
                   
}

Merci à ceux qui prendront le temps de se pencher sur mon problème ^^.

@+.
telov.ch

22 réponses

Messages postés
380
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
28 décembre 2009

normal qu'il la trouve pas, tu ne l'a pas define

tu rajoute la propriete
private var xml:XML;

tu construit la propriete quand le chargement est fini
public function xmlLoaded(pEvt:Event):void
{
           (...)
            xml = new XML (pEvt.target.data);
 }

puis dans la fonction qui reagit au clic tu le lance la lecture :

public function functionPlay(pEvt:MouseEvent):void
{
            player.play(xml.elements()[1].@stream);
 }
Messages postés
380
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
28 décembre 2009

Ben si ce que je t'ai dis marche très bien  :
Tu avait fait une erreur lorsque tu construit l'objet xml, c'etait pas var xml:XML=new XML(pEvt.target.data); mais seulement xml = new XML(pEvt.target.data);

Voila le code complet & corrigé (et du coup merci pour le code)
package

{
    import flash.display.*;
    import flash.events.*;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import fl.video.FLVPlayback;
   
    public class Main extends MovieClip
   
        {
            private var xmlURL:URLRequest = new URLRequest("videos.xml");
            private var xmlLoader:URLLoader = new URLLoader(xmlURL);
            private var player:FLVPlayback = new FLVPlayback();
            private var xml:XML = new XML();
            private var bar:Bar = new Bar();

                public function Main():void
       
                    {
                       
                        xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
                        xmlLoader.load(xmlURL);
                    }
       
                public function xmlLoaded(pEvt:Event):void
       
                    {
                        xml = new XML(pEvt.target.data);
                        bar.y = 270;
                        player.width = 480;
                        player.height = 270;
                        player.autoPlay =false;
                        bar.play_btn.addEventListener(MouseEvent.CLICK, functionPlay);
                        addChild(player);
                        addChild(bar);
                       
                    }
   
                public function functionPlay(pEvt:MouseEvent):void
               
                    {
                        player.play(xml.elements()[1].@stream);
                    }
                   
            }
                   
}
Messages postés
380
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
28 décembre 2009

PS: tu constatera que j'ai remit l'ecouteur dans la fonction xmlLoaded, je trouve ça plus propre
Messages postés
380
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
28 décembre 2009

Salut,
c'est ptet ça mais je suis pas sur :
import MonRepertoire.Bar

L'erreur srvient quand tu code la fonction play ou quand tu rajoute ton objet bar ?

Sinon le code me semble propre.
a+
Grems
Messages postés
1236
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
6 octobre 2010

Si tu veux si je n'ai qu'un objet FLVPlayback dans ma biblio et que je place :

var xml:XML = new XML (pEvt.target.data);
var xmlList:XMLList = xml.elements();
player.play(xmlList[1].@stream);

Tout fonctionne.

Maintenant j'ajoute une barre de lecture (clip: bar) dans ma biblio. Dans cette barre de lecture j'ajoute mes clips play, pause, stop etc... je lie cette barre à l'AS en nommant sa classe Bar. J'ajoute une fonction "functionPlay" et je déplace les instructions ci-dessus dans cette fonction et là ça me génère l'erreur ...

@+.
telov.ch
Messages postés
380
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
28 décembre 2009

Ok je crois savoir:
donc ton objet bar est dans la bibliotheque...
verifie si dans les propriètes de ton objet bar si l'option exporter pour actionscript est bien cochée, sinon choisi une classe mère movieclip ou sprite ou...(par defaut je crois qu'il met moviclip)
Messages postés
1236
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
6 octobre 2010

Non ça c'est bon si je trace(bar); après son addChild j'ai bien un [object Bar]...

@+.
telov.ch
Messages postés
380
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
28 décembre 2009

On pardon, j'ai repondu un peu vite...merci de ne pas tenir compte de mon precedant post...
donc quand ton FLVPlayback est dans la biblio pas de soucis, et lorsque tu essaye de l'ecrire en fonction ça coince...mais tu as bien du mettre du code derrière tes boutons play, pause, stop ? Si oui c'est quoi ?
Messages postés
1236
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
6 octobre 2010

Merci déjà de prendre de ton temps ;)

En fait si je fais:

public class Main extends MovieClip
   
        {
            private var xmlURL:URLRequest = new URLRequest("videos.xml");
            private var xmlLoader:URLLoader = new URLLoader(xmlURL);
            private var player:FLVPlayback = new FLVPlayback();

                public function Main():void
       
                    {
                        xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
                        xmlLoader.load(xmlURL);
                    }
       
                public function xmlLoaded(pEvt:Event):void
       
                    {
                        var xml:XML = new XML (pEvt.target.data);
                        var xmlList:XMLList = xml.elements();
                        player.play(xmlList[1].@stream);
                        player.width = 480;
                        player.height = 270;
                        addChild(player);
                       
                    }

Là j'ai bien ma vidéo qui se lance.
Si j' ajoutes ce que j'ai dit plus haut ça me génère l'erreur citée ...

@+.
telov.ch
Messages postés
1236
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
6 octobre 2010

P.S non j'ai pas encore mis le code pour pause stop etc... vu que déjà play ne fonctionne pas.
Si je trace(bar.play_btn); j'ai bien un objet movieclip je ne pense pas que ce soit un prob de ciblage (quoique) je penche plus pour une mauvaise ordonnance de mon code ...

@+.
telov.ch
Messages postés
380
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
28 décembre 2009

Peu être que tu clique alors que le load n'est pas fini et que donc xmlList[1] n'est pas encore defini, pour eliminer cette erreur eventuelle deplace l'ajout de l'evenement click uniquement lorsque le load est fini

                public function xmlLoaded(pEvt:Event):void
       
                    {
                        bar.y = 270;
                        player.width = 480;
                        player.height = 270;
                        player.autoPlay =false;
                        addChild(player);
                        bar.play_btn.addEventListener(MouseEvent.CLICK, functionPlay);
                        addChild(bar)
                    }
Messages postés
1236
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
6 octobre 2010

... non , il veut toujours pas me lire cette fonction quelque soit l'endroit ou je place mon écouteur ...

@+.
telov.ch
Messages postés
380
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
28 décembre 2009

Des trois lignes suivantes de functionPlay  :
                        var xml:XML = new XML (pEvt.target.data);
                        var xmlList:XMLList = xml.elements();
                        player.play(xmlList[1].@stream);
c'est laquelle qui provoque l'erreur ?

Au fait pourquoi tu fais AddChild(Player) ?

PS : tu dois pouvoir l'ecrire en une ligne du style player.play(xml.elements()[1].@stream);
Messages postés
1236
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
6 octobre 2010

En effet

var xml:XML = new XML (pEvt.target.data);
player.play(xml.elements()[1].@stream);

fonctionne tout aussi bien :) apparement pas besoin de passer par une xmlList, mais ça change pas mon problème ...

Par-contre en lisant ce que t'as dit,
Si je fais:

public function functionPlay(pEvt:MouseEvent):void
               
                    {
                        trace("ok");
                    }

Ca marche ! Donc c'est ma déclaration de la variable xml qui joue pas ...

public function functionPlay(pEvt:MouseEvent):void
               
                    {
                        trace("ok");
                        var xml:XML = new XML (pEvt.target.data);
                        player.play(xml.elements()[1].@stream);
                    }

P.S addChild(player) ne sert qu'à afficher mon objet  FLVPlayback c'est tout ;)

@+.
telov.ch
Messages postés
380
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
28 décembre 2009

Ca y est j'ai trouvé, ça doit être ça à 95%
ta fonction functionPlau prend en MouseEvent en paramètre (pEvt.MousEvent), or dans cette fonction la ligne :

var xml:XML = new XML (pEvt.target.data);

demande en event sur l'xml : Event.COMPLETE
Messages postés
1236
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
6 octobre 2010

Oui ça me parait juste, donc en fait c'est plus logique de le placer dans la fonction xmlLoaded, ce que j'avais fais au début, vu que cette fonction est écoutée par xmlLoader qui lui est un event ... mais dans ce cas comment récupérer le 1er noeud dans ma fonction play car évidement si je fais du coup:

public function functionPlay(pEvt:MouseEvent):void
               
                    {
                        player.play(xml.elements()[1].@stream);
                    }

Me dit qu'il trouve pas la propriété xml ...
@+.
telov.ch
Messages postés
1236
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
6 octobre 2010

Non toujours pas ... me génère d'autres erreurs ... je sens que là t'es gentillement en train de regretter de m'avoir répondu :) ...

Bon si jamais t'as encore un poil de temps le plus simple le dossier est là (14Mb à cause des vidéos de test ...)

@+.
telov.ch
Messages postés
1236
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
6 octobre 2010

Yes ! T'es un champion !  :)
T'inquiètes, pour le code je le poserais ici d'ici quelques jours (quand j'aurais fini) et je manquerais pas d'ajouter un grand remerciement à ton égard !
Merci ;=)

@+.
telov.ch
Messages postés
380
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
28 décembre 2009

oh de rien, ce fut un plaisir
Merci à toi aussi
@+
Messages postés
1236
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
6 octobre 2010

Re,

Plus qu'un détail et je poste ^^, comment puis-je dire: si les noeuds parcouru = au total du nombre de noeuds contenu dans le xml, alors on va pas plus loin ?
(Suis-je clair ?)

public function functionFwd(pEvt:MouseEvent):void
              
                    {
                        inc++;
                        player.play(xml.elements()[inc].@stream);
                        bar.infoVideo.text = (xml.elements()[inc].@title);
                    }
                   
                  public function functionRew(pEvt:MouseEvent):void
              
                    {
                        inc--;
                        player.play(xml.elements()[inc].@stream);
                        bar.infoVideo.text = (xml.elements()[inc].@title);
                    }
                   

@+.
telov.ch