Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Плейсхолдер (как можно сделать лучше) (http://www.flasher.ru/forum/showthread.php?t=182326)

Tetraeon 19.07.2012 17:21

Плейсхолдер (как можно сделать лучше)
 
Здравствуйте уважаемые, сделал где то с месяц назад плейсхолдер для персонажа в который передаются разные изображения оружия. Тогда показалось что все нормально сделано, но сейчас понятно что все через ( ! ). Помогите пожалуйста советом как сделать правильно. Вот что у меня сейчас:
Код AS3:

public function buttonOn(e:Event):void //EnterFrame
{
        if (Heroes.hero.oneHandedStance) //какой вид оружия надет
        {
                WeaponDualMh.duMh.addChild(weaponDualMh); //В класс плейсхолдера оружия
        }    //добавляется клип(пока пустой)
}

Далее если надеть оружие выполняется функция которая передает в пустой клип, клип оружия weaponDualMh = new oneHandedSw_mc ;
И что получается: при смене кадров персонажа,в плейсхолдер оружия постоянно передается клип оружия по EnterFrame из-за чего происходит мерцание этого оружия в игре. Как бы вы посоветовали сделать чтобы избежать этого неприятно эффекта?

Bgg 19.07.2012 17:28

Разделить по разным контейнерам: анимация героя в одном, оружие в другом.

И да, что такое 'плейсхолдер'?? Местохранитель?

Tetraeon 19.07.2012 18:59

placeholder - метка-заполнитель; указатель места заполнения
Попробую разделить, спасибо.
Если кто еще поделится вариантами как лучше все организовать буду благодарен.

Вынес оружие из анимации персонажа, при смене кадров и единичном добавлении клипа оружие пропадает, при постоянном добавлении мерцает при смене кадра персонажа.

artcraft 19.07.2012 19:31

по этому кусочку кода ничего непонятно

то что вам нужно называется "инверсия контроля", я писал об этом в своём блоге

нужен интрефейс "оружие", имплементация которого будет передаваться персонажу извне, а пока оружие не создано можно передавать пустышку которая имлементирует интерфес но ничего не делает

Tetraeon 20.07.2012 01:13

Я не понял как работает пример кода в вашем блоге, я еще далеко не все понимаю поэтому и создал эту тему. Мой кусочек кода показывает только 1 вид оружия хотя их там побольше, но для демонстрации принципа действия, этого должно хватить. Если в словах описать принцип работы кода: Есть персонаж, на линии времени которого есть множество кадров в каждом кадре символ, в котором происходит анимация всех частей тела и оружия(пустой клип - плейсхолдер). Для разделения типов оружия и соответственно анимации обращения с ним я сделал такое же количество кадров на лини времени персонажа в дополнение к остальным и назвал метки кадров соответственно. Каждый плейсхолдер также имеет свой класс. В коде есть 3 переменных типа Boolean каждая названа соответственно типу оружия (двуручн, одноручн и дуалы) можно сделать как угодно, это не важно. При надевании определенного вида оружия соотвец. переменная принимает значение true и функция приведенная мной выше начинает добавлять в плейсхолдер изображение. WeaponDualMh.duMh.addChild(weaponDualMh);
WeaponDualMh - класс плейсхолдера, duMh - статическая переменная через которую я и получаю доступ к классу, weaponDualMh - пустой клип в последствии weaponDualMh = new oneHandedSw_mc ; становится изображением оружия и передаваемый в плейсхолдер по EnterFrame т.е каждый кадр игры. Если не передавать это изображение каждый кадр то оружие появится и пропадет если сменится кадр персонажа или оружия. Это то как оно есть сейчас... как же лучше все реорганизовать что бы не было этих постоянных добавлений изображения ведь этот вариант ест много ресурсов и мерцание оружия все портит. help

Wolsh 20.07.2012 01:59

Подозреваю что просто анимация на таймлайне сделана неправильно, то есть слот для оружия не "непрерывен", его экземпляр меняется в ключевых кадрах. Есть такой неявный прикол у таймлайна.
Можно пробежаться по ключам и проверить, сохраняется ли один экземпляр, по имени. Но если где-то имя "пропало" и Вы просто вписали желаемое, проблему это не решит, к сожалению.

Но, может быть иначе анимацию сделать просто невозможно, не знаю как там у Вас все устроено физически.

Tetraeon 20.07.2012 13:29

Wolsh вы оказались как всегда правы Bgg и вы тоже. Благодарю вас!

Добавлено через 5 часов 25 минут
Если во всех кадрах слот для оружия вынесен отдельно, то оружие не пропадет при смене кадров, если хотя бы в 1 кадре он находится внутри любого символа, оружие пропадает при смене любого из кадров. Таким образом анимацию сделать не получится... задачка однако.

Wolsh 20.07.2012 21:40

Ну почему не получится... Вот как-то делал же (не ржать!)

Tetraeon 21.07.2012 13:21

Вложений: 1
Понятия не имею в чем проблема тогда... все неприятности начались после переписывания кода... и все что изменилось это добавление персонажа на сцену программно, раньше он был изначально на сцене, ну и конечно пришлось почти во все классы прописать слушатель ADD_TO_STAGE, хотя и в старом варианте оружие пропадало при движении если добавлять его 1 раз, но мерцания не было видно. Еще добавил начальный кадр в главном swf файле, в виде меню, но врятле это могло повлиять т.к. все объекты я распихал по контейнерам им соответствующим (все панели в контейнер интерфейса, все объекты враги и героя в контейнер объектов) вроде все по полочкам разложил.. да и что там я уже каких только манипуляций не делал что бы проверить почему оружие пропадает, единственный вариант когда оно не пропадало это когда я поместил его в отдельный контейнер от персонажа абсолютно во всех кадрах даже в тех которые не задействованы были в процессе проверки.. т.е. пришлось их удалить и тупо оставить 4 кадра с неподвижным слотом оружия и если хотя бы в 1 из них оружие было в символе перса все накрывалось медным тазом. К этим 4 кадрам потом добавил 5-й с отдельным контейнером для оружия в котором сделал его анимацию, да еще такую что оно вообще не двигалось ни то что свой размер меняло, и опять оружие пропало, наверно в коде где то ошибка, хотя я его уже перелопатил и все вроде везде логично, вот элемент кода отвечающий за анимацию персонажа во время движения:
Код AS3:

                                        if (left == 1)
                                        {
                                                moving = true;
                                                heroPoint.x -=  heroSpeed;
                                                if (! attack)
                                                {
                                                        if (oneHandedStance)
                                                        {
                                                                hero.gotoAndStop("ohwalk_L");
                                                        }
                                                        if (twoHandedStance)
                                                        {
                                                                hero.gotoAndStop("walk_L");
                                                        }
                                                        if (dualHandedStance)
                                                        {
                                                                hero.gotoAndStop("duwalk_L");
                                                        }
                                                }
                                        }
                                        if (up == 1)
                                        {
                                                moving = true;
                                                heroPoint.y -=  heroSpeed;
                                                if (! attack)
                                                {
                                                        if (this.x < heroPoint.x)
                                                        {
                                                                if (oneHandedStance)
                                                                {
                                                                        hero.gotoAndStop("ohwalk_R");
                                                                }
                                                                if (twoHandedStance)
                                                                {
                                                                        hero.gotoAndStop("walk_R");
                                                                }
                                                                if (dualHandedStance)
                                                                {
                                                                        hero.gotoAndStop("duwalk_R");
                                                                }
                                                        }
                                                        else
                                                        {
                                                                if (oneHandedStance)
                                                                {
                                                                        hero.gotoAndStop("ohwalk_L");
                                                                }
                                                                if (twoHandedStance)
                                                                {
                                                                        hero.gotoAndStop("walk_L");
                                                                }
                                                                if (dualHandedStance)
                                                                {
                                                                        hero.gotoAndStop("duwalk_L");
                                                                }
                                                        }
                                                }
                                        }
                                        if (right == 1)
                                        {
                                                moving = true;
                                                heroPoint.x +=  heroSpeed;
                                                if (! attack)
                                                {
                                                        if (oneHandedStance)
                                                        {
                                                                hero.gotoAndStop("ohwalk_R");
                                                        }
                                                        if (twoHandedStance)
                                                        {
                                                                hero.gotoAndStop("walk_R");
                                                        }
                                                        if (dualHandedStance)
                                                        {
                                                                hero.gotoAndStop("duwalk_R");
                                                        }
                                                }
                                        }
                                        if (down == 1)
                                        {
                                                moving = true;
                                                heroPoint.y +=  heroSpeed;
                                                if (! attack)
                                                {
                                                        if (this.x < heroPoint.x)
                                                        {
                                                                if (oneHandedStance)
                                                                {
                                                                        hero.gotoAndStop("ohwalk_R");
                                                                }
                                                                if (twoHandedStance)
                                                                {
                                                                        hero.gotoAndStop("walk_R");
                                                                }
                                                                if (dualHandedStance)
                                                                {
                                                                        hero.gotoAndStop("duwalk_R");
                                                                }
                                                        }
                                                        else
                                                        {
                                                                if (oneHandedStance)
                                                                {
                                                                        hero.gotoAndStop("ohwalk_L");
                                                                }
                                                                if (twoHandedStance)
                                                                {
                                                                        hero.gotoAndStop("walk_L");
                                                                }
                                                                if (dualHandedStance)
                                                                {
                                                                        hero.gotoAndStop("duwalk_L");
                                                                }
                                                        }
                                                }

Ниже сама игра, пока только за война начал делать.

RandomUser 21.07.2012 23:57

Вы предлагаете декомпилировать вашу свф-ку, чтобы понять что не так? :)
При анимации контейнера, он должен находиться на таймлайне постоянно, т.е. никаких пропущенных кадров.
И во всех ключевых кадрах он должен называться одинаково.
Тоже самое касается всех(!) его родительских клипов.

Tetraeon 22.07.2012 00:43

Вложений: 1
Вот сам персонаж с его кадрами, я все уже перепробовал.. надеюсь все таки на то чего я еще не знаю. Принцип построения конечно ужасен.. надо было с чего то начинать)

Tetraeon 22.07.2012 01:28

Вот как я делал... удалял все кадры персонажа кроме 4х с неподвижным контейнером вынесенным из персонажа отдельно, и создавал 5й кадр таким же только положил контейнер с оружием в другой чтобы можно было там сделать его анимацию.. анимация была непрерывна и все как вы описывали... так вот без этого 5го кадра все работало нормально... не выходит анимация почему то.

ChuwY 22.07.2012 09:21

Совершенно не вникал в разговор, только увидел пару ключевых фраз, так что извините, если мимо кассы. Но.
Попробуйте, если не тяжело, использовать для контейнеров именованных не classic-tween анимацию, а новый (с 4 или 5-го cs flash появился) motion-tween. В нем, насколько я помню, при переходе между ключевыми кадрами инстанс контейнера не меняется.

Tetraeon 22.07.2012 13:53

Я только ей и пользовался "motion-tween" и имен вообще не давал контейнерам оружия, у каждой разновидности контейнера свой класс и изображения я добавлял через статическую переменную прямо в класс.

RandomUser 22.07.2012 14:22

У вашего персонажа ни для одного мувика не задано имя. И у вас целая куча пустых кадров на таймлайне.
И вообще, без остального кода сложно сказать что-то еще.

Tetraeon 22.07.2012 15:34

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

RandomUser 22.07.2012 15:59

Судя по всем, ошибка, все таки где-то в анимации.
И да, именовать анимированные мувики обязательно. И кадры не пропускать. Иначе этот мувик будет пересоздаваться и ваше оружие исчезнет.

Tetraeon 22.07.2012 16:13

Спасибо попробую все переделать.

Wolsh 22.07.2012 16:23

Вложений: 1
У меня в том примере весь перс состоит из одних только контейнеров-слотов.
Все они анимированы непрерывной анимацией.
В момент "переодевания" содержимое слотов удаляется и заменяется новым, определенным в массиве "скина".
Вложение 28233
Накосячить в коде довольно сложно)) Разбирайтесь с анимацией!

Tetraeon 23.07.2012 13:32

Наглядный пример спасибо. Это только 1 действие "бег", а если будут еще множество, как вы добавляете изображение в контейнер? отдельно в каждый кадр с анимациями или есть более универсальный способ?
Вы же напрямую с линией времени взаимодействуете ?
Код AS3:

var s1head:MovieClip = new s1_head;
pers.gotoAndStop("run");
HEAD.addChild(s1head);
// и удаление
pers.gotoAndStop("run");
HEAD.removeChild(s1head);

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

Wolsh 23.07.2012 19:38

Ни в каких кадрах ничего я не добавляю. Добавляю один раз по событию нажатия. Неважно в каком кадре это происходит. На протяжении всей анимации контейнер ОДИН.
Вам надо этот момент понять. Один. И что в него добавили, то в нем и находится. И никуда не пропадет, пока Вы кодом же его оттуда не выбросите.
Если у Вас на метке "run" находится ДРУГОЙ контейнер, то само собой, Вам придется перепихивать свой меч в него. Советую еще раз перечитать топик, не отмахиваясь от рекомендаций использовать ОДИН экземпляр контейнера на всей линии анимации. Совершенно неважно, только бег у меня тут или еще и прыжки, если между ними нет разрыва, который влечет за собой уничтожение текущего экземпляра и создание нового, в который меч не добавлен (кажется, это Вы пытались обойти статическим указанием меча классу а не экземпляру?)))

Tetraeon 10.08.2012 12:41

Появился вопросик... если контейнер ОДИН то любая анимация будит сохранятся и для других кадров требующих либо своей анимации либо полного бездействия... в 2х кадрах персонажа я вставил слот оружия, в 1 кадре перс не двигается, а во 2м машет слотом. В итоге какое бы я действие непроделывал со слотом оно применется на все кадры где бы он не находился. Что то я совсем запутался. Подскажите пожалуйста что делать или где можно об этом почитать.

Wolsh 10.08.2012 13:03

Цитата:

В итоге какое бы я действие непроделывал со слотом оно применется на все кадры где бы он не находился.
О каких действиях речь?

Tetraeon 10.08.2012 14:08

Под действиями я подразумиваю анимацию.
Подробнее:
Вот представьте 2 кадра на которых изображен персонаж из составляющих его символов рук ног и т.д. так же отдельно от символа персонажа есть символ в котором находится слот оружия (он одинаков что в 1-м, что во 2-м кадре с персонажем) в 1 -м кадре персонаж стоит на месте и в символе слота контейнер неподвижен, а во 2м кадре в символе слота оружия сам контейнер оружия находится в движении т.е. анимирован. Какой бы слот оружия я не изменил, все изменения применяются и ко всем остальным во всех кадрах. Ну оно и понятно ведь экземпляр то 1.. только вот вопрос: как сделать чтобы был 1 экземпляр слота оружия и что бы в разных кадрах с персонажем этот слот мог быть анимирован по разному. Если сделать разные экземпляры и назвать их символы одним именем, оружие будит пропадать при смене кадра персонажа.


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

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