Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как Правильно обратиться к мувиклипу на сцене (http://www.flasher.ru/forum/showthread.php?t=175394)

lovik 16.02.2012 01:27

Как Правильно обратиться к мувиклипу на сцене
 
Доброго дня суток
Столкнулся с такой проблемой, На основной сцене есть мувиклип.
В конце анимации появляется кнопка.
Вопрос Как с основной сцены обратится к этой кнопке ?? ибо на мои попытки он отвечает матом. ) а пытаю я, следующим образом
Код AS3:

mc_1.Btn_1

mc_1 лежит на основной сцене, основная сцена 1 кадр, в mc_1-70

ЗлОй ПрОграММер 16.02.2012 01:47

1) Пишите код в классах, если пишите не в них (так намного удобнее и лучше, поверьте)
2) Чтобы матершины на ваши попытки не было) нужно обращаться к кнопке, только тогда когда она появиться, а именно в конце анимации, как это сделать решайте сами, можно поставить условие

Srednas 16.02.2012 10:06

Цитата:

Сообщение от lovik (Сообщение 1063259)
Вопрос Как с основной сцены обратится к этой кнопке ?? ибо на мои попытки он отвечает матом. )

Цитата:

Сообщение от ЗлОй ПрОграММер (Сообщение 1063263)
1)нужно обращаться к кнопке, только тогда когда она появиться

А если кнопку добавить на сцену с самого начала клипа, но сделать её прозрачность равной нулю?
Затем в нужном кадре увеличить до 100%. Память будет занимать, конечно, но, думаю, не критично.

lovik 16.02.2012 10:40

Перенес я все это в классы.
Но почему то не хочет срабатывать лисенер и вызывать функцию, выглядит это примерно так
Код AS3:

package 
{
 
        import flash.display.MovieClip;
        import flash.events.MouseEvent;
 
 
        public class myclass extends MovieClip
        {
 
 
                public function myclass()
                {
 
                        menu_bar.btn_1.addEventListener(MouseEvent.MOUSE_OVER, anim_play);
                        menu_bar.btn_1.addEventListener(MouseEvent.MOUSE_OUT, anim_play);
 
                        function anim_play (e:MouseEvent):void
                        {
                                trace(e);
                                menu_bar.btn_mc.play();
                        }


ЗлОй ПрОграММер 16.02.2012 12:30

в классе тоже придётся обращаться к кнопке когда она появиться

adobe flash у меня сейчас не установлен так что за правильность ручаться не могу, не проверял, но примерно так должно быть
Код AS3:

mc_1.addEventListener(Event.ENTER_FRAME, enterFrame);
private function enterFrame (e: Event):void
{
        if (mc_1.currentFrame == mc_1.totalFrames)
        {
            mc_1.btn_1.addEventListener(MouseEvent.MOUSE_OVER, anim_play); //если кнопка лежит в мувиклипе mc_1
            mc_1.btn_1.play();
        }
}
 
private function anim_play (e:MouseEvent):void
{
        trace(e);
        mc_1.btn_1.play();
}

Цитата:

А если кнопку добавить на сцену с самого начала клипа, но сделать её прозрачность равной нулю?
Затем в нужном кадре увеличить до 100%. Память будет занимать, конечно, но, думаю, не критично.
Можно и так но лучше кнопку добавлять в самом классе
Код AS3:

addChild(...);

как только mc1 достигнет последнего кадра
Код AS3:

if (mc_1.currentFrame == mc_1.totalFrames) ...


lovik 16.02.2012 12:34

Спс огромный.
Я в АС дуб бубом ((( .
Подскажите плиз Как правильно сделать проверку на какую кнопку навел мышкой ? чтоб не плодить 150 функций.

ЗлОй ПрОграММер 16.02.2012 13:38

каждой кнопке задавайте имя name = "button1"; и повесьте слушатель на каждую кнопку
потом в обработчике события можно узнать имя кнопки e.target.name
кстати можно и так анимацию кнопки запустить e.target.play();

lovik 16.02.2012 13:49

О великий гурру ))) Бью челом и низко кланяюсь ))

dimarik 16.02.2012 14:13

Код AS3:

 
const _buttonOne:SimpleButton = new SimpleButton();
const _buttonTwo:SimpleButton = new SimpleButton();
 
super.addChild(this._buttonOne);
super.addChild(this._buttonTwo);
 
super.addEventListener(MouseEvent.CLICK, this.handler_click);
 
function handler_click(event:Event):void {
    switch (event.target) {
        case this._buttonOne:
            // do button one action
            break;
 
        case this._buttonTwo:
            // do button two action
            break;
    }
}


gloomyBrain 16.02.2012 14:40

Можно switch-case реализовать побыстрее (правда, к теме это уже мало относится):

Код AS3:

const _buttonOne:SimpleButton = new SimpleButton();
const _buttonTwo:SimpleButton = new SimpleButton();
const _handlers:Dictionary = new Dictionary();
 
super.addChild(this._buttonOne);
super.addChild(this._buttonTwo);
 
_handlers[this._buttonOne] = this.handler_buttonOne;
_handlers[this._buttonTwo] = this.handler_buttonTwo;
 
super.addEventListener(MouseEvent.CLICK, this.handler_click);
 
function handler_click(event:Event):void {
    if (event.target in this._handlers) (this._handlers[event.target] as Function).call(null);
}


Inet_PC 16.02.2012 14:49

А потом нам потребуется еще что-то сделать, если это кнопка 1, и придется добавить условие. И спрашивается нахрена так извращаться? Создавать целый Dictionary ради 5 кнопок? Эт как на охоте по муравьям из базуки стрелять, имхо и код dimarik-а гораздо читабельней.

gloomyBrain 16.02.2012 14:55

Хм. А вы знаете, что Object - это такой же HashMap, как и Dictionary, только принимающий исключительно строковые ключи? Спрашивается - зачем так извращаться и создавать целый Object, когда можно обойтись... А вот и нельзя обойтись =) У нас тут все Object.

На счет условия - оно должно быть обработано в хэндлере кнопки 1.

Смысл поста сводится к оптимизации switch-case и мало относится к теме. О чем, собственно я и написал.

Что касается извращений - я считаю, что это оптимизация. Не везде применимая, но все же.

Inet_PC 16.02.2012 15:19

Цитата:

Хм. А вы знаете, что Object - это такой же HashMap
Знаю, но вроде, не совсем все так.
Пример:
Код AS3:

var a:Array = [1,2];
trace(getSize(a));//80
a.push(4);
trace(getSize(a));//80

и
Код AS3:

var a:Array = [1,2];
trace(getSize(a));//80
a[8] = 4;
trace(getSize(a));//112

Заметили разницу? В первом случае Object, а во втором Object со строковыми ключами.
Ну и вот:
Код AS3:

import flash.display.Sprite;
 
internal class C extends Sprite{}
//...
var c:C = new C();
trace(getSize(c));//80

и
Код AS3:

import flash.display.Sprite;
 
dynamic internal class C extends Sprite{}
 
//...
var c:C = new C();
trace(getSize(c));//420

Я думаю разница заметна. А все потому, что в flash бывает два объекта, один из которых динамический:
Цитата:

как и Dictionary, только принимающий исключительно строковые ключи?
Обычный объект иногда может стать динамический (обратно вроде нет). Таким образом это:
Цитата:

Object - это такой же HashMap, как и Dictionary, только принимающий исключительно строковые ключи?
уже не совсем так. Object не всегда Dictionary со строковыми ключами.
Цитата:

На счет условия - оно должно быть обработано в хэндлере кнопки 1.
Да, может, сколько угодно быть случаев, когда нужно что-то еще сделать.

Цитата:

Что касается извращений - я считаю, что это оптимизация. Не везде применимая, но все же.
Заменить свитч на целый объект, жрущий память (и не известно, что еще делающий внутри) нынче называется оптимизацией?

P.S. Поправьте меня, если я ошибаюсь.

dimarik 16.02.2012 15:42

Цитата:

Сообщение от gloomyBrain (Сообщение 1063353)
Можно switch-case реализовать побыстрее (правда, к теме это уже мало относится):

Побыстрее? На 1400-ом case, да, switch уже проигрывает in. Для 100 проверок, case быстрее в 20 раз, чем in над Dictionary.

Красивее, да. Мне очень нравится.

gloomyBrain 16.02.2012 15:52

Ну смотри - switch-case последовательно проходит все варианты. Скорость выбора варианта в худшем случае ~O(n), где n - число вариантов. В случае с Dictionary скорость доступа к данным всегда ~O(1).
Память - да, 420 байт это просто ужасно. Особенно для длинного switch-case.

Цитата:

Обычный объект иногда может стать динамический (обратно вроде нет)
Вас непонятно. Object - динамический класс. Как он может кем-то стать? Вероятно, Вы хотели сказать, что динамичность не наследуется. И так как Object динамический, то он является HashMap<String, *>.

dimarik 16.02.2012 15:58

Да, только in не нужен. foo[bar] работает как ~O(1).

gloomyBrain 16.02.2012 16:00

Да, по производительности теория разошлась с практикой =) Ну чего я могу сказать, Adobe опять молодцы.

in можно убрать без проблем:
Код AS3:

var func:Function = _handlers[event.target] as Function;
if (func) func.call(null);


dimarik 16.02.2012 16:14

И еще немного )
Код AS3:

(func = _handlers[event.target]) ? func.call(null) : null;

Код AS3:

(func = _handlers[event.target]) ? func.apply(null, arguments) : null;


Inet_PC 16.02.2012 16:15

Цитата:

Вероятно, Вы хотели сказать, что динамичность не наследуется.
Это понятно. Я хотел сказать, что объект может перетекать из статического состояния в динамическое. Для одних (Array например) это можно сделать в run-time, для других только заноследовавшись с модификатором dynamic. А вот обратное вряд-ли возможно.

dimarik 16.02.2012 16:17

Цитата:

Сообщение от Inet_PC (Сообщение 1063383)
объект может перетекать из статического состояния в динамическое

Пожалуй, возьму себе в цитаты.

Inet_PC 16.02.2012 16:17

Т.о. объект это нечто "статико-динамическое", и пока он статичен, он потребляет меньше ресурсов. И он не HashMap<String, *>.


Часовой пояс GMT +4, время: 23:45.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.