Форум 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 флэш(

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

mooncar 05.11.2010 21:42

Вложений: 1
Держите.

Dalass13 05.11.2010 22:06

блин какой я тупой -_______-

наконец дошло до меня как этот обработчик запускается, спасибо огромное)

mooncar 05.11.2010 22:08

Пожалуйста. :)

Dalass13 05.11.2010 23:11

я вот еще что хотел узнать. Мне после каждого комбинирования надо перезаполнять эти 55 скилоов с учетом того, что открыто, а что еще нет.

mooncar 05.11.2010 23:22

Задайте вашим скиллам свойство, означающее открытость (true / false).
Сделайте функцию с подобным циклом и в зависимости от "открытости" производите это "перезаполнение", вызывая функцию когда нужно.

Dalass13 05.11.2010 23:24

то есть самое первое заполнение сделать не функцией, а перезаполнение отдельной?

mooncar 06.11.2010 10:26

Нет, все можно функцией.

Dalass13 06.11.2010 19:52

У меня проблемка появилась

Код AS1/AS2:

do {
        if (i>cols) {
                j++, i=1;
        }
        id = 'skill'+index;
        var mc = _root.attachMovie('SkillIcons', id, index);
        mc.gotoAndStop(index);
        zabito = 0;
        zabitoC = 0;
        guardX = _x;
        guardY = _y;
        lockMenu = false;
        checks = true;
        mc.onRollOver = function() {
                if (lockMenu == false) {
                        _root.skillBASE(id);
                        trace(id);// возвращает всегда skill55
                        _root.menuCheck(_x, _y, _width);
                }
        };
        mc._x = x0+w*i;
        mc._y = y0+h*j;
        index++, i++;
} while (index<=cols*rows);

Я скорее всего опять чего-то не понимаю, но как обратиться именно к клипу на который навели курсор



Уже исправил, извиняюсь)

mooncar 06.11.2010 20:00

В вашем коде для меня есть непонятные места.
Посмотрите мои примеры на первой странице, как циклом назначаются обработчики.
И вот свежая тема:
http://www.flasher.ru/forum/showthread.php?t=146398

Dalass13 06.11.2010 22:51

теперь у меня другая проблема, вот код:

Код AS1/AS2:

fillUpSkills = function () {
        rows=11, cols=5;
        x0=600, y0=0;
        w=42, h=42;
        index=1, i=1, j=1;
        do {
                if (i>cols) {
                        j++, i=1;
                }
                id = 'skill'+index;
                var mc = _root.attachMovie('SkillIcons', id, index);
                mc.gotoAndStop(index);
                mc.zabito = 0;
                mc.lockMenu = false;
                mc.onRollOver = skillRollOver();
                mc.onRollOut = skillRollOut();
                mc.onPress = skillOnPress();
                mc.onRelease = skillOnRelease();
                mc._x = x0+w*i;
                mc._y = y0+h*j;
                mc.guardW = mc._width;
                mc.guardX = mc._x;
                mc.guardY = mc._y;
                index++, i++;
        } while (index<=cols*rows);
};
 
function skillRollOver() {
        if (this.lockMenu == false) {
                if (this._name.slice(5, 7)>55) {
                        _root.infoBASE(this._name);
                } else {
                        _root.skillBASE(this._name);
                }
                _root.menuCheck(this._x, this._y, this._width);
                }
}
 
function skillRollOut() {
        information._visible = false;
}
 
function skillOnPress() {
        this.swapDepths(100);
        startDrag(this);
        _root.information._visible = false;
        lockMenu = true;
}
 
function skillOnRelease() {
        for (k=0; k<=5; k++) {
                if (this.hitTest(_root["slot"+k])) {
                        if (_root.a[k] == 1) {
                                k = 5;
                                _root.a[this.zabito] = 0;
                                trace("a["+this.zabito+"]="+_root.a[this.zabito]);
                                trace("ВЫШЕЛ ИЗ СЛОТА: "+this.zabito);
                                this._x = this.guardX;
                                this._y = this.guardY;
                                this._width = this.guardW;
                                this._height = this.guardW;
                                this.shine.gotoAndStop(1);
                                break;
                        } else {
                                this._x = _root["slot"+k]._x;
                                this._y = _root["slot"+k]._y;
                                this._width = _root["slot"+k]._width;
                                this._height = _root["slot"+k]._height;
                                if (k<>this.zabito) {
                                        trace("ВЫШЕЛ ИЗ СЛОТА "+this.zabito);
                                        _root.a[this.zabito] = 0;
                                        trace("a["+this.zabito+"]="+_root.a[this.zabito]);
                                }
                                trace("ВОШЕЛ В СЛОТ "+i);
                                this._root.a[k] = 1;
                                trace("a["+k+"]="+_root.a[k]);
                                this.zabito = k;
                                this.shine.gotoAndStop(2);
                                break;
                        }
                } else {
                        if (k == 5) {
                                _root.a[this.zabito] = 0;
                                trace("a["+this.zabito+"]="+_root.a[this.zabito]);
                                trace("ВЫШЕЛ ИЗ СЛОТА: "+this.zabito);
                                this._x = this.guardX;
                                this._y = this.guardY;
                                this._width = this.guardW;
                                this._height = this.guardW;
                                this.shine.gotoAndStop(1);
                        }
                }
                stopDrag();
                this.swapDepths(0);
                lockMenu = false;
        }
}

В итоге в выходе все трейсы, а сами мувики никак не реагируют на наведение, нажатие и т.д. Где я опять допустил тупую ошибку?

mooncar 06.11.2010 23:28

Для начала ошибка:
Код AS1/AS2:

                mc.onRollOver = skillRollOver();
                mc.onRollOut = skillRollOut();
                mc.onPress = skillOnPress();
                mc.onRelease = skillOnRelease();

Тут надо писать ссылки на функции, а у вас вызовы идут.
Скобки уберите.


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

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