PDA

Просмотр полной версии : Объясните принцип построения динамического меню на FLASH


garold08
15.04.2008, 12:07
Нужно сделать динамическое меню
кнопки располагаются вертикально
Название кнопки и id берется к примеру из XML
После нажатия на кнопку флэш составляет запрос, отправляет его на сервер и ждет ответа

Как реализовать? куда копать? От чего отталкиваться?

alekslitvinenk
15.04.2008, 15:53
Все зависит от конкретной структуры документа XML.
В самом общем виде задача сводиться к обходу этого самого xml в цикле.

Например, если xml будет вида:

<menu>
<item id="1" label="item 1" url="somepage1.html" />
<item id="2" label="item 2" url="somepage2.html" />
<item id="3" label="item 3" url="somepage3.html" />
</menu>

То код должен быть примерно таким:


import mx.utils.Delegate;
var menuXML:XML;
var menuItems: Array = new Array();
menuXML = new XML();
menuXML.ignoreWhite = true;
menuXML.onLoad = Delegate.create(this, menuIsLoaded);
menuXML.load("menu.xml");
function menuIsLoaded():Void {
for(var i = 0; i < menuXML.firstChild.childNodes.length; i++){
var tempItem: MenuItem = new MenuTem();
tempItem._x = 10;
tempItem._y = 10+i*20;
tempItem.setLabel(menuXML.firstChild.childNodes.attributes.label);
tempItem.setAction(menuXML.firstChild.childNodes[I].attributes.url);
menuItems.push(tempItem);
}
}

Далее нужен символ MenuItem, его нужно создать во Flash IDE и происвоить его полю класс MenuItem. Добавить к нему динамическое текстовое поле и в панели своуйств в поле var написать tlabel, и затем собственно написать сам класс MenuItem



import mx.utils.Delegate;

[I]class MenuItem extends MovieClip {

private var tlabel:String;
private var _action:String;



private function onLoad():Void{
this.onRollOver = Delegate.create(this, handleMouseOver);
this.onRollOut = Delegate.create(this, handleMouseOut);
this.onRelease= Delegate.create(this, handleMouseRelease);
}


public function MenuItem(){
}

public function setLabel(inlabel:String):Void{
tlabel = inlabel;
}

public function setAction(inaction:String):Void{
_action = inaction;
}

private function handleMouseOver():Void{
}

private function handleMouseOut():Void{
}

private function handleMouseRelease():Void{
getURL(_action);
}

}




Вроде так будет работать :)

Ведьмак
15.04.2008, 19:38
как-то делал такое меню с бесконечной вложенностью.. чуть не взбесился.. рекурсия в такой транс вгоняла ))

Denis Davidov
11.05.2008, 04:11
у меня какой-то хитрый глюк, в отдельном фаиле .as прописал класс MenuItem,
но при компиляции выдает ошибку: Class may be only defined in external Action Script 2.0 script. В проекте стоит AS2 в Publish...
что это такое может быть??!!

Заранее спасибо за советы...
з.ы. у меня CS3

Denis Davidov
11.05.2008, 13:40
нашел косяк, я дополнитлено пыталса про-include'ить .as фаил.
з.ы. в коде есть пара опечаток: attrubutes -> attributes
а так-же вроде .x -> ._x

Psycho Tiger
11.05.2008, 15:08
Ну и всякие там

var tempItem: MenuItem = MenuItem();
Удивительно, что этот код был написан без компиляции... респект :)

alekslitvinenk
11.05.2008, 16:50
Сорри, за оЧепятки
Код действительно не проверял: просто побыстрому все описал, чтобы суть изложить :)

Denis Davidov
11.05.2008, 17:25
Что-то у мен все равно не работает... хм :(
никаких ошибок при компиляции...
вроде все проще простого, скорее всего где-то в настройках флеша косяк,
плиз, посмотрите ктонибудь исходник и .as
практически сделал copy-paste, должно работать....

Спасибо

Denis Davidov
14.05.2008, 14:23
Хм, 5 просмотров и ни одного ответа :)))

iNils
14.05.2008, 14:31
Да хоть тысяча, вам никто не обязан отвечать.
Плюс за сообщение без смысла.