Temat: Klasy – proste pytania

czyli jednak nie do końca się machnąłem ;)
bardziej od klas wolałem grę w "gumę"... raz dwa trzy raz dwa trzy ;)Krzysztof Cieślak edytował(a) ten post dnia 23.05.09 o godzinie 11:36
Piotr Danielewicz

Piotr Danielewicz front-end developer,
Media 4 U

Temat: Klasy – proste pytania

OK, dzięki za poprzednie rady. Oczywiście były ona bardzo przydatne dały dużo światła na podstawy ASa :)

Teraz pytanie następne ;)

Jak z podklasy odwołać się do obiektu na scenie lub w bibliotece?
W tym momencie zgłasza mi błąd, że nie widzi mojego MC, a chciałbym zmienić np jego alpha.

Dzięki za pomoc

Temat: Klasy – proste pytania

Opis dla CS4, w CS3 pewnie jest podobnie, ale nie wiem, bo nie używam :P

Flash umożliwi Ci dostęp do instancji symbolu z biblioteki pod warunkiem, że nadasz jej identyfikator i w klasie kontenera zawierającego tę instancję stworzysz zmienną publiczną o tej samej nazwie co nadany identyfikator instancji.

Przykład:

Załóżmy, że masz projekt w pliku Main.fla. W jego opcjach ustawiasz klasę bazową projektu na Main. Tworzysz plik Main.as w tym samym katalogu co Main.fla.

Zacząć musisz od tego, że MovieClipa zamienisz na symbol do biblioteki: wciskasz F8. Wyskakuje okienko z opcjami zamiany na symbol. Nadajesz nazwę i miejsce jakie Ci wygodne. Otwierasz opcje zaawansowane jeżeli jeszcze nie są otwarte klikając na Advanced.

W sekcji Linkage zaznaczasz „Export for ActionScript” oraz „Export in frame 1”

Następnie ustawiasz „Class” na „MyMovieClip”. Klikasz na ptaszku i wyskakuje informacja, że Flash nie może znaleźć definicji takiej klasy, w związku z czym utworzy ją dynamicznie w czasie odtwarzania swfa. Nie przejmujesz się tym, gdyż zaraz to poprawimy. „Base class” możesz wyczyścić. Zatwierdzasz zamianę na symbol.

Następnie (to najważniejsza część, tutaj zacznie się magia ;) ) w palecie Properties wchodzisz w pole tekstowe „<instance name>” i wpisujesz myMovieClip. Otwierasz plik Main.as i wrzucasz do niego następującą treść:


package {

import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;

public class Main extends MovieClip {
public var myMovieClip:MyMovieClip;

const ALPHA_STEP = 0.25;
public function Main() {
setupListeners();
}
public function clickListener(e:Event) : void {
var addAlpha : Boolean = Math.random() < 0.5;
var changeAlpha = addAlpha ? +ALPHA_STEP : -ALPHA_STEP;
myMovieClip.alpha +=changeAlpha;
trace("Thou clicked myMovieClip!");
trace(changeAlpha);
}
private function setupListeners() {
myMovieClip.addEventListener(MouseEvent.CLICK, clickListener)
}
}
}


Ponieważ nadałeś nazwę „myMovieClip” instancji symbolu we Flashu oraz stworzyłeś taką zmienną w klasie głównej projektu, Flash wie, że ma podłączyć tę konkretną instancję do tej zmiennej w klasie Main.as

Teraz trzeba zbudować klasę MyMovieClip. Wciskasz [ctrl-n] i wybierasz „ActionScript File”. Zapisujesz plik jako MyMovieClip.as w tym samym katalogu co Main.fla.

Wrzucasz następującą treść:

package {
import flash.display.MovieClip;
public class MyMovieClip extends MovieClip {
}

}


To na razie tyle. Oczywiście istnieją jeszcze inne sposoby poradzenia sobie, ale ten działa w miarę sprawnie...

Ogólne polecam jakąś dobrą książkę do ActionScript 3.0, np. Essential ActionScript 3.0 wydawnictwa O'Reilly.

P.S. Gdybyś potrzebował korepetycji/szkolenia z AS3.0 , daj znać na priwa. Może będę w stanie pomóc.Maciej Przepióra edytował(a) ten post dnia 27.05.09 o godzinie 09:17
Piotr Danielewicz

Piotr Danielewicz front-end developer,
Media 4 U

Temat: Klasy – proste pytania

Bardzo dziękuję za bardzo obszerne wyjaśnienie problemu w stylu "dla opornych" ;)
Nie wgrywałem się jeszcze dokładniej w Twoją wypowiedź więc nie jestem jeszcze gotów powiedzieć, ze wszystko zrozumiałem, ale to zrobię bo temat mnie korci ;)

Ja osobiście wczoraj wieczorem doszedłem do własnego rozwiązania tak trochę na opak.

W klasie głównej robię tak:
var z:Test = new Test(this)

a w konstruktorze podklasy

public function Test(dest:Object){
dest.myMc.alpha = .5
}

Niby działa, ale w każdej funkcji muszę się odwoływać właśnie poprzez ten parametr dest...
jest to trochę uciążliwe na dłuższą metę i jak projekt się rozrośnie to mozna sie nieźle pogubić.
Alex Ilczenko

Alex Ilczenko Software developer,
Blueprint London

Temat: Klasy – proste pytania

Jeśli klasa obusguje jakis MovieClip czy Sprite, to przekazuj do niej referencje tylko do tego objektu.

W głównej klasie


var t:Test = new Test(this.getChildByName('mc_my') as MovieClip);


w Test:


class Test
{
private var mc:MovieClip;

public function Test(mc:MovieClip)
{
this.mc = mc;

setAlpha();
}

// przykladowa funkcja
function setAlpha():void
{
mc.alpha = .5;
}
}
Piotr Danielewicz

Piotr Danielewicz front-end developer,
Media 4 U

Temat: Klasy – proste pytania

No w sumie to też jest dobre rozwiązanie :)

Dzięki za pomoc :)
Łukasz Błachowicz

Łukasz Błachowicz codziennie wymiatam
i odkurzam

Temat: Klasy – proste pytania

this.getChildByName('mc_my')

getChildByName to srednie rozwiazanie. Uzywajac klas lepiej sie trzymac referencji.
Alex Ilczenko

Alex Ilczenko Software developer,
Blueprint London

Temat: Klasy – proste pytania

No tak, ale jakos trzeba przekazać tę referencje do klasy, a ja osobiście nie lubie dziedziczyć od MovieClip

konto usunięte

Temat: Klasy – proste pytania

Wyłącz "automatically declare stage instances" w Flash Player Settings. Imo z tą opcją włączoną jest straszny burdel w klasach.

Następna dyskusja:

proste pytanie :)




Wyślij zaproszenie do