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

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

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

Регистрация: Oct 2010
Адрес: Свердловск
Сообщений: 77
По умолчанию База данных информации на кадре

Вот мне всегда было интересно, например у меня есть много дублированных МС на каждом код, дак вот на каждый клип при наведении нужно разное описание в "самодельном" всплывающем окне. Я это выполнял с помощью присвоения определеного id (он являетя в принципе просто именем МС) при создании, а затем, при наведении, по этому id из "базы" на клипе брал всю нужную инфу:

Код AS1/AS2:
function skillBASE(id) {
	switch (id) {
	case "skill1" :
		_root.basee = "магия";
		_root.skillname = "Комета";
		_root.sklv = 1;
		_root.ifTwoElems = "+";
		_root.element1 = "огонь";
		_root.element2 = "земля";
		_root.description = "блаблабла";
		_root.dmgbase = 100;
		_root.elemDmg1 = 30;
		_root.elemDmg2 = 20;
		_root.mpcost = 10;
		break;
	case "skill2" :
		_root.basee = "магия";
		_root.skillname = "Инферно";
		_root.sklv = 1;
		_root.ifTwoElems = "+";
		_root.element1 = "огонь";
		_root.element2 = "воздух";
		_root.description = "блаблабла";
		_root.dmgbase = 80;
		_root.elemDmg1 = 30;
		_root.elemDmg2 = 30;
		_root.mpcost = 15;
		break;
 
                     ETC...
Вот в чем вопрос, есть ли какой нибудь еще способо это осуществить еще проще? (особенно в плане хранения такого огромного количества информации в case - около 70)

p.s насчет root знаю что не совсем правильно, просто пытался)


Последний раз редактировалось Dalass13; 05.11.2010 в 06:53.
Старый 05.11.2010, 10:24
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 2  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Вариант 1. Храните эту инфу о мувике в самом мувике:

Код AS1/AS2:
skill1.basee = 'магия';
skill1.skillname = 'Комета';
 
skill2.basee = 'магия';
skill2.skillname = 'Инферно';
Что может быть проще? И очень удобно обращаться потом будет. То есть если по логике кода тронули мувик, то все его свойства прямо в нем, сразу и обратились:
Код AS1/AS2:
var skillsTotal:Number = 50;
for (i = 1; i <= skillsTotal; i++) //назначаем обработчики
{
   var mc:MovieClip =  _root['skills' + i];
   mc.onRollOver = skillRollOver;
   ....
}
 
function skillRollOver()
{
  trace(this.basee ); //магия 
  trace(this.skillname ); //Комета - если навели на мувик skill1, 'Инферно' - если навели на skill2
}
...
Вариант 2.1 Можно использовать массивы 1:
Код AS1/AS2:
var skills:Array = new Array();
var skillsTotal:Number = 50;
for (i = 1; i <= skillsTotal; i++)
{
   skills[i] = new Array(); //организовываем "двумерный" массив по номерам в роли индексов
  //далее можно задать обработчики для мувиков скилов
}
 
....
//задаем:
skills[1]['basee'] = 'магия';
skills[1]['skillname'] = 'Комета';
 
skills[2]['basee'] = 'магия';
skills[2]['skillname'] = 'Инферно';
Как тут происходит обращение, думаю, очевидно.

Вариант 2.2 Можно использовать массивы 2:
Код AS1/AS2:
var skills:Array = new Array();
var skillsTotal:Number = 50;
for (i = 1; i <= skillsTotal; i++)
{
   var mc:MovieClip =  _root['skills' + i];
   skills[mc]] = new Array(); //организовываем "двумерный" массив с самими мувиками в роли индексов
   mc.onRollOver = skillRollOver;
}
...
//задаем:
skills[skill1]['basee'] = 'магия';
skills[skill1]['skillname'] = 'Комета';
 
skills[skill2]['basee'] = 'магия';
skills[skill2]['skillname'] = 'Инферно';
....
function skillRollOver()
{
  trace(skills[this]['basee']); //магия 
  trace(skills[this]['skillname']); //Комета - если навели на мувик skill1, 'Инферно' - если навели на skill2
}
...
При кажущейся громоздкости использование более очевидно - в роли индекса для обращения к массиву скилов выступает сам мувик, то есть похоже на Вариант 1, но с единым хранением инфы о скилах в массиве.

Какой вариант использовать, зависит от конкретной логики разработки.
Кто-нибудь еще, думаю, предложит варианты.
__________________
Идите первым!


Последний раз редактировалось mooncar; 05.11.2010 в 11:01.
Старый 05.11.2010, 14:28
Dalass13 вне форума Посмотреть профиль Отправить личное сообщение для Dalass13 Найти все сообщения от Dalass13
  № 3  
Ответить с цитированием
Dalass13
 
Аватар для Dalass13

Регистрация: Oct 2010
Адрес: Свердловск
Сообщений: 77
ну логика у меня в принципе такая. На МС скилла стоит код:

Код AS1/AS2:
onClipEvent (load) {
	id = this._name.slice(5, 7);
	gotoAndStop(id);
	zabito = 0;
	zabitoC = 0;
	guardX = _x;//исходное
	guardY = _y;//положение
	lockMenu = false;
	checks = true;
}
on (rollOver) {
	if (lockMenu == false) {
		_root.skillBASE(this._name);// берет инфу о скилле
		_root.menuCheck(_x, _y, _width);//проверяет, чтобы самодельное окно не выходило за пределы экрана
	}
}
on (press) {
	this.swapDepths(100);
	startDrag(this);
	_root.information._visible = false;
	lockMenu = true;
}
//теперь очень громоздкий код который мне ОЧЕНь хотелось бы оптимизировать, но мозг не рабоает что-то
on (release) {
	for (i=1; i<=3; i++) {//идет перебор 3 слотов экипировки скиллов
		if (this.hitTest(_root["slot"+i])) {
			if (_root.a[i] == 1) {//условие проверяет забит ли i-тый слот другим скиллом, если 1 то забит и МС возвращается на своё guard место
				i = 3;
				_root.a[zabito] = 0;//изначально все скиллы находятся в нулевом слоте a[0]
				trace("a["+zabito+"]="+_root.a[zabito]);
				trace("ВЫШЕЛ ИЗ СЛОТА: "+zabito);
				_x = guardX;
				_y = guardY;
				_width = 38;
				_height = 38;
				this.shine.gotoAndStop(1);
				break;
			} else {
				_x = _root["slot"+i]._x;//далее естественно описывается вхождение в выбранный слот при свободном слоте
				_y = _root["slot"+i]._y;
				_width = _root["slot"+i]._width;
				_height = _root["slot"+i]._height;
				if (i<>zabito) {
					trace("ВЫШЕЛ ИЗ СЛОТА "+zabito);
					_root.a[zabito] = 0;
					trace("a["+zabito+"]="+_root.a[zabito]);
				}
				trace("ВОШЕЛ В СЛОТ "+i);
				_root.a[i] = 1;
				trace("a["+i+"]="+_root.a[i]);
				zabito = i;
				this.shine.gotoAndStop(2);
				break;
			}
		} else {
			if (i == 3) {//а здесь описывается что происходит если hittest не "почувствовал" ни одного слота
				_root.a[zabito] = 0;
				trace("a["+zabito+"]="+_root.a[zabito]);
				trace("ВЫШЕЛ ИЗ СЛОТА: "+zabito);
				_x = guardX;
				_y = guardY;
				_width = 38;
				_height = 38;
				this.shine.gotoAndStop(1);
			}
		}//и вот сейчас начинается АД
		if (this.hitTest(_root["comboslot"+i])) {//теперь проверяем еще 2 слота, но другие по функционалу, то есть не экипировк, а комбинирования
			if (_root.b[i] == 1) {//естественно коды аналогичны
				i = 2;
				_root.b[zabitoC] = 0;
				trace("b["+zabitoC+"]="+_root.b[zabitoC]);
				trace("ВЫШЕЛ ИЗ СЛОТА: "+zabitoC);
				_x = guardX;
				_y = guardY;
				_width = 38;
				_height = 38;
				this.shine.gotoAndStop(1);
				break;
			} else {
				_x = _root["comboslot"+i]._x;
				_y = _root["comboslot"+i]._y;
				_width = _root["comboslot"+i]._width;
				_height = _root["comboslot"+i]._height;
				if (i<>zabitoC) {
					trace("ВЫШЕЛ ИЗ СЛОТА "+zabitoC);
					_root.b[zabitoC] = 0;
					trace("b["+zabitoC+"]="+_root.b[zabitoC]);
				}
				trace("ВОШЕЛ В СЛОТ "+i);
				_root.b[i] = 1;
				trace("b["+i+"]="+_root.b[i]);
				zabitoC = i;
				if (i == 1) {
					_root.part1 = id;
					trace(_root.part1);
				} else {
					_root.part2 = id;
					trace(_root.part2);
				}
				this.shine.gotoAndStop(2);
				break;
			}
		} else {
			if (i == 2) {
				_root.b[zabitoC] = 0;
				trace("b["+zabitoC+"]="+_root.b[zabitoC]);
				trace("ВЫШЕЛ ИЗ СЛОТА: "+zabitoC);
				_x = guardX;
				_y = guardY;
				_width = 38;
				_height = 38;
				this.shine.gotoAndStop(1);
			}
		}
	}
	stopDrag();
	this.swapDepths(0);
	lockMenu = false;
}
on (rollOut) {
	_root.information._visible = false;//скрывает самодельное окно с инфой
}
И вот иногда бывают ошибки. Напрмер:
1) В 3ий слот экипировки не может попасть скилл, который находился в слоте комбо.
2) Всё видно на этом скриншоте

Название: ok.jpg
Просмотров: 245

Размер: 78.9 Кб



В общем всё состоит из 3 слотов экипировки и двух слотов для комбинирования скиллов. Я думал сделать их однотипными, то есть не делить на slot и comboslot, а slot1-slot5.

Что думаете по этому поводу. Прекрасно понимаю, что безумно избыточно, но лучше ничего к сожалению не придумал и то, что ВСЁ ЭТО на мувике меня тоже безумно напрягает, если учитывать что это всё дублируется на 50 аналогичных МС. Вот такие пироги

Если, что-то непонятно в коде спрашивайте


Последний раз редактировалось Dalass13; 05.11.2010 в 15:43.
Старый 05.11.2010, 18:10
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 4  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Для начала перестаньте писать на клипах.
Посмотрите, как организовать задание свойств (например, обработичики) для нескольких мувиков в цикле, я же привел примеры.
__________________
Идите первым!

Старый 05.11.2010, 21:05
Dalass13 вне форума Посмотреть профиль Отправить личное сообщение для Dalass13 Найти все сообщения от Dalass13
  № 5  
Ответить с цитированием
Dalass13
 
Аватар для Dalass13

Регистрация: Oct 2010
Адрес: Свердловск
Сообщений: 77
я понять не могу как написать обработчик для 50ти МС с разными именами? Если с помощью процедуры в которой будет for(i==0;i<=50;i++) то всё равно, кто вызывать то эту процедуру будет?

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

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Конечно, с помощью цикла, как же еще. У вас ведь имена мувиков номерные, что может быть проще?
Код AS1/AS2:
var skillnames:Array = ['Первый скилл', 'Второй скилл', ...]
 
for (i = 1; i <= 50; i++)
{
   var mc:MovieClip =  _root['skills' + i];
   mc.n = i;
   mc.skillname = skillnames[i - 1];
   mc.onRollOver = skillRollOver;
   //и т. д. - обработчики, какие-то свойства...
}
...
function skillRollOver()
{
  trace(this); // сам мувик, по которому "прошлась мышь"
  trace(this.n); //выведет номер, который присвоили в цикле
  trace(this.skillname); //выведет "Первый скилл", "Второй скилл" -.... в зависимости от того, по которому "прошлась мышь"
}
__________________
Идите первым!


Последний раз редактировалось mooncar; 05.11.2010 в 21:14.
Старый 05.11.2010, 21:15
Dalass13 вне форума Посмотреть профиль Отправить личное сообщение для Dalass13 Найти все сообщения от Dalass13
  № 7  
Ответить с цитированием
Dalass13
 
Аватар для Dalass13

Регистрация: Oct 2010
Адрес: Свердловск
Сообщений: 77
я всё равно не допонимаю как вызываться будет этот обработчик

вообще я сначала дублирую МС и сразу присваиваю имена

Код AS1/AS2:
function fillUpSkills() {
	fixY = skill._y+18;
	k = 0;
	for (i=1; i<=11; i++) {
		for (j=1; j<=5; j++) {
			k += 1;
			if (_root.skillMas[k] == 1) {
				duplicateMovieClip(skill, "skill"+k, k);
				_root["skill"+k]._x = 42*j+skill._x;
				_root["skill"+k]._y = fixY;
			}
		}
		fixY += 42;
	}
	_root.skillMas[_root.enable] = 0;//определяет, что на данный момент этот скилл заблокирован
}
а затем либо обращаюсь по имени, либо по только номеру, через slice имени


И еще проблема в том что на кадре уже 300 строк кода -________-


Последний раз редактировалось Dalass13; 05.11.2010 в 21:22.
Старый 05.11.2010, 21:19
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 8  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
пример сейчас накидаю
__________________
Идите первым!

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

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
300 строк кода - это не проблема. Проблема, это когда вы накодите уже 3000 строк и поймете, что использовали в корне неверный подход.
См. пример. Если что, там использован attachMovie, мувик из библиотеки, а не дублирование.
Вложения
Тип файла: rar Назначение свойств мувиков циклом.rar (5.9 Кб, 33 просмотров)
__________________
Идите первым!

Старый 05.11.2010, 21:39
Dalass13 вне форума Посмотреть профиль Отправить личное сообщение для Dalass13 Найти все сообщения от Dalass13
  № 10  
Ответить с цитированием
Dalass13
 
Аватар для Dalass13

Регистрация: Oct 2010
Адрес: Свердловск
Сообщений: 77
у меня 8 флэш(

не понимает формат


Последний раз редактировалось Dalass13; 05.11.2010 в 21:47.
Создать новую тему Ответ Часовой пояс GMT +4, время: 23:11.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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