PDA

Volledige versie bekijken : XML menu


Ruby
%Europe/Berlin %773 %2005, 19:34
Beste Flashers,

Ik weet dat het niet de bedoeling is om hele lappen code ter controle aan te bieden, maar ik kan mijn eigen fout echt niet vinden. Bij de submenus laat hij slechts de laatste menuitems en de rest vergeet hij 8-).

Ik heb namelijk een xml menutje met submenus gemaakt, nu heb ik al gecontroleerd of hij alles wel goed in de objecten en arrays zet en daar is niks mis mee. (gelukkig :O)

Het probleem zit hem in de opbouw van het menu, zie functie 'buildMenu'.

Hier komt de code:


stop();

var mitems:Array = new Array();
var mcmenu:Array = new Array();
var tmc:Array = new Array();
var xml:XML = new XML();

var begin:Number = 177;
var startalpha:Number = 40;

var intID:Number;
var currentSubmenu:Number = 0;

var link:String;

_root.onLoad = function()
{
xml.load("menu.xml");
xml.ignoreWhite = true;

xml.onLoad = function(success:Boolean)
{
if(success)
{
parseXML();
buildMenu();
}
}
}

/* Structure :
Array ( [0] => Object ( naam: home, link: index.html ),
[1] => Object ( naam: over mij, items: Array ( Object ( naam: subitem, link: sublink.html ),
etc.
)
)
*/
function parseXML(Void):Void
{
var rNodes:Array = xml.firstChild.childNodes;

for(var i:Number=0;i<rNodes.length;i++)
{
if(rNodes[i].nodeName == "menuitem")
{
if(rNodes[i].attributes.name == null)
{
var o:Object = new Object();
o.naam = rNodes[i].childNodes[0].firstChild.nodeValue;
o.link = rNodes[i].childNodes[1].firstChild.nodeValue;

mitems[i] = o;
}
else
{
var ro:Object = new Object;
var sub:Array = new Array();
ro.naam = rNodes[i].attributes.name;

var it:Array = rNodes[i].childNodes;

for(var j:Number = 0;j<it.length;j++)
{
var o:Object = new Object();
o.naam = it[j].childNodes[0].firstChild.nodeValue;
o.link = it[j].childNodes[1].firstChild.nodeValue;
sub[j] = o;
}
ro.items = sub;
mitems[i] = ro;
}
}
}
//trace(mitems[1].items[0].naam);
//trace(mitems[1].items[1].naam);
//trace(mitems[1].items[2].naam);
}
//probleem ligt niet in de structuur maar in de menu opbouw
function buildMenu(Void):Void
{
for(var i:Number=0;i<mitems.length;i++)
{
//Als er geen submenu items zijn
if(mitems[i].link != null)
{
mcmenu[i] = _root.attachMovie("menu","menu_"+i,_root.getNextHighestDepth());
mcmenu[i]._y = begin;
mcmenu[i]._x = i*140;
mcmenu[i]._x += 40;
mcmenu[i].background._alpha = startalpha;
mcmenu[i].textfield.menutext.text = mitems[i].naam;

mcmenu[i].onRollOver = function()
{
easeUp(this,null);
}
mcmenu[i].onRollOut = function()
{
easeDown(this,null);
}
mcmenu[i].onRelease = function()
{
getURL(mitems.link,"_parent");
}
}

if(mitems[i].items != null)
{
mcmenu[i] = _root.attachMovie("menu","menu_"+i,_root.getNextHighestDepth());
mcmenu[i]._y = begin;
mcmenu[i]._x = i*140;
mcmenu[i]._x += 40;
mcmenu[i].background._alpha = startalpha;
mcmenu[i].textfield.menutext.text = mitems[i].naam;

tmc[currentSubmenu] = mcmenu[i].createEmptyMovieClip("sub",_root.getNextHighestDepth());
tmc[currentSubmenu]._visible = false;

var l:Number = mitems[i].items.length;

for(var j:Number=0;j<l;j++)
{
mcmenu[i][j] = tmc[currentSubmenu].attachMovie("submenu",mitems[i].items[j].naam,_root.getNextHighestDepth());

trace(mcmenu[i][j]);
mcmenu[i][j]._y -= (j * mcmenu[i][j]._height);
mcmenu[i][j]._y -= mcmenu[i][j]._height;
//mcmenu[i][j]._y = -30;
mcmenu[i][j]._alpha = 40;

mcmenu[i][j]._x = 0;
mcmenu[i][j].textfield.menutext.text = mitems[i].items[j].naam;
curLink = mitems[i].items[j].link;

mcmenu[i][j].onRelease = function()
{
trace(curLink);
getURL(curLink,"_parent");
}
}

/*
tmc[currentSubmenu].onEnterFrame = function()
{
if(intID == null) easeOut(this);
else easeIn(this);
}
*/

mcmenu[i].onRollOver = function()
{
easeUp(this,true);
}
mcmenu[i].onRollOut = function()
{
easeDown(this,true);
}
mcmenu[i].onRelease = function()
{
getURL(mitems.link,"_parent");
}

currentSubmenu++;
}
}
}

function easeIn(mc:MovieClip):Void
{
new mx.transitions.Tween(mc, "_alpha", mx.transitions.easing.Back.easeOut, mc._alpha, 80, 10);
}

function easeOut(mc:MovieClip):Void
{
new mx.transitions.Tween(mc, "_alpha", mx.transitions.easing.Back.easeOut, mc._alpha, 0, 10);
}

function easeUp(mc:MovieClip,sm:Boolean):Void
{
new mx.transitions.Tween(mc.textfield, "_alpha", mx.transitions.easing.Strong.easeIn, mc.textfield._alpha, 80, 5);

if(!sm)
{
new mx.transitions.Tween(mc.background, "_y", mx.transitions.easing.Back.easeOut, mc.background._y, -10, 10);
new mx.transitions.Tween(mc.background, "_alpha", mx.transitions.easing.Strong.easeIn, mc.background._alpha, 100, 6);
}
else
{
mc.sub._visible = true;
mc.sub._alpha = 100;
//new mx.transitions.Tween(submc, "_alpha", mx.transitions.easing.Back.easeOut, submc._alpha, 100, 10);
//if(intID == null) sleep(2.5);
}
}

function easeDown(mc:MovieClip,sm:Boolean):Void
{
new mx.transitions.Tween(mc.textfield, "_alpha", mx.transitions.easing.Strong.easeIn, mc.textfield._alpha, 100, 5);

if(!sm)
{
new mx.transitions.Tween(mc.background, "_y", mx.transitions.easing.Strong.easeIn, mc.background._y, 0, 10);
new mx.transitions.Tween(mc.background, "_alpha", mx.transitions.easing.Strong.easeIn, mc.background._alpha, startalpha, 10);
}
else
{
//mc.sub._visible = false;
//mc.sub._alpha = 0;
//new mx.transitions.Tween(submc, "_alpha", mx.transitions.easing.Back.easeOut, submc._alpha, 0, 10);
}
}

function sleep(seconds)
{
intID = setInterval(function() { clearInterval(intID);intID=null; },seconds*1000);
}


En dit is het xml bestand:


<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<navigation>
<menuitem>
<text>Home</text>
<link>index.php</link>
</menuitem>
<menuitem name="Over mij">
<item>
<text>Ik</text>
<link><![CDATA[index.php?pid=1&sid=0]]></link>
</item>
<item>
<text>CV</text>
<link><![CDATA[index.php?pid=1&sid=1]]></link>
</item>
<item>
<text>Foto's</text>
<link><![CDATA[index.php?pid=1&sid=2]]></link>
</item>
</menuitem>
<menuitem name="Werk">
<item>
<text>Portfolio</text>
<link><![CDATA[index.php?pid=0&sid=0]]></link>
</item>
<item>
<text>Experimenten</text>
<link><![CDATA[index.php?pid=0&sid=1]]></link>
</item>
</menuitem>
<menuitem>
<text>Contact</text>
<link><![CDATA[index.php?pid=2]]></link>
</menuitem>
</navigation>


De fla (http://145.89.191.230/~rubendegooijer/header.fla)

De swf (http://145.89.191.230/~rubendegooijer/header.swf)

Ik hoop dat iemand de moeite wil nemen om te kijken wat er mogelijk aan de hand is. Bedankt!!!!!

Groetjes,

Ruben de Gooijer

mateo)
%Europe/Berlin %845 %2005, 21:18
het gaat om dit regeltje (ik heb het hier al verbeterd):

mcmenu[i][j] = tmc[currentSubmenu].attachMovie("submenu",mitems[i].items[j].naam,tmc[currentSubmenu].getNextHighestDepth());
Je gebruikte _root.getNextHighestDepth() en die verandert niet als je een mc in een andere mc plaatst. De mc's werden dus op dezelfde depth geplaatst.
succes. het betere scriptwerk :)

Ruby
%Europe/Berlin %804 %2005, 20:17
Hahah hartstikke bedankt!!!!! Echt een stomme fout maarja je moet het maar net zien. Top!

Ruby
%Europe/Berlin %752 %2005, 19:03
Hmm nu zit ik met een klein ander probleempje, alles werkt perfect alleen worden de links niet goed toegekend aan de submenu's en gewone menu's.


mcmenu[i].onRelease = function()
{
getURL(mitems.link,"_parent");
}


submenu:

curLink = mitems[i].items[j].link;

mcmenu[i][j].onRelease = function()
{
trace(curLink);
getURL(curLink,"_parent");
}


Het lijkt wel alsof hij niks meer buiten zijn eigen functie scope herkend 8-)

Weet iemand hier een oplossing voor???

Alvast bedankt!

theFlashWizard
%Europe/Berlin %792 %2005, 20:01
wanneer die release gemaakt is heeft die curlink de inhoud van de hoogste.. zet de var in de mc zelf en verwijs naar this.link bijv..

Ruby
%Europe/Berlin %817 %2005, 20:36
Hmm de menu's zonder submenu werken nu wel:


mcmenu[i].link = mitems[i].link;
mcmenu[i].onRelease = function()
{
getURL(this.link,"_parent");
}


Maar die met submenu werken helemaal niet. Als ik op een submenu klik dan komt hij niet eens in de onRelease functie:


forloopje .. i ->

forloopje... j ->

mcmenu[i][j].link = mitems[i].items[j].link;

mcmenu[i][j].onRelease = function()
{
getURL(this.link,"_parent");
}
einde forloopje j
einde forloopje i

theFlashWizard
%Europe/Berlin %818 %2005, 20:38
trace die mcmenu[i][j] eens voordat je er n onRelease aan verbind.. kijken of flash het object(mc/button) wel vind onder die naam..

Ruby
%Europe/Berlin %819 %2005, 20:40
Ja die traced movieclip ;)

theFlashWizard
%Europe/Berlin %853 %2005, 21:29
hij vind ze allemaal bedoel je?
en als je een trace in de onRelease zet, wordt die dan afgespreelt na klikken?

Ruby
%Europe/Berlin %560 %2005, 14:27
Nee dat is het rare :s

theFlashWizard
%Europe/Berlin %625 %2005, 16:00
als je die namen traced krijg je niet vaker dezelfde? zodat de 1e de ander overschrijft?

Ruby
%Europe/Berlin %646 %2005, 16:31
Nee jammer genoeg niet, anders was het probleem opgelost :(

_level0.menu_1.sub.Over mij
_level0.menu_1.sub.CV
_level0.menu_1.sub.Foto's
_level0.menu_2.sub.Portfolio
_level0.menu_2.sub.Experimenten

theFlashWizard
%Europe/Berlin %049 %2005, 02:11
sorry dan weet ik het ff niet meer.. kun je mshn een nieuwe fla plaatsen?
of liefst n klein voorbeeldje van je probleem.. op die manier kom je zo ook nog wellis zelf achter de fout omdat je dan beter overzicht hebt..

Ruby
%Europe/Berlin %511 %2005, 13:16
Ja natuurlijk ;)

http://ruben.havikonline.nl

de fla (http://ruben.havikonline.nl/header.fla)

Ruby
%Europe/Berlin %616 %2005, 15:47
Oke ik heb onderhand uitgevonden wat er nu eigenlijk fout gaat.

Het path naar een submenu ziet er als het volgt uit:
_root.menu_0.sub.submenu_0

Het submenu bevindt zich dus in de menu container. Als ik aan _root.menu_0 een onRelease hang dan vangt hij ook de event af als je op een submenu drukt. Wat opzich volkomen logisch is aangezien submenu_0 een deel is van menu_0, alleen als ik de onRelease hang aan _root.menu_0.sub.submenu_0
dan werkt het niet, het lijkt wel alsof hij alleen onRelease events afvangt van de mc in zijn geheel en niet een mc die zich in de mc bevindt die aan de root is geattached.

Hoe dit valt op te lossen weet ik niet, want het submenu moet wel geattached worden in het menu omdat het anders fout gaat met de onRollover.

Ruby
%Europe/Berlin %695 %2005, 17:42
Niemand??

Ruby
%Europe/Berlin %700 %2005, 17:49
Ik heb het probleem nog een getest in een lege fla en inderdaad hij pakt de onRelease van de mc die in de andere mc niet.

stop();
_root.test.onRelease = function() { trace("outer"); }
_root.test.testje2.onRelease = function() { trace("inner"); }

Hij traced alleen outer, inner vergeet hij 8-)

mateo)
%Europe/Berlin %912 %2005, 22:54
...dan vangt hij ook de event af als je op een submenu drukt. Wat opzich volkomen logisch is...
inderdaad, dat is zoals het hoort. ik denk dat er niks anders op zit dan je structuur enigszins te veranderen. je maakt dan een 'menu mc' aan met een createEmptyMovieClip of een attachMovie, hangt daar vervolgens een 'main menu item' aan met zijn rollover, rollout en release acties, en hangt aan je 'menu mc' OOK een aantal 'sub menu items' (eventueel weer gegroepeerd in 1 'submenu mc' als dat handiger is voor je easing functies) met hun eigen rollover, rollout en release acties. je kan natuurlijk ook je 'main menu item' compleet loskoppelen van je 'sub menu items'.

hoop dat dit enigszins duidelijk is. in ieder geval heb je nog wel wat werk te doen :(