Skocz do zawartości

Pomoc: ActionScript 3.0 multiple event functions


torm

Rekomendowane odpowiedzi

Witam,

 

zacząłem się uczyć ActionScript 3.0 i natknąłem się na mały problem, a raczej zagwożdżkę ;) otóż mam w kodzie coś takiego:

 

button1_mc.addEventListener(MouseEvent.CLICK, onButton1Click);
button1_mc.addEventListener(MouseEvent.CLICK, buttonClick);

 

Chodzi o to, że chciałbym to trochę uprościć, żeby nie powtarzać dwa razy tego samego, czyli coś w rodzaju

 

button1_mc.addEventListener(MouseEvent.CLICK, onButton1Click, buttonClick);

 

Po prostu dodać dwie funkcję do jednego kliknięcia...

Przy okazji, wszystkich chcących zacząć przygodę z ActionScript.. zachęcam do genialnych tutoriali Dru Kepple:

http://active.tutsplus.com/author/dru-kepple/ - jedziemy od dołu i na koniec praktycznie wiemy o co w tym chodzi :) później tylko wystarczy nauczyć się funkcji :)

 

Pozdrawiam

Edytowane przez torm
Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 16
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Top Posters In This Topic

a po to, że funkcja buttonClick, jest taka sama, a odnosi się do 7-dmiu przycisków, po prostu optymalizacja kodu.

 

Pewnie myślisz o zagnieżdżeniu tej funkcji w onButton1Click, ale nie bardzo mi to wychodzi...

 

może pokażę cały kod

 

var image:Loader = new Loader();
addChild(image);
image.x = 170;
image.y = 34;

var linkUrl:String;
var currentButton:MovieClip;

button1_mc.addEventListener(MouseEvent.CLICK, onButton1Click);
button1_mc.addEventListener(MouseEvent.CLICK, buttonClick);
button2_mc.addEventListener(MouseEvent.CLICK, onButton2Click);
button2_mc.addEventListener(MouseEvent.CLICK, buttonClick);
button3_mc.addEventListener(MouseEvent.CLICK, onButton3Click);
button3_mc.addEventListener(MouseEvent.CLICK, buttonClick);
button4_mc.addEventListener(MouseEvent.CLICK, onButton4Click);
button4_mc.addEventListener(MouseEvent.CLICK, buttonClick);
button5_mc.addEventListener(MouseEvent.CLICK, onButton5Click);
button5_mc.addEventListener(MouseEvent.CLICK, buttonClick);
button6_mc.addEventListener(MouseEvent.CLICK, onButton6Click);
button6_mc.addEventListener(MouseEvent.CLICK, buttonClick);
link_mc.addEventListener(MouseEvent.CLICK, onReadMoreClick);
link_mc.addEventListener(MouseEvent.CLICK, buttonClick);

function buttonClick(event:MouseEvent):void {
if (currentButton) {  
   	currentButton.alpha = 1;  
   	currentButton.mouseEnabled = true;
}  
currentButton = event.target as MovieClip;
currentButton.alpha = 0.7;
currentButton.mouseEnabled = false; 
}

function onButton1Click(event:MouseEvent=null):void {
setContent("Wiadukt Oryginalny", 
		   "Zdjęcie wiaduktu w Gostyniu przed obróbką w PS, wygląda dość blado... trzeba to poprawić :) poprawione zdjęcie znajduje się w kolejnym przycisku", 
		   "wiadukt.jpg", 
		   "http://pigk.net/torm/wiadukt.jpg"
		   );
}

function onButton2Click(event:MouseEvent):void {
setContent("Wiadukt po obróbce",
		   "Zdjęcie wiaduktu w Gostyniu po obróbce w Photoshopie, wygląda o wiele lepiej:)",
		   "wiadukt_PS.jpg",
		   "http://pigk.net/torm/wiadukt-PS.jpg"
		   );
}

function onButton3Click(event:MouseEvent):void {
setContent("Maluszek",
		   "Zdjęcie fiata 126p wykonane w Piaskach",
		   "maluch_PS3.jpg",
		   "http://pigk.net/torm/maluch-PS3.jpg"
		   );
}

function onButton4Click(event:MouseEvent):void {
setContent("Droga do nikąd",
		   "Droga która prowadzi do nikąd, no bo tak naprawdę dokąd?, w pewnych przypadkach ta reguła się nie sprawdza;)",
		   "miniaturka.jpg",
		   "http://pigk.net/torm/miniaturka.jpg"
		   );
}

function onButton5Click(event:MouseEvent):void {
setContent("Widok z Balkonu",
		   "Widok z balkonu - mieszkanie w Poznaniu. Widok rozciąga się na okolice rataj, najbardziej podoba mi się niebo:)",
		   "widok_z_balkonu.jpg",
		   "http://pigk.net/torm/widok-z-balkonu.jpg"
		   );
}

function onButton6Click(event:MouseEvent):void {
setContent("master piece",
		   "how to master the ActionScript3 ? it's simple, just visit Drew Kepple tutorials;)",
		   "miniaturka.jpg",
		   "http://dupajasia.com"
		   );
}

function onReadMoreClick(event:MouseEvent):void {
var url:URLRequest = new URLRequest(linkUrl);
navigateToURL(url, "_blank");
}

function setContent(title:String, body:String, imageUrl:String, link:String):void {
title_tf.text = title;
body_tf.text = body;
var url:URLRequest = new URLRequest("images/" + imageUrl);
image.load(url);
linkUrl = link;
}

onButton1Click();

Odnośnik do komentarza
Udostępnij na innych stronach

Hmm ekspertem nie jestem ale, jednocześnie dwóch metod chyba nie da się wywołać. Że niby jak, kompilator by naprzemiennie realizował linie kodu każdej z metod?

 

Może jedną z metod wywołaj po prostu w drugiej (np. w metodzie onButtonClick wywołaj buttonClick(); )

Odnośnik do komentarza
Udostępnij na innych stronach

dzudzu - no nie wiem, skoro da się to zapisać w dwóch linijkach kodu, to dlaczego nie da się w jednej? (dodam, że kod powyżej działa, tylko chciałbym go trochę skompresować)

 

ola-f - nie wiem jakie są różnice pomiędzy AS2 od AS3, ale właśnie nie mogę ich zagnieździć, bo funkcja buttonClick zawiera parametr event... i nie można jej wywołać przy pomocy buttonClick(); natomiast gdy pozbawię ją eventu event:MouseEvent, wówczas nie mogę uzyskać wartości event.target...

Odnośnik do komentarza
Udostępnij na innych stronach

button1_mc.addEventListener(MouseEvent.CLICK, onButton1Click);

function buttonClick(event:event):void {
if (currentButton) {  
   	currentButton.alpha = 1;  
   	currentButton.mouseEnabled = true;
}  
currentButton = event.target as MovieClip;
currentButton.alpha = 0.7;
currentButton.mouseEnabled = false; 
}

function onButton1Click(event:MouseEvent):void {
buttonClick(event);
setContent("Wiadukt Oryginalny", 
		   "Zdjęcie wiaduktu w Gostyniu przed obróbką w PS, wygląda dość blado... trzeba to poprawić :) poprawione zdjęcie znajduje się w kolejnym przycisku", 
		   "wiadukt.jpg", 
		   "http://pigk.net/torm/wiadukt.jpg"
		   );
}

Tak próbowałeś?

Odnośnik do komentarza
Udostępnij na innych stronach

aaa, działa pięknie dzięki wielkie :)

 

jest jeszcze jeden problem... bo jak pewnie zauważyłeś w pierwszym onButton1Click, mam (event:MouseEvent=null), no i wyskakuje error, co prawda kompiluje się, ale mnie denerwuje ;) da się jakoś tego pozbyć, bez pisania kolejne funkcji?

Odnośnik do komentarza
Udostępnij na innych stronach

ola-f pewnie masz rację, jednak na razie dopiero uczę się podstaw... jedyne co wiem o As to funkcje i zmienne... to tablic dopiero dojdę :) ale dopracowuje ten kod, żeby jak najwięcej z niego wiedzy wycisnąć :)

 

robiłem to z tutoriala i przypuszczam, że linkUrl, jest po to, żeby łatwo było odróżnić od imageUrl...

 

--edit--

dzudzu - (dopiero Twój post się pojawił) masz rację, ale jest mi to potrzebne do tego, żeby wywołać tę funkcję również bez potrzeby klikania.

Odnośnik do komentarza
Udostępnij na innych stronach

Wiem że tablic jeszcze nie robiłeś, potraktuj to jako 'zajawkę', teraz zmieniając 2 tablice (dopisując po kolejnym wpisie dla tablic: tablice i obiekty, masz w pełni skalarny system).

 

Wywaliłem jednego Eventa, on jest zbyteczny na tym etapie. śmiało można wywoływać funkcję setContent bezpośrednio w obsłudze 1 eventa.

 

var image:Loader = new Loader();
addChild(image);
image.x = 170;
image.y = 34;

var linkUrl:String;
var currentButton:MovieClip;
var tablice:Array = new Array();
// wypełnienie tablic:
		   tablice[0] = ["Wiadukt Oryginalny", 
		   "Zdjęcie wiaduktu w Gostyniu przed obróbką w PS, wygląda dość blado... trzeba to poprawić :) poprawione zdjęcie znajduje się w kolejnym przycisku", 
		   "wiadukt.jpg", 
		   "http://pigk.net/torm/wiadukt.jpg"];
tablice[1] = ["Wiadukt po obróbce",
		   "Zdjęcie wiaduktu w Gostyniu po obróbce w Photoshopie, wygląda o wiele lepiej:)",
		   "wiadukt_PS.jpg",
		   "http://pigk.net/torm/wiadukt-PS.jpg"];
tablice.push(["Maluszek",
		   "Zdjęcie fiata 126p wykonane w Piaskach",
		   "maluch_PS3.jpg",
		   "http://pigk.net/torm/maluch-PS3.jpg"]);
tablice.push(["Droga do nikąd",
		   "Droga która prowadzi do nikąd, no bo tak naprawdę dokąd?, w pewnych przypadkach ta reguła się nie sprawdza;)",
		   "miniaturka.jpg",
		   "http://pigk.net/torm/miniaturka.jpg"]);
tablice.push(["Widok z Balkonu",
		   "Widok z balkonu - mieszkanie w Poznaniu. Widok rozciąga się na okolice rataj, najbardziej podoba mi się niebo:)",
		   "widok_z_balkonu.jpg",
		   "http://pigk.net/torm/widok-z-balkonu.jpg"]);
tablice.push(["master piece",
		   "how to master the ActionScript3 ? it's simple, just visit Drew Kepple tutorials;)",
		   "miniaturka.jpg",
		   "http://dupajasia.com"]);
var obiekty:Array = [button1_mc, button2_mc, button3_mc, button4_mc, button5_mc, button6_mc];

// przypisanie akcji:
for each (var element in obiekty)
{
element.addEventListener(MouseEvent.CLICK, buttonClick);
}
link_mc.addEventListener(MouseEvent.CLICK, onReadMoreClick);
link_mc.addEventListener(MouseEvent.CLICK, buttonClick);


function buttonClick(event:MouseEvent):void {
if (currentButton) {  
   	currentButton.alpha = 1;  
   	currentButton.mouseEnabled = true;
}  
currentButton = event.target as MovieClip;
currentButton.alpha = 0.7;
currentButton.mouseEnabled = false; 

var index:Number = obiekty.indexOf(event.target);
// zabezpieczenie przed wywołaniem funkcji z obcego obiektu. 
if (index>=0)
{
	setContent(tablice[index][0], tablice[index][1], tablice[index][2], tablice[index][3]);
}
}

function onReadMoreClick(event:MouseEvent):void {
var url:URLRequest = new URLRequest(linkUrl);
navigateToURL(url, "_blank");
}

function setContent(title:String, body:String, imageUrl:String, link:String):void {
title_tf.text = title;
body_tf.text = body;
var url:URLRequest = new URLRequest("images/" + imageUrl);
image.load(url);
linkUrl = link;
}

setContent(tablice[0][0], tablice[0][1], tablice[0][2], tablice[0][3]);

 

Powodzenia w AS

 

// EDIT:

 

Error wyskakuje Ci, gdy jest tak: (event:MouseEvent=null) czy tak: (event:MouseEvent)? Bo ja bym ten null najchętniej wywalił. Nadpisuje Ci przecież zdarzenie kliknięcia myszką.

 

To nie oto chodzi, że nadpisuje, to jest watość domyślna. Przykładowo:

mamy taką funkcję:

function blabla(e:Event){};

Ją można wywołać tylko i wyłącznie podając parametr typu event w argumentach funkcji.

Ale gdy mamy:

function blabla(e:Event= null){};

to możemy wywołać na 2 sposoby:

-podając argumenty typu Event

-wywołując bez argumentów: blabla(); tutaj kompilator zobaczy, że liczba argumentów nie jest zgodna, ale za to nam podstawi null, i już bedzie się zgadzać.

W poprzednim przeypadku deklaracj;

function onButton1Click(event:MouseEvent=null):void {..}; musi być z domyślnym null'em, gdyż na końcu jest wywoływana funkcja bez argumentu:

onButton1Click();

Edytowane przez BizU
Odnośnik do komentarza
Udostępnij na innych stronach

witam, mam kolejny problem z AS 3.0, ale nie chciałbym nowego wątku tworzyć... więc zapytam tutaj... właśnie jestem w trakcie tworzenia menu we flashu... i musi ono współgrać z PHP... a więc odbierać zmienne... i przekształcać je na odpowiedni adres... znalazłem w necie kilka tutoriali na ten temat.. ale nadal ciężko mi ogarnąć to zagadnienie... jeśli ktoś mógłby rzucić na to trochę swiatła to byłbym wdzięczny :)

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności