Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Как сократить (универсализировать) код? (http://www.flasher.ru/forum/showthread.php?t=83174)

xenOnn 28.07.2006 21:45

Как сократить (универсализировать) код?
 
есть такой код:

Код:

item1.onRelease = function () {
        story.load("item1.xml");
        state.text = "item1";
        _root.big.bpic.loadMovie("item1-01.jpg");
        _root.spic.loadMovie("item1-02.jpg");
};

Объектов item (кнопок), при нажатии которых запускается данный код, около 8.

Как сделать, чтоб не повторять данный код 8 раз подряд ( только с разными item ессно - item1, item2 и т.д.), а написать код так, чтоб при нажатии item1 - подгружался item1.xml, при нажатии item2 - погружался item2.xml и т.д.?
вообщем как сделать универсально всё чотб код не увеличивался при увеличении количества item'ов? А-то если объектов будет штук 100, то код вообще километровый получится, да и редактировать его будет сложно...

xenOnn 29.07.2006 15:57

?!!
 
ну неужели никго не знает???
ведь по-идее просто всё должно быть
нужно как-то ловить имя кнопки которая нажимается...

Что такое хорошо? 29.07.2006 16:06

Код:

for (i=0; i<10; i++) {
        this["item"+i].onRelease = function() {
                story.load("item"+i+".xml");
                state.text = "item1";
                _root.big.bpic.loadMovie("item"+i+"-01.jpg");
                _root.spic.loadMovie("item"+i+"-02.jpg");
        };
}

и, возможно, всегда, как только у тебя появляется мысль в стиле "если объектов будет штук 100", всмоминай о циклах FOR или WHILE - и перебирай себе свои сотни и тысячи. ))) Удачи!

xenOnn 29.07.2006 18:38

Сенкс, правда циклы же есть...;) вот я пень..

А как быть если имена инстансов не под номерами идут, а с произвольными именами?
Можно наверное как-то через промежуточную переменную
что писать не так:

this["item"+i].onRelease = function() ...

а что-то вроде этого:

this.X.onRelease = function() ...

где X приравнивался к имени инстанса на который в данный момент нажали

Как такое можно реализовать?


===================

И ещё один вопрос уже по другой теме: как можно ловить имена инстансов на которые нажимают иих координаты тоже?

xenOnn 29.07.2006 18:58

так, я поспешил
что-то не работает Ваш код

вот что у меня получается:
Код:

for (i=0; i<8; i++) {
        this["item"+i].onRelease = function() {
                state.text = "item"+i;

        };
}

при нажатии на любую кнопку - в текстовом поле появляется одна и таже надпись - item8
ну ессно... цикл проходит от начала до конца и i становится равной 8, всегда...

Как быть-то?

sergMX 29.07.2006 19:20

можно так:

Код:


for (i=0; i<8; i++) {
        this["item"+i].X = i;
        this["item"+i].onRelease = function() {
                state.text = "item"+this.X;
        };
}


iNils 29.07.2006 19:30

sergMX и xenOnn, вам устное предупрежедние за не использование тегов для кода. Если не исправите сами, то предупреждение будет не устным. Время пошло.

xenOnn 29.07.2006 19:45

о, сенкс э лот, всё работает
Х - промежуточная переменная так я понимаю, непонимаю почему без неё не работает?...

Вопрос второй (пока был без ответа):

а как быть если имена инстансов не item1, item2...
а что-то вроде этого: item1, button2, circlew
как в тамом случае быть? тут цикл-то не поможет...

xenOnn 29.07.2006 19:56

может наверное через массив то как-то сделать...
но хочется как-то проще
чтоб AS ловил имя нажатой кнопки
т.е., к примеру, если нажата кнопка с именем green - в текстовое поле вписывался текст "green" и подгружалась картинка с именем green.jpg;
если нажата кнопка с именем bigtman - в текстовое поле вписывался текст "bigman" и подгружалась картинка с именем bigman.jpg и т.д.

Так такое можно сделать?

Что такое хорошо? 29.07.2006 20:06

Код:

green.onRelease=function  () {
        trace(this._name);

}


ir73 29.07.2006 20:06

Код:

myButton.onRelease = function () {
    trace(this._name);
}


ir73 29.07.2006 20:06

ого : )

Что такое хорошо? 29.07.2006 20:10

Цитата:

Сообщение от ir73
ого : )

не))) ну тут по другому кнопка названа :rolleyes:

xenOnn
Надеюсь, что получив имя кнопки (или мувика), ты сможешь сам поместить его в текстовое поле или же загрузить одноименный клип. Иначе зачем это все.

xenOnn 29.07.2006 20:49

ясно
но кнопок таких много, скажем к примеру 100
не повторять же этот код 100 раз подряд
как сделать так как писал sergMX, но если имена объектов будут иметь совершенно разные имена?

Вот что получается:
Код:

for (i=0; i<9; i++) {
this["item"+i].X = i;
this["item"+i].onRelease = function() {
state.text = this._name;
};
}

Все работает если имена кнопок имеют простые имена: item1, item2, item3....
А вот если имена кнопок будут: green, red, small, big, square, rect...
То как быть тут?

xenOnn 29.07.2006 21:04

т.е. как мне вписать сыбытие state.text = this._name; в onRelease чтоб всё работало, если имена кнопок имеют произвольные имена?

wvxvw 30.07.2006 04:29

Цитата:

Сообщение от xenOnn
а как быть если имена инстансов не item1, item2...
а что-то вроде этого: item1, button2, circlew
как в тамом случае быть? тут цикл-то не поможет...

3 варианта:
- внести все названия в массив и выбирать по индексу.
- сделать вызываемую функцию методом мувиклипа\кнопки, зависит, что используется.
- создать свой класс с набором нужных функций и использовать на месте кнопок\мувиков объекты своего класса.
Последний - самый правильный и универсальный.

xenOnn 30.07.2006 23:56

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

state.text = this._name

wvxvw 31.07.2006 08:05

Код для флешки, создает инстанс кнопки вашего класса и текстовое поле, куда нужно выводить инфу о нажатой кнопке.
Код:

var _l1:MyBtn = new MyBtn("cust_btn", this);
_root.createTextField("state_txt", 100, 0, 0, 100, 20);
with(state_txt){
        text = "status";
}

Код для MyBtn.as (поместить в ту же папку с флешкой). Класс с уже прописанной функцией онРелиз.
Код:

class MyBtn extends MovieClip {
        public var ID:String = ""; //как будет называться наш инстанс
        public var innerMC:MovieClip; //куда его ставить
        private var inner_MC:MovieClip; //внутренняя переменная которая и содержит всю графику нашей "кнопки"
        function MyBtn(ID:String, innerMC:MovieClip) {
                inner_MC = innerMC.createEmptyMovieClip("clp"+ID, this.getNextHighestDepth());
                inner_MC.beginFill(0x00ff00, 100); //пример програмного рисования - создания кнопки
                inner_MC.moveTo(20, 20);
                inner_MC.lineTo(20, 120);
                inner_MC.lineTo(120, 120);
                inner_MC.lineTo(120, 20);
                inner_MC.lineTo(20, 20);
                inner_MC.endFill();
                inner_MC.ID = ID;
                inner_MC.attachMovie(ID, ID+"_mc", this.getNextHighestDepth(), {_x:40, _y:40});//пример работы аттача
                inner_MC.onRelease = function() {//собсна, нужная ф-ция
                        _root.state_txt.text = this.ID;
                };
        }
        public function getID():String {
                return ID;
        }
        public function setID(arg:String):Void {
                ID = arg;
        }
}

* чтобы все работало нужно в библиотеке создать клип с идентификатором экспорта "cust_btn".
По сути делает то же самое что и аттачМуви, просто сразу же добавляет функцию в онРелиз...

xenOnn 31.07.2006 16:44

Совершенно не разобрался в коде, но спасибо:)

wvxvw 31.07.2006 18:31

http://www.newgrounds.com/bbs/topic.php?id=339781
^__тут можно почитать (английский вроде не сложный)

Код:

CustBtn = new Object();
CustBtn.prototype = new MovieClip();
CustBtn.prototype.onRelease = function() {
        _root._l2.text = this._name;
};
var _l1:MovieClip = _root.createEmptyMovieClip("test_mc", 0);
_l1.beginFill(0x00ff00, 100);
_l1.moveTo(20, 20);
_l1.lineTo(20, 120);
_l1.lineTo(120, 120);
_l1.lineTo(120, 20);
_l1.lineTo(20, 20);
_l1.endFill();
_l1.__proto__ = CustBtn.prototype;
var _l3:MovieClip = _root.createEmptyMovieClip("test1_mc", 20);
_l3.beginFill(0x00ffff, 100);
_l3.moveTo(170, 170);
_l3.lineTo(170, 270);
_l3.lineTo(270, 270);
_l3.lineTo(270, 170);
_l3.lineTo(170, 170);
_l3.endFill();
_l3.__proto__ = CustBtn.prototype;
var _l2:TextField = _root.createTextField("status_txt", 10, 300, 300, 200, 20);
with (status_txt) {
        text = "status";
}

А это другой вариант, с определением класса не во внешнем файле, а в самой флешке (нет принципиальной разницы, но первый способ более практичный для больших проектов)


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

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