![]() |
Как правильно создать анимацию персонажа
Недавно начал осваивать AS3, для этих целей использую FlashDevelop.
И конечно хочется написать хоть простенькую но СВОЮ игру. Мне все было понятно до этого момента :) Суть вопроса в том, как правильно сделать анимацию персонажа. Например есть две картинки с ходьбой человека, на одной правая нога впереди левая рука сзади на другой наоборот. Как организовать чтобы они менялись? Какие средства для этого нужны? И так ли вообще должна происходить анимация или есть другой способ? |
|
Нуу, да для описанной выше пойдет:). А для более качественной анимации что использовать? И можно всего персонажа вместе с его логикой и анимацией выгрузить в какой-нибудь файл, а потом просто добавить как объект в сцену и передавать ему параметры на которые он будет реагировать?
И задам еще глупый вопрос... Главный класс унаследован от спрайта, в нем переменной типа спрайт присваивается объект класса спрайт, сам этот класс находится в другом файле, но в этом же пакете. Вот примерный код второго/не главного класса: var cir:Sprite = new Sprite; cir.graphics.beginFill(0xFFCC00); cir.graphics.drawCircle(30, 30, 30); addChild(cir); Кто подскажет, почему кружочек не рисуется? Рисуется только когда addChild() напишу в главном классе. |
Тоже интересует данный вопрос. Видел как люди ставят метки на какой-то промежуток анимации. Например из 15 кадров, где 1 кадр - его обычная стойка, а 15 кадр, где он делает шаг. Этот промежуток в 15 кадров как-то обозначается и в конце привязан скрипт gotoAndPlay("goDown");. Но я до сих пор не понял как ставить флажки)
|
Цитата:
|
Цитата:
Есть такое понятие DisplayList — Список Отображения. Те объекты, которые добавлены в этот список, отображаются. Не все, какие были созданы программой, а только те из них, что были добавлены в Список. Поэтому какие то объекты могут существовать и даже что-то делать, но при этом не отображаться на экране, что, уж поверьте, очень удобно и, хотя и требует чуть больше памяти, зато улучшает быстродействие, так как объекты не нужно создавать каждый раз, когда хочется их показать. Например, кнопка может хранить все свои состояния уже отрисованными, и при взаимодействии с мышью только добавлять нужный стейт в Список, а ненужный удалять из него. Но не из памяти, а только из отображения. Этот Список — вложенный, или, если хотите, "дерево". На самом верху его основной контейнер — Stage, представляющий область отображения флэшплеера. В нем находится экземпляр вашего Документ-класса, главный контейнер Приложения/swf-файла. В котором Вы создаете уже разные экземпляры классов, контейнеры (мувиклип, спрайт) и не контейнеры (битмап, шейп, текстфилд) и можете добавлять их в отображение с помощью addChild() и addChildAt() (Документ-класс помещается в отображение автоматически, не нужно писать stage.addChild(main) ;). |
Цитата:
Правильно делается так: Создается класс, он наследуется от Sprite, в нём рисуем. Код AS3:
Код AS3:
Опоздал.) |
SuriTheAngel, почему у Вас графикс это свойство супер-класса, а addChild() — метод this? Вы его переопределили в главном классе что-ли? :)
|
Цитата:
|
Добавлять дисплей объекты можно где Вам хочется и где это вообще возможно, но нельзя добавлять их на stage! Нельзя делать - stage.addChild(...);
Если Вы добавили кружок в класе Другой, то он не попадёт в список отображения, так-как он сам в нем не находится. Автоматически только класс Main добавляется и если Вы хотите ещё что-то туда добавить, то нужно сначала получить ссылку на список отображения. Но если Вы добавить в Main класс экземпляр класса Другой .. addChild(Другой), то и объекты из этого Другой тоже попадут в список отображения. |
Проще говоря, тот контейнер, в который Вы что-то добавили, сам должен быть в списке отображения. Технически, естественно, у каждого контейнера есть как бы СВОЙ список отображения и возможность им управлять. Но на экране плеера будет показываться только тот объект, ВСЯ цепочка родительских списков отображения которого доходит до stage (собственно экрана). Я уже использовал слово "вложенные". По аналогии с: есть Дом, в нем есть Квартиры (одна или несколько!), в них есть шкафы, в шкафах есть ящики, в ящиках шкатулки. Так вот шкатулки находятся В ДОМЕ. Так понятно? А если шкатулка в шкафу, а шкаф на даче, то В ДОМЕ она не находится. Она в списке какого-то Шкафа, но не в списке Дома, потому что этот Шкаф НЕ в списке Дома.
addChild() это метод Списка Отображения. Child это "ребенок, потомок", а parent это "родитель". Имеется ввиду "ребенок" и "родитель" только в Списке Отображения. То есть, родителем объекта может стать совсем не тот объект, который его на самом деле СОЗДАЛ оператором new. Новый объект может быть создан одним, но добавлен в список другого объекта, который и будет его parent. То есть parent это не обязательно создатель, скорее хранитель, опекун или просто контейнер — банка, в которой лежит объект. У него есть свой parent, у того — свой, и так вплоть до stage. У ребенка могут быть свои дети — но только если он сам является наследником контейнера (класса DisplayObjectContainer), то есть мувиклипом или спрайтом (или их наследником). Шейп и ТекстФилд не имеют собственных списков, не могут содержать детей. Соответственно у них нет и методов Списка. Есть также терминология Дерева. В Дереве веткам соответствуют контейнеры, а листьям — не-контейнеры, конечные элементы списка, которые не могут иметь детей. Поэтому концепция Дерева больше подходит в данном случае). Цитата:
|
Цитата:
Добавлено через 1 минуту Цитата:
|
Цитата:
А то ведь бывают ситуации, когда пишешь this, хотя в самом классе метод не переопределён. |
Есть поверье, что написание this и super помогает понять, что этот метод был написан в суперклассе, а этот переопределён.. ну и ещё какие то непонятные мне оккультные аргументы.
Но даже придерживаясь этих суеверий надо придерживаться их до-конца :) |
Согласен, сначала я думал, что поможет только мне понять, но потом понял, что и код легче понять.
Но вчера вечером я писал код, который сразу мне напомнил эту тему.. Супер класс унаследован от Sprite, в нем addChild не переопределен, но в его методе написано this.addChild, ведь в момент создания объекта унаследованного от этого супер класса, this!==SuperClass, а this===SubClass, в котором метод addChild переопределён. Вот я и уточнил, может ли это как-то отразится на работоспособности. И про addChild я выдумал, так-как там другой метод, но объяснить легче было так. |
| Часовой пояс GMT +4, время: 11:04. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.