Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.06.2012, 19:37
dkart01 вне форума Посмотреть профиль Отправить личное сообщение для dkart01 Найти все сообщения от dkart01
  № 1  
Ответить с цитированием
dkart01

Регистрация: Apr 2012
Сообщений: 80
По умолчанию Создать кнопки в цикле и присвоить им функции

Здравствуйте, дорогие модераторы и участники.

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

Есть 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);}
 
}
В итоге присваеватся только последняя функция.

Старый 21.06.2012, 20:05
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 2  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Да, так происходит, потому что в конце цикла с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]

Код функций станет гибче и не будет зависеть от имени.
__________________
Идите первым!


Последний раз редактировалось mooncar; 21.06.2012 в 20:30.
Старый 22.06.2012, 14:30
dkart01 вне форума Посмотреть профиль Отправить личное сообщение для dkart01 Найти все сообщения от dkart01
  № 3  
Ответить с цитированием
dkart01

Регистрация: Apr 2012
Сообщений: 80
1) Есть!)
2) Есть! )
3) Верно. Супер!

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

Старый 26.06.2012, 15:04
dkart01 вне форума Посмотреть профиль Отправить личное сообщение для dkart01 Найти все сообщения от dkart01
  № 4  
Ответить с цитированием
dkart01

Регистрация: Apr 2012
Сообщений: 80
Кратко говоря, в строке
Код 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() не решить.

Старый 26.06.2012, 15:16
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 5  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
this является ссылкой на текущий объект выполнения кода. Если просто в первом кадре основной временной шкалы написать trace(this), то this в данном случае будет указывать на _root. Если прописать this в обработчике события (в функции на onRollOver, например), то this будет указывать на объект, сгенерировавший событие.
__________________
hauts.ru

Старый 27.06.2012, 12:09
dkart01 вне форума Посмотреть профиль Отправить личное сообщение для dkart01 Найти все сообщения от dkart01
  № 6  
Ответить с цитированием
dkart01

Регистрация: Apr 2012
Сообщений: 80
Благодарю.

Старый 27.06.2012, 13:17
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 7  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
как вариант.
Код 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 тоже можно красиво писать.
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 27.06.2012 в 13:28.
Создать новую тему Ответ Часовой пояс GMT +4, время: 16:26.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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