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

Dalass13 05.11.2010 06:48

База данных информации на кадре
 
Вот мне всегда было интересно, например у меня есть много дублированных МС на каждом код, дак вот на каждый клип при наведении нужно разное описание в "самодельном" всплывающем окне. Я это выполнял с помощью присвоения определеного 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 знаю что не совсем правильно, просто пытался)

mooncar 05.11.2010 10:24

Вариант 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, но с единым хранением инфы о скилах в массиве.

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

Dalass13 05.11.2010 14:28

Вложений: 1
ну логика у меня в принципе такая. На МС скилла стоит код:

Код 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) Всё видно на этом скриншоте

Вложение 25431



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

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

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

mooncar 05.11.2010 18:10

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

Dalass13 05.11.2010 21:05

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

mooncar 05.11.2010 21:09

Конечно, с помощью цикла, как же еще. У вас ведь имена мувиков номерные, что может быть проще?
Код 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); //выведет "Первый скилл", "Второй скилл" -.... в зависимости от того, по которому "прошлась мышь"
}


Dalass13 05.11.2010 21:15

я всё равно не допонимаю как вызываться будет этот обработчик

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

Код 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 строк кода -________-

mooncar 05.11.2010 21:19

пример сейчас накидаю

mooncar 05.11.2010 21:35

Вложений: 1
300 строк кода - это не проблема. Проблема, это когда вы накодите уже 3000 строк и поймете, что использовали в корне неверный подход.
См. пример. Если что, там использован attachMovie, мувик из библиотеки, а не дублирование.

Dalass13 05.11.2010 21:39

у меня 8 флэш(

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


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

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