Форум 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=181373)

dkart01 21.06.2012 19:37

Создать кнопки в цикле и присвоить им функции
 
Здравствуйте, дорогие модераторы и участники.

Подскажите, как можно создать кнопки посредством кода (точнее на сцене клипы есть, нужно прописать им действия).

Есть 2 функции, мувиклипы на сцене ввиде картинок, и есть на "ручнике" созданные 25 действий для кнопок

Код AS1/AS2:

// Функция раз - подсвечивает этаж по наведению на кнопку
function MykOnRollover(counter_et) {
          _root["cam2"]["e"+counter_et]._alpha = _root["cam2"]["l"+counter_et]._alpha = max_transparancy;
 
}
 
// Функция два - убирает подсветку
function MykOnRollout(counter_et) {
          _root["cam2"]["e"+counter_et]._alpha = _root["cam2"]["l"+counter_et]._alpha=min_transparancy;
 
}
 
// Кнопка
_root.cam2.e3.onRollOver=function() {MykOnRollover(3);}
_root.cam2.e3.onRollOut=function() {MykOnRollout(3);}
 
_root.cam2.e4.onRollOver=function() {MykOnRollover(4);}
_root.cam2.e4.onRollOut=function() {MykOnRollout(4);}
 
// и так далее до e=25

Как можно сократить код, который идет между "// Кнопка " и "// и так далее "

Пробовал в цикле присваивать, но не работает:
Код AS1/AS2:

for (var c2=2; c2<=4; c2++) {
        trace(c2);
        _root.cam2["e"+c2].onRollOver=function() {MykOnRollover(c2);}
        _root.cam2["e"+c2].onRollOut=function() {MykOnRollout(c2);}
 
}

В итоге присваеватся только последняя функция.

mooncar 21.06.2012 20:05

Да, так происходит, потому что в конце цикла с2 принимает последнее значение и оно же везде и будет использоваться.
Вот решение:

Код AS1/AS2:

for (var c2 = 2; c2 <= 25; c2++) 
{
        var btn:MovieClip = _root.cam2["e" + c2]; //ссылка на кнопку для удобства записи
        btn.num = c2; //"запоминаем" номер внутри  кнопки
        //функции на события назначаем по ссылке на именованные функции:
        btn.onRollOver = mykOnRollover;
        btn.onRollOut = mykOnRollout;
}
 
function mykOnRollover()
{
        var num:Number = this.num; //"вспоминаем" номер
        _root.cam2["e" + num]._alpha = _root["cam2"]["l" + num]._alpha = max_transparancy;
}
 
function mykOnRollout()
{
        var num:Number = this.num; //"вспоминаем" номер
        _root.cam2["e" + num]._alpha = _root.cam2["l" + num]._alpha = min_transparancy;
}

1. Не склеивайте операторы, ставьте пробелы. Это не круто на самом деле. :) Только читать и править код неудобно. Пользы никакой - компилятор потом все равно сделает как ему удобнее.
2. Названия функций не делайте с заглавной, с заглавной обычно идут названия классов.

И еще, если я верно определил, то внутри функции при задании действий на кнопку вы опять ссылаетесь на нее саму. Поэтому можно записать так, с использованием относительных путей:
Код AS1/AS2:

this._alpha = this._parent["l" + num]._alpha = max_transparancy;

this._parent - в данном случае это ссылка на родительский мувик _root.cam2 из мувика _root.cam2["e" + num]

Код функций станет гибче и не будет зависеть от имени.

dkart01 22.06.2012 14:30

1) Есть!)
2) Есть! )
3) Верно. Супер!

Всё работает. Огромное спасибо.

dkart01 26.06.2012 15:04

Кратко говоря, в строке
Код AS1/AS2:

var num:Number = this.num; //"вспоминаем" номер

this можно еще чем то другим заменить (для лучшего понимания)?

Длинно говоря, правильно ли понимаю, что в данном случае:
Код AS1/AS2:

var num:Number = this.num; //"вспоминаем" номер

Мы можем написать this потому что программа "думает" примерно следующим образом. Выделяем и концентрируемся на объекте btn при действии onRollOver или onRollOut и так как программа работает с объектом btn и сфокусирована на нём, мы применяем this и свойство this.num будет относится к btn.

И другим близким по эффективности способом задачу по присвоению номера внутри функции mykOnRollover() не решить.

Hauts 26.06.2012 15:16

this является ссылкой на текущий объект выполнения кода. Если просто в первом кадре основной временной шкалы написать trace(this), то this в данном случае будет указывать на _root. Если прописать this в обработчике события (в функции на onRollOver, например), то this будет указывать на объект, сгенерировавший событие.

dkart01 27.06.2012 12:09

Благодарю.

Котяра 27.06.2012 13:17

как вариант.
Код AS1/AS2:

for (var i = 2; i <= 25; i++) {
        var btn:MovieClip = _root.cam2["e" + i]; //ссылка на кнопку для удобства записи
        btn.level = _root.cam2["l" + i] //"запоминаем" связанный этаж внутри  кнопки
        //функции на события назначаем по ссылке на именованные функции:
        btn.onRollOver = mykOnRollover;
        btn.onRollOut = mykOnRollout;
}
 
function mykOnRollover() {
        this._alpha = this.level._alpha = max_transparancy;
}
 
function mykOnRollout() {
        this._alpha = this.level._alpha = min_transparancy;
}

а ещё лучше сделать класс для кнопки (ну и для этажей тоже)

Код AS1/AS2:

class MyOkButton extends MovieClip{
 public var level:LevelMovieClip;
 public var maxAlpha:Number = 100;
 public var minAlpha:Number = 50;
 
 public function onRollover():Void {
        this._alpha = this.level._alpha = maxAlpha ;
 }
 
 public function onRollout():Void {
        this._alpha = this.level._alpha = minAlpha;
 }
}

затем при инстанцировании кнопок просто назначайте им level
хотя бы так ():
Код AS1/AS2:

for (var i = 2; i <= 25; i++) {
        var btn:MyOkButton  = _root.cam2["e" + i]; //ссылка на кнопку для удобства записи
        btn.level = _root.cam2["l" + i] //"запоминаем" связанный этаж внутри  кнопки
}

хотя мне этот код не нравится, я бы сделал отдельный класс для сущности _root.cam2 и этот код прописал там

Код AS1/AS2:

class Cam extends MovieClip {
 
// в онлоаде, конструкторе или в ините
 public function onLoad():Void {
    for (var i = 2; i <= 25; i++) {
            var btn:MyOkButton  = this["e" + i]; //ссылка на кнопку для удобства записи
            btn.level = this["l" + i] //"запоминаем" связанный этаж внутри  кнопки
    }
  }
 
}

На as2 тоже можно красиво писать.


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

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