PDA

Volledige versie bekijken : Movieclips opslaan en laden uit arrays.


Albus
%Europe/Berlin %583 %2007, 14:59
Hallo,

K denk er al zo lang over na maar k vind geen oplossing. K ben een navigatiemenu aan t ontwikkelen in AS3. Je hebt 4 knoppen die onder elkaar staan. Wanneer je over een knop gaat met de muis, dan vergroot de lengte van deze knop en dan vergroot de y positie van alle overige knoppen die eronder staan (dit omdat de knop anders door de andere knoppen beweegt).

De height van de knop vergroten is geen probleem, maar nu ben k bezig met het script dat de overige knoppen moet verschuiven.

Probleem: de movieclip 'inActiefVlak' veranderd bij elke onEnterFrame. Als je dit script even in een leeg fla doc plakt, en je beweegt met de muis redelijk snel verticaal over de 4 verschillende knoppen, dan zie je dat ze allemaal naar boven verdwijnen.

Oplossing: k weet dat k hier iets aan KAN doen, maar k weet niet hoe. K dacht aan een array waarin k voor elke knop alle niet actieve knoppen opsla en ze dan telkens uit de array halen.

De movieclip 'vlak' stelt een knop voor.


var kleur:Array = ["0xFFFFFF","0x990000","FF0000","999999"];

var vlak_b:Number = 200;
var vlak_l:Number = 12;

var spatie:Number = 4;

var v:Number = 3;
var eindL:Number = vlak_l * 3;
var w:String = new String();
var iav:Array = new Array();
var e:Number = new Number();
for(var i:Number=0;i<kleur.length;i++) {
var vlak:MovieClip = new MovieClip();
vlak.graphics.beginFill(kleur[i]);
vlak.graphics.lineTo(vlak_b,0);
vlak.graphics.lineTo(vlak_b,vlak_l);
vlak.graphics.lineTo(0,vlak_l);
vlak.graphics.endFill();
addChild(vlak);
vlak.name = "vlak"+i;
vlak.i = i;
vlak.w = w;
vlak.iav = iav;
vlak.y = (vlak_l+spatie)*i;
vlak.alpha = 0.8;
vlak.addEventListener(MouseEvent.MOUSE_OVER,muis_o ver);
vlak.addEventListener(MouseEvent.MOUSE_OUT,muis_ui t);
}

function muis_over(event:MouseEvent):void {
event.target.addEventListener(Event.ENTER_FRAME,en ter_frame);
event.target.w = "+";
}
function muis_uit(event:MouseEvent):void {
event.target.addEventListener(Event.ENTER_FRAME,en ter_frame);
event.target.w = "-";
}

function enter_frame(event:Event):void {
if(event.target.w=="+") {
event.target.height += v;
if(event.target.height>=eindL) {
event.target.height = eindL;
event.target.removeEventListener(Event.ENTER_FRAME ,enter_frame);
}
} else {
event.target.height -= v;
if(event.target.height<=vlak_l) {
event.target.height = vlak_l;
event.target.removeEventListener(Event.ENTER_FRAME ,enter_frame);
}
}
// dit moet nog verbeteren:
for(var j:Number=event.target.i;j<kleur.length;j++) {
var inActiefVlak:MovieClip = getChildByName("vlak"+j) as MovieClip;
event.target.iav.push(inActiefVlak.name);
if(j==kleur.length-1) {
trace(event.target.iav);
}
if(inActiefVlak != event.target) {
if(event.target.w=="+") {
inActiefVlak.y += v;
} else {
inActiefVlak.y -= v;
}
}
}
}


Waarschijnlijk gaat niemand mij helpen vanwege het lange script en de lange uitleg, maar k wou t toch even vragen.

c0redump
%Europe/Berlin %486 %2007, 12:40
Hey, idd een erg lang script, dat ik niet ga lezen. Ik kan je wel vertellen hoe ik dit altijd aanpak:

Ik heb 2 classes: Menu en MenuItem. Menu is de basisclass die in mijn geval een container is voor de toplevel items(zoals ik t lees heb jij maar 1 laag in je menu dus dat maakt t al wat makkelijker), en het MenuItem is een class die in weze een uitgebreide linked list (http://en.wikipedia.org/wiki/Linked_list) is. Elk menuitem heeft dus een referentie naar het onderliggende menuitem. Nu bouw je een functie in die iets doet bij ROLL_OVER en ROLL_OUT. In jouw geval dus dat het item groter wordt. En om te voorkomen dat hij over zn onderliggende menu item heen gaat roep je van dat object een functie aan die z'n positie aanpast aan de hand van wat zn grote broer doet. Tegelijkertijd roept dit object dezelfde functie aan van de referentie die hij heeft van t volgende menuitem, en die op zijn beurt weer bij de volgende...enz...enz...

Je kan dit principe makkelijk toepassen met een singly linked list, maar als de menuitems rondom het actieve item, zowel drboven als beneden, hun positie aan moeten passen, is t mss makkelijker een doubly linked list te gebruiken...

Hopelijk kan je hier wat mee...