ugrás a tartalomhoz

Egyéni események

whiteman0524 · 2010. Ápr. 17. (Szo), 18.03
Sziasztok !

Van egy kis problémám az eseményekkel. A probléma leegyszerűsítve. Van négy osztályom, a példa kedvéért legyenek A, B, C és D. A kapcsolat közöttük a következő : A osztály a fő osztály, tehát ő van belinkelve a fő időszalag osztályának. B osztály az őse mind a C és mind a D osztálynak, viszont A és B között ilyen értelemben nincsen semmiféle kapcsolat. (Azon kívül persze hogy mind a ketten nyilván valóan a MovieClip osztály gyermekei)

Azt szeretném megoldani, hogy minden C-ből származó objektum egy bizonyos esemény (a példa kedvéért legyen ez egy egérkattintás) hatására váltson ki egy újabb eseményt, amit minden C-ből származó objektum (tehát saját maga is) és minden D-ből származó is figyeljen, és ha bekövetkezik, akkor tegyék azt, amit ekkor kell nekik. A példa kedvéért legyen a kiváltandó esemény neve KIVALTANDO_ESEMENY. Én már próbáltam sokféleképpen, és most inkább nem sorolom fel őket mert 10 oldalra rúgna és egyik se jött össze :(

Ha valaki lenne oly szíves és leírná néhány sorban hogy ezt hogy tudnám megvalósítani annak nagyon hálás lennék :) A segítséget előre is köszönöm.
 
1

Elfelejtettem...

whiteman0524 · 2010. Ápr. 17. (Szo), 18.05
...azt hogy ActionScript 3.0 - ban kéne a megoldás :)
2

Esemény

Poetro · 2010. Ápr. 18. (V), 05.30
Feliratkozhatsz más objektumok eseményeire, amik triggerelhetnek eseményeket. Bővebb információért lásd az ActionScript 3 eseménykezelését.
3

Hát igen...

whiteman0524 · 2010. Ápr. 18. (V), 12.17
...de már megnéztem eléggé mélyre hatóan az ActionScript eseménykezelését. Nem az a probléma, hogy nem értem, hanem az hogy gyakorlatilag nem sikerül összehozni a dolgot. Az első problémám, hogy ugye először is minden egyedi eseményt a stage -hez kell bejegyezni. (legalábbis én onnan indítok, mint az esemény hierarchiafa csúcsáról) Például :

import flash.display.*;

stage.addEventListener(KIVALTANDO_ESEMENY, elfogoFuggveny);


Namost, ezt így a stage-hez bejegyezni csak abból az objektumból lehet, ami implementálja az elfogoFuggveny-t, különben szép nagy ERROR-t kapunk. Őszintén szólva nem értem hogy ezt miért kellett így megoldani de mindegy. A fő objektumnál nincsen probléma, az események bejegyzésénél a stage-hez, de a többi objektumnál már van. Először is, a stage-hez bejegyzést logikus lenne az objektum konstruktorába tenni, hogy mikor létrejön, jegyezze be azokat az eseményeket amiket kell. Ez a fő objektumnál (fő időszalag) nem probléma, hiszen az objektum csak egyetlen egyszer jön létre, akkor amikor elindul a program, ennélfogva a konstruktora is csak egyszer fut le, tehát egyszer jegyezzük be az eseményeket a stage-hez. Na most a többi osztálynál, amikből számos objektumot példányosítunk, ez a fönti konstruktoros dolog már eleve marhaság, hiszen ha én a C osztály konstruktorába teszek egy esemény bejegyzést a stage-hez, akkor az annyiszor fogja bejegyezni ugyan azt az eseményt ahány objektumot példányosítok a C-ből (Hiszen annyiszor fut le a konstruktor). (Ez gyakorlatilag nem probléma, de elméletileg eléggé nem szép dolog).

Hogy miért nem lehet akkor egyszerűen minden egyedi eseményt a fő objektumból bejegyezni ? Hát azért, mert nem biztos hogy a főobjektum implementálja az esemény kezeléséhez szükséges függvényt. És mint ahogy mondtam, a stage- hez bejegyzés alapfeltétele hogy az objektum implementálja az elfogoFuggveny-t.

Nade idáig ez nem is akkora probléma, hiszen mindezt beveszi a Flash, szóval hiába akarjuk többször bejegyezni a stage-hez ugyan azt az eseményt ugyan azzal az elfogó függvénnyel, ő csak egyszer fogja. De itt jön a következő megmagyarázhatatlan probléma. A fő objektumnál szépen működnek a dolgok például így :

import flash.display.*;

public class A extends MovieClip {
   public static const KIVALTANDO_ESEMENY:String = "KIVALTANDO_ESEMENY";
   public function A(){
      stage.addEventListener(A.KIVALTANDO_ESEMENY, elfogoFuggveny); /* bejegyezzük az eseményt a stage-hez. */
      addEvenetListener(A.KIVALTANDO_ESEMENY, elfogoFuggveny); /* Most pedig bejegyezzük, a figyelőt magához az objektumhoz, mert nem akarjuk hogy továbbadódjon miután megkapta. Ha tovább szeretnénk küldeni, akkor ez nem kéne ide. */
      dispatchEvent(new Event(A.KIVALTANDO_ESEMENY, false)); /* Itt pedig ki is váltjuk az eseményt és megcímezzük saját magunkat( mert ugye a dispatchEvent a this-re hivatkozik). A new Event második paramétere flase, tehát az esemény nem fog továbbadódni, miután a célobjektum megkapta. */
   }
   private function elfogoFuggveny(e:Event):void{
      trace("Elfogtuk a KIVALTANDO_ESEMENY-t !");
   }

}


Szóval mint ahogy fentebb is említettem ez így korrekt, a fő objektum esetében, de más objektumoknál hivatkozási hibát kapok. Például ez így már nem működik :

import flash.display.*;

public class B extends MovieClip {
   public static const KIVALTANDO_ESEMENY_2:String = "KIVALTANDO_ESEMENY_2";
   public function B(){
      stage.addEventListener(B.KIVALTANDO_ESEMENY_2, elfogoFuggveny_2);
      addEvenetListener(B.KIVALTANDO_ESEMENY, elfogoFuggveny);
      dispatchEvent(new Event(B.KIVALTANDO_ESEMENY, false));
   }
   private function elfogoFuggveny_2(e:Event):void{
      trace("Elfogtuk a KIVALTANDO_ESEMENY_2-t !");
   }

}


Tehát akkor végszónak : Ha mód van rá, akkor ne olyan módon próbáljunk segíteni hogy nézzem át az ActionScript eseménykezelését, mert azt hiszem nagyjából értem. De sajnos gyakorlatilag adódnak problémák, tehát jobban örülnék egy gyakorlatilag is működő egyszerű példának :) Ettől függetlenül természetesen köszönöm Poetro válaszát is.
4

...

carstepPCE · 2010. Ápr. 18. (V), 21.54
En ugyan csak Flex-t hasznalok, ott nincs stage, de:

Ha jol ertem a problemad, akkor szerintem a C es D osztalybol objektumokat keszito objektumnak kell implementalni az elkapo fuggvenyeket. Legalabbis a sajat esemenyek kivaltasanak pont ez a lenyege.

Udv
Sanyi
5

Lehetséges...

whiteman0524 · 2010. Ápr. 19. (H), 13.26
..hogy pont ez a lényege, akkor viszont nekem másfajta a problémám. Tehát akkor kicsit világosabban, de a példánál maradva : Az A főobjektumom gyártja a C és D objektumokat. Az események kiváltásáért a C objektumok felelnek (mindegyikőjük kiválthatja az eseményt). A C objektumok által kiváltott események célpontjai, pedig szintén a C objektumok (önmaguk is) és minden D objektum.

Amit ki akarok váltani ezekkel az eseményekkel : Mivel alapvetően az A objektum gyárja a C és D objektumokat, ezért ő eléri mindegyiket. Események nélkül, úgy tudom megvalósítani a fenti "üzenetküldést" hogy minden egyes C objektumra kattintáskor, meghívja A egy függvényét, mely végigrohan az általa létrehozott C és D objektumokon, és értesíti őket. Ez tiszta sor. Csak az a szépséghibája, hogy az "üzenetek" az A objektumon keresztül mennek. Én azt szeretném megoldani események segítségével, hogy ne kelljen ahhoz A objektum, hogy mindezt végrehajthassam, tehát hogy a C objektumok A közvetítése nélkül kommunikáljanak a többi C objektummal és a D objektumokkal.
6

...

carstepPCE · 2010. Ápr. 19. (H), 20.00
En mashogy allnek neki. Eloszor is a C objektumoknak kellene egy esemenyre feliratkozni az A objektumon, illetve az a C objektum, amelyik kivaltja a kezelendo esemenyt az uzenne az A objektumnak, hogy valtozas van es igy az A objektum kivaltja ezt a specialis esemenyt. Remelem tudtam ezzel otletet adni, segiteni.

udv
Sanyi
7

Igen

whiteman0524 · 2010. Ápr. 20. (K), 20.48
ötletet adtál, köszönöm szépen :)