PDA

Просмотр полной версии : Меню программным способом


ndiezel
24.04.2013, 01:39
Всем привет.

Неплохо знаю AS2, решил вот перейти наконец-то на AS3.
Способом перехода выбрал игрушку. Делаю её сейчас и утыкаюсь в непонимание того, как в AS3 всё устроено. Очень сильно отличается от AS2.

В общем, вопрос, скорее всего, банальный и глупый и сто раз обсуждался... Но в любом случае буду благодарен тем, кто поможет :)

Есть главный файл .fla
В нём кода вообще нет. Используется как библиотека мувиков. Класс у него, соответственно Main

В нём, уже идёт вывод главного меню:

var mm_mov:MmenuMov = new MmenuMov();
addChild(mm_mov);


MmenuMov - класс мувика, который содержит бекграунд меню. И добавляет на этот бекграунд уже кнопки.
Вот его код:

package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.display.Sprite;
import flash.events.MouseEvent;


public class MmenuMov extends MovieClip
{

public function MmenuMov()
{
var b_tutorial:Sprite = new mm_bg_planet(1);
addChild(b_tutorial);
b_tutorial.addEventListener(MouseEvent.CLICK,run_tutorial);
}
}
}


run_tutorial - функция, которая при нажатии на кнопку меню убирает с экрана мувик менюшки и открывает уровень туторила.
mm_bg_planet - класс спрайта, в котором находятся кнопки.
В нём прописывается расположение кнопок, их ширина, длина и т.д. В общем - к вопросу не относится.

Вопрос же в том, как правильно реализовать, чтоб при нажатии на кнопку - убирался с экрана мувиклип mm_mov?
Как одно из правил "правильного программирования" что ребёнок убивать родителя не должен - я уже принял (хоть так и не понял: почему?)
Но мне тогда в принципе не понятно как нужно писать код, чтоб ни родителя не убивать, ни "самого себя"?

Потому что если я, допустим, в MmenuMov пропишу функцию run_tutorial - то это будет самоубийство.
А если в Main, то тоже не правильно, да и я без понятия как туда засунуть EventListener для кнопки.

Как-то в AS3 мне вообще не понятно как передавать данные из одной функции в другую. В AS2 было просто - пишешь переменную за функцией - всё, она общая. А тут и указываешь: public, а всё равно - хрен к ней из другого класса обратишься.
Да даже переменные из одной функции в другую одного класса передать как-то не очень получается.

В общем - растолкуйте, люди добрые.
Буду очень благодарен.

chamele0n
24.04.2013, 01:57
както так

var mm_mov:MmenuMov = new MmenuMov();
mm_mov.addEventListener(Event.CLOSE, onMenuClose);
addChild(mm_mov);

function onMenuClose(e:Event) : void {
removeChild(mm_mov);
}



package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.display.Sprite;
import flash.events.MouseEvent;


public class MmenuMov extends MovieClip
{

public function MmenuMov()
{
var b_tutorial:Sprite = new mm_bg_planet(1);
addChild(b_tutorial);
b_tutorial.addEventListener(MouseEvent.CLICK,run_tutorial);
}

protected function run_tutorial(e:MouseEvent) : void {
// тут что-нибуть делаем
dispatchEvent(new Event(Event.CLOSE));
}
}
}

поправил

Добавлено через 9 минут
или такой вариант


var mm_mov:MmenuMov = new MmenuMov();
mm_mov.b_tutorial.addEventListener(MouseEvent.CLICK, onMenuClose);
addChild(mm_mov);

function onMenuClose(e:MouseEvent) : void {
removeChild(mm_mov);
}



package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.display.Sprite;
import flash.events.MouseEvent;


public class MmenuMov extends MovieClip
{

public var b_tutorial:Sprite;
public function MmenuMov()
{
b_tutorial = new mm_bg_planet(1);
addChild(b_tutorial);
}
}
}

ndiezel
24.04.2013, 15:43
Последний вариант вставил - сработало, спасибо.

Ещё один вопрос. При закрытии окна менюшки достаточно команды removeChild(mm_mov); ?
Или нужно ещё и mm_mov=null ?
Т.е. удалять этот мувик и из памяти?

chamele0n
24.04.2013, 15:52
почитай (http://help.adobe.com/ru_RU/as3/mobile/WS4bebcd66a74275c3-576ba64d124318d7189-7ffc.html)

ndiezel
24.04.2013, 20:15
почитай (http://help.adobe.com/ru_RU/as3/mobile/WS4bebcd66a74275c3-576ba64d124318d7189-7ffc.html)

Почитал.
В меру полезная статья, на мой взгляд. Про gc и null я уже читал.

chamele0n, лучше бы вы написали: "Да, удаляй" или "Нет, не удаляй, потому что..."

elder_Nosferatu
25.04.2013, 09:04
На счет {удаляй}/{не удаляй}:
Если какой нибуть объект используется единожды, тогда после использования его нужно удалить (отписать от всех событий, на которые он подписан и обNULLить все ссылки на него). Если же он может быть использован несколько раз, тогда стоит решить, что предпочтительнее - оставить его в памяти для переиспользования, или же его проще убить и по необходимости создать свежий.

caseyryan
25.04.2013, 10:08
Т.е. удалять этот мувик и из памяти?
В ас3 вообще не возможно удалить объект из памяти самостоятельно.

В данном случае достаточно removeChild, потому что для последующего добавления той же менюшки, достаточно будет использовать addChild. Создавать ее повторно нет смысла, меню ведь и подразумевает многоразовое использование

ndiezel
25.04.2013, 15:15
caseyryan, благодарю за ответ.
Тему можно закрывать.