AS3 - Button on stage via externe class aansturen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • scidhuv
  • Registratie: Februari 2009
  • Laatst online: 07-01-2024
Ik blijf verwondered over de kwaliteit van AS3 documentatie, duidelijkheid is overal ver te zoeken (heeft iemand wellicht een goede bron voor beginnend Flash programmers?

Los daarvan:

Ik heb een stage met button "X_Btn" welke ik via een tweede externe class wil aansturen. De main class is al document class en gelinkt met de .fla (vergeef me eventuele rare termen) maar ik krijg vanuit deze secondary class niets gelinkt...

Eerst heb ik de Main class gelinkt als document class, moeten hier wellicht de listeners allemaal in? (want dat werkt wel)
code:
1
public class Main extends Buttons

Best practice is ver te zoeken zo denk ik :s maarja, de secondary class deed toen tenminste iets en werd

code:
1
2
3
4
5
6
7
8
9
10
11
12
package
{
                import flash.display.MovieClip

    public class Buttons extends MovieClip
    {
        public function Buttons()
        {
            X_btn.addEventListener(MouseEvent.CLICK, gotoX);
                                }
                }
}


Hierbij krijg ik dus een foutmelding:
"1120: access of undefined property X_Btn"

Ik snap dat de secondary class dus de button (oftewel de stage) niet kan vinden maar root. of stage. ervoor werkt ook niet... hoe link ik hem dan wel?

los van deze error:
Ik heb de Buttons class ge-extend naar MovieClip omdat het anders problemen gaf, ook onduidelijk waarom.

Ik hoop dat iemand hier wat zinnigs op te zeggen heeft want ik word er gek van en zelfs met Google skills vind ik er 0 duidelijke bronnen over...

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Gebruik 'this.addEventListener'. Je class heeft geen besef van hoe de stage (of de timeline, als we toch bezig zijn) er uit ziet. Maar je kunt wèl altijd naar de huidige instantie van jouw class refereren met het 'this' keyword.

Overigens wil linkage niet zeggen dat je een class B maakt om een class A aan te sturen. Linkage is een deftige manier om library symbols aan afgeleide classes te koppelen i.p.v. aan de standaard class voor een bepaald type library symbol. Je vervangt class A dus door een class B die de functionaliteit van class A draagt en daarnaast extra functionaliteit implementeert: grof gezien is dat de basis van Object Oriented Programming (OOP). Mocht het zo zijn dat je niet weet wat dat inhoudt, zou ik er zeker eens even op googlen en gaan lezen.

Acties:
  • 0 Henk 'm!

  • scidhuv
  • Registratie: Februari 2009
  • Laatst online: 07-01-2024
Mja nu geeft ie een error 1119: Access of possibly undefined property X_Btn through a reference with static type Buttons.
Terwijl deze button "X_Btn" toch echt op de stage staat :s

Ik heb begrepen dat het beste idee is om alle code onder te brengen in classes, met datgene wat jij nu zegt erbij is het dan zaak om de Main (document) class zo simpel mogelijk te houden? - oftewel dat je alle secondary classes "extends Main" maakt zodat ze allemaal die hoofdfunctionaliteit hebben?

Het probleem waar ik tegenaan liep was dat de function in mijn secondary class gewoon niet wakker werd (listeners deden niets, nu ook met this. ervoor. De enige manier waarop ik de function wakker kreeg was door de Main class te extenden naar sec. class (public class Main extends Buttons) wat me absoluut niet juist lijkt...

Bedankt zover al iig!

Acties:
  • 0 Henk 'm!

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Je kunt je class toegang geven tot de stage. Dat kan al meteen in de constructor...

Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Main flash document
var myButton:MyCustomButtonClass = new MyCustomButtonClass(this);


// MyCustomButtonClass.as
package {
  public class MyCustomButtonClass  {
    private var _stage;

    function MyCustomButtonClass(stageRef) {
      this._stage = stageRef;
    }
  }
}


Kleine foutjes voorbehouden... het is een tijdje geleden dat ik voor het laatst AS heb gebruikt.

Verder is het de vraag of je zo wilt werken... je krijgt een beetje spaghetti op deze manier. Het is mooier om gewoon die X_Btn te creëren in je eigen class.

TabCinema : NiftySplit


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
scidhuv schreef op maandag 02 augustus 2010 @ 10:30:

Het probleem waar ik tegenaan liep was dat de function in mijn secondary class gewoon niet wakker werd (listeners deden niets, nu ook met this. ervoor. De enige manier waarop ik de function wakker kreeg was door de Main class te extenden naar sec. class (public class Main extends Buttons) wat me absoluut niet juist lijkt...
Op dit punt zeg ik: "Ho! Stop!" Dit klinkt namelijk alsof je nul-komma-nul besef hebt van hoe een object oriented programmertaal werkt. Trek eerst maar eens een relevant "For dummies" boek open en werk dat door, voordat je je waagt aan dit project.

Wellicht moet je daarna nog maar eens opnieuw gaan lezen hoe linkage classes werken en klikt het dan wel...

Acties:
  • 0 Henk 'm!

Verwijderd

Bozozo schreef op maandag 02 augustus 2010 @ 11:06:
Je kunt je class toegang geven tot de stage. Dat kan al meteen in de constructor...

Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Main flash document
var myButton:MyCustomButtonClass = new MyCustomButtonClass(this);


// MyCustomButtonClass.as
package {
  public class MyCustomButtonClass  {
    private var _stage;

    function MyCustomButtonClass(stageRef) {
      this._stage = stageRef;
    }
  }
}
Je kan beter gewoon wachten op het added to stage event, vanaf dan heb je automatisch een stagereference.
Java:
1
2
3
4
5
6
7
8
9
10
package {
    public class Button extends Sprite {
        function Button(){
            addEventListener(Event.ADDED_TO_STAGE,addedToStage);
        }
        private function addedToStage(e:Event):void {
            trace("Stageref:",stage); // zal defined zijn
        }
    }
}

En dan kan je wel getChildByName gebruiken om je movieclip te vinden. Maar je stage object is geen ideale manier om referenties naar objecten op te vragen. Je kan inderdaad best eerst de basics van OO eens doornemen.

Acties:
  • 0 Henk 'm!

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Tnx, weer wat geleerd :)

TabCinema : NiftySplit


Acties:
  • 0 Henk 'm!

  • scidhuv
  • Registratie: Februari 2009
  • Laatst online: 07-01-2024
Dank voor de replies, maar zoals gezegd vind ik de aanwezige guides etc niet echt duidelijk... AS3 bible ben ik mee bezig maar als het allereerste voorbeeld al foutief is...

Zo gaat het wel goed komen :)
Pagina: 1