AS3 OOP - n00b-spørgsmål
Hej eksperter.Jeg har nogle OOP-spørgsmål, jeg håber nogle af jer kloge hoveder kan svare på.
Jeg arbejder på en applikation til en avis, hvor man skal kunne se en fodboldbane og de taktiske opstillinger, f.eks. en 4-4-2 vs. 4-3-3 opstilling. Herudover kan man klikke på de enkelte spillere og se et lille popup-vindue. Det virker som det skal.
Jeg har en klasse, Commoncode. Denne oprettes vha. Document Class-feltet. Her defineres bl.a. følgende variabler:
public class Commoncode extends Sprite {
private var hometeamspillere = new Array();
private var awayteamspillere = new Array();
...
I disse arrays bliver spillerne pushet ind som objekter. Længere nede bliver array'ene vigtige...
I constructor ligger bl.a. følgende kode, der opretter hjemmeholdet og indlæser et XML-feed:
grafikobjekter = new Grafikobjekter();
grafikobjekter.name = "hjemmehold_mc";
grafikobjekter.x = 14;
grafikobjekter.y = 29;
addChild(grafikobjekter);
grafikobjekter.visible = false;
var xmlLoader:URLLoader = new URLLoader();
var xmlData:XML = new XML();
xmlLoader.addEventListener(Event.COMPLETE, LoadXML);
...
Først oprettes Grafikobjekter. Det er et simpelt movieclip, der rummer 11 instances af en fodboldspiller, navngivet spiller2, spiller3, spiller4 etc op til 11.
Vigtigt: hver fodboldspiller (instance af "Hjemmeholdsspiller" - levn fra tidligere, nu bør den bare hedde "HomeAwayspiller") har en linkage-klasse. Dvs. når de er oprettet, håndterer de al funktionalitet som museklik, scrolling, skjul-funktion m.fl.
Når XML-feedet så er indlæst + fodboldholdet oprettet, køres denne metode så.
private function opretSpillere(homeaway) {
// Vi har 2 hold. Variablen "homeaway" kan være hhv. "hometeam" og "awayteam". På den måde kan vi også genbruge metoden på udeholdet
for (var i=0; i<xmlData.lineups[homeaway].player.length(); i++) {
// Hvert hold har 11 spillere
spiller = new Object();
spiller.homeaway = homeaway;
spiller.id = xmlData.lineups[homeaway].player[i].@id;
spiller.position = Number(xmlData.lineups[homeaway].player[i].position);
spiller.shirtnumber = xmlData.lineups[homeaway].player[i].shirtnumber;
spiller.name = xmlData.lineups[homeaway].player[i].name;
spiller.goals = xmlData.lineups[homeaway].player[i].goals;
spiller.cardsyellow = xmlData.lineups[homeaway].player[i].cardsyellow;
spiller.cardsred = xmlData.lineups[homeaway].player[i].cardsred;
this[homeaway + "spillere"].push(spiller);
}
// Sortér spillerne efter deres position (udskiftn. har altid 0, målmand 1 og de øvrige spillere 2-11
this[homeaway + "spillere"].sortOn(["position"], [Array.NUMERIC]);
// Fordi vi har et ukendt antal udskiftningsspillere, har vi variablen "spillerpos". Vi springer over udskiftn. og målmand, da de altid har faste positioner (mål/bænk)
var spillerpos = 2;
var substitut = 0;
for (var spillerCnt=0; spillerCnt<this[homeaway+"spillere"].length; spillerCnt++) {
if (this[homeaway+"spillere"][spillerCnt].position != 0) {
// Hvis der ikke er tale om en udskiftningsspiller...
grafikobjekter[homeaway+"_mc"]["spiller"+spillerpos].navn_txt.text = this[homeaway+"spillere"][spillerCnt].name;
spillerpos++;
} else {
// Det er en udskiftningsspiller, så placér vedkommende på bænken
if (homeaway == "hometeam") {
var udskifter = new Hjemmeholdsudskifter();
udskifter.x = 70 + substitut*30;
} else {
udskifter.x = 370 + substitut*30;
}
udskifter.y = 385;
udskifter.name = homeaway+"udskifter"+substitut;
addChild(udskifter);
substitut++;
}
}
// Når XML'en er indlæst, vis da hele holdet
grafikobjekter.visible = true;
}
OK - nu bliver det lidt langhåret... Fordi fodboldspillerne er ligger indeni Grafikobjekter, vil de være childs. Grafikobjekter rummer som nævnt øverst, herudover array'ene hometeamspillere og awayteamspillere der har alle oplysninger om spillerne.
Her er klassen Hjemmeholdsspiller's constructor:
public function Hjemmeholdsspiller() {
maxIndex = this.parent.numChildren - 1;
tooltip = new Tooltip();
this.buttonMode = true;
this.addEventListener(MouseEvent.CLICK, mouseclick);
//this.parent.addEventListener(MouseEvent.MOUSE_OUT, mouseout);
this.tooltip.scroller_mc.addEventListener(MouseEvent.MOUSE_DOWN, dragIt);
this.tooltip.scroller_mc.addEventListener(MouseEvent.MOUSE_UP, releaseIt);
this.tooltip.scroller_mc.addEventListener(MouseEvent.ROLL_OUT, releaseIt);
}
DETTE SKER:
Informationen om de enkelte spillere - hvad de hedder, antal gule/røde kort m.m. skal vises i det lille popup-vindue.
Som jeg ser det, har vi et hieraki der ser sådan ud:
Flash->grafikobjekter (klassen Grafikobjekter) -> spiller2 (klassen Hjemmeholdsspiller) -> tooltip (tom klasse).
PROBLEM:
Objektet "tooltip" skal vise spilleroplysningerne. Dvs. noget i retning af trace(this.parent.parent.hometeamspillere[2].name);
eller
trace(event.currentTarget.parent.parent.hometeamspillere);
...og så i det mindste SE at array'et kan nås?
MEN: jeg kan ikke referere til property'en hometeamspillere (i grafikobjekter), som tooltip er barnebarn af. Den melder bare "undefined", selv om jeg kan se array'et i debuggeren.
Burde jeg ikke uden problemer kunne referere til rodvariablen, da tooltip er nedarvet i 2. niveau?
