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

maxdemented 09.02.2014 19:49

Как правильно создать анимацию персонажа
 
Недавно начал осваивать AS3, для этих целей использую FlashDevelop.
И конечно хочется написать хоть простенькую но СВОЮ игру. Мне все было понятно до этого момента :)
Суть вопроса в том, как правильно сделать анимацию персонажа. Например есть две картинки с ходьбой человека, на одной правая нога впереди левая рука сзади на другой наоборот. Как организовать чтобы они менялись? Какие средства для этого нужны? И так ли вообще должна происходить анимация или есть другой способ?

toFL 09.02.2014 23:41

flash.display.DisplayObjectContainer.swapChildren

maxdemented 10.02.2014 01:51

Нуу, да для описанной выше пойдет:). А для более качественной анимации что использовать? И можно всего персонажа вместе с его логикой и анимацией выгрузить в какой-нибудь файл, а потом просто добавить как объект в сцену и передавать ему параметры на которые он будет реагировать?
И задам еще глупый вопрос... Главный класс унаследован от спрайта, в нем переменной типа спрайт присваивается объект класса спрайт, сам этот класс находится в другом файле, но в этом же пакете. Вот примерный код второго/не главного класса:
var cir:Sprite = new Sprite;
cir.graphics.beginFill(0xFFCC00);
cir.graphics.drawCircle(30, 30, 30);
addChild(cir);
Кто подскажет, почему кружочек не рисуется? Рисуется только когда addChild() напишу в главном классе.

Godwarlock 10.02.2014 01:58

Тоже интересует данный вопрос. Видел как люди ставят метки на какой-то промежуток анимации. Например из 15 кадров, где 1 кадр - его обычная стойка, а 15 кадр, где он делает шаг. Этот промежуток в 15 кадров как-то обозначается и в конце привязан скрипт gotoAndPlay("goDown");. Но я до сих пор не понял как ставить флажки)

ZackMercury 10.02.2014 02:59

Цитата:

И задам еще глупый вопрос... Главный класс унаследован от спрайта, в нем переменной типа спрайт присваивается объект класса спрайт, сам этот класс находится в другом файле, но в этом же пакете. Вот примерный код второго/не главного класса:
var cir:Sprite = new Sprite;
cir.graphics.beginFill(0xFFCC00);
cir.graphics.drawCircle(30, 30, 30);
addChild(cir);
Кто подскажет, почему кружочек не рисуется? Рисуется только когда addChild() напишу в главном классе.
Вы на сцену второй класс добавляете?

Wolsh 10.02.2014 03:01

Цитата:

Рисуется только когда addChild() напишу в главном классе.
Представьте, у вас на кухне стол. Это stage. Вы сидите за столом и просите маму "разбей яйцо и помести его на сковородку". У вас возникает вопрос, почему яйцо при этом не оказывается на столе перед вами? Ну а с чего вы хотите увидеть на сцене предмет, который туда не помещали?
Есть такое понятие DisplayList — Список Отображения. Те объекты, которые добавлены в этот список, отображаются. Не все, какие были созданы программой, а только те из них, что были добавлены в Список. Поэтому какие то объекты могут существовать и даже что-то делать, но при этом не отображаться на экране, что, уж поверьте, очень удобно и, хотя и требует чуть больше памяти, зато улучшает быстродействие, так как объекты не нужно создавать каждый раз, когда хочется их показать. Например, кнопка может хранить все свои состояния уже отрисованными, и при взаимодействии с мышью только добавлять нужный стейт в Список, а ненужный удалять из него. Но не из памяти, а только из отображения.
Этот Список — вложенный, или, если хотите, "дерево". На самом верху его основной контейнер — Stage, представляющий область отображения флэшплеера. В нем находится экземпляр вашего Документ-класса, главный контейнер Приложения/swf-файла. В котором Вы создаете уже разные экземпляры классов, контейнеры (мувиклип, спрайт) и не контейнеры (битмап, шейп, текстфилд) и можете добавлять их в отображение с помощью addChild() и addChildAt() (Документ-класс помещается в отображение автоматически, не нужно писать stage.addChild(main) ;).

ZackMercury 10.02.2014 03:05

Цитата:

в нем переменной типа спрайт присваивается объект класса спрайт, сам этот класс находится в другом файле, но в этом же пакете.
Не очень понятно, что вы имели в виду.
Правильно делается так:
Создается класс, он наследуется от Sprite, в нём рисуем.
Код AS3:

package 
{
  public class MyCircle extends Sprite
  {
    public function MyCircle()
    {
      super.graphics.lineStyle(2, 0x000000);
      super.graphics.beginFill(0x0055CC);
      super.graphics.drawCircle(50, 50, 50);
    }
  }
}

А в главном классе:

Код AS3:

var myCircle:MyCircle = new MyCircle();
this.addChild(myCircle);

Добавлено через 2 минуты
Опоздал.)

Wolsh 10.02.2014 03:29

SuriTheAngel, почему у Вас графикс это свойство супер-класса, а addChild() — метод this? Вы его переопределили в главном классе что-ли? :)

maxdemented 11.02.2014 01:56

Цитата:

Сообщение от Wolsh (Сообщение 1159361)
Представьте, у вас на кухне стол. Это stage. Вы сидите за столом и просите маму "разбей яйцо и помести его на сковородку". У вас возникает вопрос, почему яйцо при этом не оказывается на столе перед вами? Ну а с чего вы хотите увидеть на сцене предмет, который туда не помещали?
Есть такое понятие DisplayList — Список Отображения. Те объекты, которые добавлены в этот список, отображаются. Не все, какие были созданы программой, а только те из них, что были добавлены в Список. Поэтому какие то объекты могут существовать и даже что-то делать, но при этом не отображаться на экране, что, уж поверьте, очень удобно и, хотя и требует чуть больше памяти, зато улучшает быстродействие, так как объекты не нужно создавать каждый раз, когда хочется их показать. Например, кнопка может хранить все свои состояния уже отрисованными, и при взаимодействии с мышью только добавлять нужный стейт в Список, а ненужный удалять из него. Но не из памяти, а только из отображения.
Этот Список — вложенный, или, если хотите, "дерево". На самом верху его основной контейнер — Stage, представляющий область отображения флэшплеера. В нем находится экземпляр вашего Документ-класса, главный контейнер Приложения/swf-файла. В котором Вы создаете уже разные экземпляры классов, контейнеры (мувиклип, спрайт) и не контейнеры (битмап, шейп, текстфилд) и можете добавлять их в отображение с помощью addChild() и addChildAt() (Документ-класс помещается в отображение автоматически, не нужно писать stage.addChild(main) ;).

Если что-то хочется вывести на экран, все это нужно добавлять через addChild() и addChildAt() ТОЛЬКО в главном классе? Если так, или нет поправьте пожалуйста, просто надо чтобы в мозгах как-то уложилось:) Главный класс (main) от спрайта имеет список отображения, а любой другой (например "drugoy") тоже от спрайта имеет свой список отображения... иии если я в классе "drugoy" добавлю что-то через addChild() это попадет в его список отображения. А главный класс какбы перекрывает его и поэтому ничего не рисуется. Нужно добавлять в список отображения главного класса. Так? %) сорри за сумбурность...

Akopalipsis 11.02.2014 02:11

Добавлять дисплей объекты можно где Вам хочется и где это вообще возможно, но нельзя добавлять их на stage! Нельзя делать - stage.addChild(...);
Если Вы добавили кружок в класе Другой, то он не попадёт в список отображения, так-как он сам в нем не находится. Автоматически только класс Main добавляется и если Вы хотите ещё что-то туда добавить, то нужно сначала получить ссылку на список отображения. Но если Вы добавить в Main класс экземпляр класса Другой .. addChild(Другой), то и объекты из этого Другой тоже попадут в список отображения.


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

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