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

Tetraeon 26.05.2012 14:20

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

udaaff 26.05.2012 14:25

Ничего не понятно.

Tetraeon 26.05.2012 14:38

Пустой MovieClip без изображения должен ссылаться на MovieClip с изображением и соответственно это изображение должно переносится в пустой MovieClip. Как это сделать?

RandomUser 26.05.2012 14:43

Если мувиклип без анимации, то можно использовать Bitmap и рисовать клип.
С анимацией придется делать это каждый кадр, но производительность будет соответствующей.

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

Tetraeon 26.05.2012 15:18

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

Wolsh 26.05.2012 15:29

addChild() вроде, не?

RandomUser 26.05.2012 15:41

Допустим у вас есть куча мувиков с оружием в библиотеке. Каждому мувику задаете свой класс (например, ShortSword, LongSword, Skimitar).
Теперь в ваш пустой(пока еще) клип добавляете нужный меч, например:
Код AS3:

weapon_container.addChild(new LongSword());


Tetraeon 26.05.2012 15:42

Благодарю вас уважаемые вы мне очень помогли! ++

strangedk 26.05.2012 15:44

Подход изначально неверный. Если меча нет - то и мувика "меч" не должно быть

Если появляется меч, делайте
Код AS3:

var sword:Sword = new Sword();
actor.addSword(sword);
 
// actor.addSword
public function addSword(sword:Sword) {
    if (!contains(sword))
        addChild(sword);
}

Рекомендую - посмотрите в сторону Finite State Machine, и жизнь упростится.

Добавлено через 20 минут
Finite State Machine video tutorial
part 1
part 2

Wolsh 26.05.2012 16:08

Цитата:

Если меча нет - то и мувика "меч" не должно быть
С этого момента перестаем называть мувик "меч" и называем его "слот для оружия правой руки". Если его анимация постоянна для любого оружия в правой руке (сам слот анимирован "заодно" с рукой) то вполне нормальная практика. Не вижу в этом подходе ничего "неверного". Но, может быть, я просто не вижу проблемы. Тогда объясните, чем это грозит.

strangedk 26.05.2012 16:21

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

Оружие может быть контактным, дистанционным, иметь разные размеры, hit-области и еще кучку свойств определенных в базовом классе Weapon

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

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

Wolsh 26.05.2012 16:58

Если Вы когда-нибудь анимировали персонажа, все его действия, как он бегает, поворачивается, стреляет – влево, вправо, вперед – то идея добавлять оружие "персонажу" а не в специальный слот, положение которого определено в анимации, не может показаться Вам такой замечательной. Граната это или арбалет, нет никакой разницы — оно связано с анимацией. Анимация действий персонажа с гранатой и с арбалетом может различаться, но это не меняет ровным счетом ничего, речь только о разных анимациях персонажа, разных секвенциях кадров или даже разных клипах с персонажем. Разработчик в здравом уме конечно же не добавит гранату в слот анимации действий с арбалетом.
Код AS3:

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

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

Добавлено через 12 минут
Цитата:

Но вообще, я говорил только о том что добавлять предметы нужно по мере их необходимости в игре.
А Вы думаете, персонаж будет размахивать пустым слотом, как-будто там есть меч? Ну опять же, всё зависит от здравомыслия разраба.
Если перс бъется врукопашку, то и "ненужного" слота меча в этой анимации нет. А уж если бъется мечом, то только потому, что в руках меч. Что и где было добавлено без необходимости? Слот для меча в анимации действий с мечом? О__о

Tetraeon 26.05.2012 17:30

Мне пока на ум приходит 1 вариант, сделать несколько слоев в анимациях персонажа, на каждом слое его instance name будит соответствовать виду его оружия (меч, лук, т.д.) при выборе определенного оружия все остальные сделать visible=false. Это что касается анимации с видами оружия.

Wolsh 26.05.2012 18:15

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

Tetraeon 26.05.2012 20:01

Не могу понять как заставить предмет помещенный в слот передать изображение в пустой клип при этом не исчезнув из слота оО. Вот код из пустого клипа для оружия
Код AS3:

var weapon;
if (Armor.arm.slot_1Full)
{
weapon = Armor.targ;
addChild(weapon);
weapon.x = 0;
weapon.y = 0;
}

Armor - класс слота, arm - статическая переменная, slot_1Full - Boolean заполненности слота,
Armor.targ - цель перетаскиваемая мышкой.

Вот код слота:
Код AS3:

if (!(slot_1Full))
{
        if (Point.distance(targPoint, slotA)<=20) /// Проверка пересечения с слотом
        {                                                    /// при отпускании мыши
                if (targ as TwoHanded)                /// проверка принадлежности к классу
                {
                        trace('TwoHanded');               
                        targ.x = slot_1.x;
                        targ.y = slot_1.y;
                }
        }
}

Я так понимаю addChild в пустом клипе перетягивает изображение, а не копирует. Как тут быть?
Еще как можно в классе выполнить те же действия что и в пустом клипе? Не знаю как к нему обратится.

Wolsh 26.05.2012 21:08

Вам бы почитать что-нибудь такое базовое о флэше и AS3... Прежде чем делать ни много ни мало, игру. Хотя бы говорить станете на общепринятом наречии, а не эти странные "перетягивает изображение"...
addChild() помещает указанный клип в указанный контейнер. Не хотите данный клип, создайте новый экземпляр и укажите его.
Последнее предложение просто не понял. Вообще.

strangedk 27.05.2012 00:02

Wolsh, спасибо за объяснение выше.

Доказали необходимость использования "слота", и разъяснили моменты с разным оружием

Добавлено через 2 минуты
Цитата:

Сообщение от Tetraeon (Сообщение 1081548)
slot_1Full - Boolean заполненности слота,

А зачем эта переменная?

если слот пустой, то slot.numChildren == 0
и всего-то

сделайте такой getter:

Код AS3:

public function get full():Boolean {
    return (numChildren > 0);
}


RandomUser 27.05.2012 14:49

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

Tetraeon 27.05.2012 18:51

Цитата:

Сообщение от RandomUser (Сообщение 1081637)
Может, все таки, назначите для каждого оружие свой класс, и будите добавлять уже новый экземпляр оружия?
Тогда точно нигде ничего исчезать не будет.

Я так и поступил спасибо за ценный совет.


Цитата:

Сообщение от Wolsh (Сообщение 1081559)
Последнее предложение просто не понял. Вообще.

Стараюсь совмещать теорию и практику... увы сразу все не дается.

Я имел ввиду, как обратиться к пустому клипу библиотеки из любого класса?
если в библиотеке достаточно просто зайти в Actions пустого клипа и написать addChild();
то как это сделать скажем из класса Main?
Имя : mc_weapon
Связывание : weapon_mc
Код AS3:

var weapon = weapon_mc;
if (Armor.arm.slot_1Full)
{
weapon.addChild(Armor.targ);
}

TypeError: Error #1006: addChild не является функцией.
at Main/game()

strangedk 27.05.2012 19:37

В Main классе:

Код AS3:

public var weapon_mc:MovieClip; // Без new !

если у weapon_mc есть собственный класс, то вместо MovieClip нужно указать этот тип

Tetraeon 27.05.2012 20:12

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at Main/game()
странно в Actions клипа получалось создать Armor.targ - ссылка на перетаскиваемый объект,
а через Main нет
У меня видать где то в другом месте ошибка, лучше начну с начала может что нибудь другое придумаю)


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

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