Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 23.04.2010, 23:40
mickfallout вне форума Посмотреть профиль Отправить личное сообщение для mickfallout Найти все сообщения от mickfallout
  № 1  
Ответить с цитированием
mickfallout
 
Аватар для mickfallout

Регистрация: Jun 2009
Адрес: Москва
Сообщений: 170
По умолчанию Многокомпонентная анимация персонажа - как реализовать?

Есть персонаж в изометрической РПГ, графика сохранена в виде кучи png файлов:
Man_Move_Right_001.png, Man_Move_Right_002.png, <...> - кадры анимации движения голого перса
AK_Move_Right_001.png, AK_Move_Right_002.png, <...> - кадры анимации автомата при движении перса
и так далее.
Как всё это собирать в один мувик? В голову приходит три варианта:
1. Сделать отдельные мувики движений разных частей, сделать класс-контейнер, который будет следить за синхронностью движений, управлять переключением кадров, добавлять-удалять компоненты анимации. В этом варианте пугает, что для каждого кадра в оперативной памяти будет несколько изображений, что для одного персонажа будет несколько мувиков.
2. При появлении персонажа создавать мувик, в каждый кадр которого ставить Bitmap, полученный сложением кадров одетых вещей. Такой вариант видимо будет быстрее воспроизводиться и меньше памяти требовать.
3. Сделать отдельные мувики движений разных частей, а при появлении персонажа собирать из кадров этих отдельных мувиков один общий (просто добавляя shape'ы в кадры, без использования Bitmap). Такой вариант анимации наверное будет воспроизводиться быстрее первого, но медленнее второго, а инициализироваться быстрее второго, но медленнее первого.
Посоветуйте, какой вариант выбрать? Или может быть есть ещё варианты?

Старый 24.04.2010, 01:45
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 2  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
при появлении персонажа собирать из кадров этих отдельных мувиков один общий (просто добавляя shape'ы в кадры, без использования Bitmap)
Откуда уверенность, что переключение кадров быстрее подстановки bitmapData у Bitmap? Там еще не понятно что с памятью при переключении кадров происходит.

Старый 24.04.2010, 02:53
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 3  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Соберите в каждый swf как ресурс. Съэкономите на времени ожидания загрузки для конечного пользователя.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.


Последний раз редактировалось dimarik; 24.04.2010 в 02:57.
Старый 24.04.2010, 11:00
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 4  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Проблема, как я понимаю, в том числе и в том, что заранее все варианты в мувик не собрать. С тем, чтобы собрать голого лысого перса в один клип, вопросов нет. Но пользователь в процессе игры докупает для него одежду, аксессуары, прическу меняет.

Все равно получается контейнер, к котором стопкой лежат мувиклипы, синхронизированные по таймлайну, как я понимаю.

Хотя, конечно, с точки программирования идеальный вариант, когда все внутри уже реализовано, а ты просто выставляешь/убираешь альфу. Но это для простых случаев.

Старый 24.04.2010, 22:29
mickfallout вне форума Посмотреть профиль Отправить личное сообщение для mickfallout Найти все сообщения от mickfallout
  № 5  
Ответить с цитированием
mickfallout
 
Аватар для mickfallout

Регистрация: Jun 2009
Адрес: Москва
Сообщений: 170
сделал так(первый вариант):
Код AS3:
package  
{
   import flash.display.MovieClip;
   import flash.display.Sprite;
   /**
    * ...
    * @author mick
    */
   public class UnitAnimation extends Sprite
   {
      static public const UNIT_BODY_MAN:String = "Man";
      static public const UNIT_EQUIPMENT_AK:String = "AK_Equipment";
      public function UnitAnimation(bodyType:String, equipment:Array=null)
      {
         var i:int = 0;
         super();
         if (equipment == null)
            equipment = [];
         addChild(Main.newMovieClip(bodyType));//функция Main.newMovieClip(imageName:String):MovieClip - выдает мувик из файла ресурсов
         while (i < equipment.length)
            addChild(Main.newMovieClip(equipment[i++]));
         gotoAndStop(0);
      }
 
      public function gotoAndStop(frame:Object, scene:String = null):void
      {
         var i:int = numChildren;
         while (i-- > 0)
            MovieClip(getChildAt(i)).gotoAndStop(frame, scene);
      }
 
      public function get currentFrame():int
      {
         if (numChildren > 0)
            return MovieClip(getChildAt(0)).currentFrame;
         return 1;
      }
 
      public function get totalFrames():int
      {
         if (numChildren > 0)
            return MovieClip(getChildAt(0)).totalFrames;
         return 1;
      }
 
      public function gotoAndPlay(frame:Object, scene:String = null):void
      {
         var i:int = numChildren;
         while (i-- > 0)
            MovieClip(getChildAt(i)).gotoAndPlay(frame, scene);
      }
 
      public function stop():void
      {
         var i:int = numChildren;
         while (i-- > 0)
            MovieClip(getChildAt(i)).stop();
      }
 
      public function play():void
      {
         var i:int = numChildren;
         while (i-- > 0)
            MovieClip(getChildAt(i)).play();
      }      
      public function nextFrame():void
      {
         var i:int = numChildren;
         while (i-- > 0)
            MovieClip(getChildAt(i)).nextFrame();
      }
 
      public function prevFrame():void
      {
         var i:int = numChildren;
         while (i-- > 0)
            MovieClip(getChildAt(i)).prevFrame();
      }
 
      public override function set mouseEnabled(value:Boolean):void
      {
         super.mouseEnabled = value;
         var i:int = numChildren;
         while (i-- > 0)
            MovieClip(getChildAt(i)).mouseEnabled=value;         
      }
 
      public override function get mouseEnabled():Boolean
      {
         return super.mouseEnabled;
      }
 
      public function setEquipment(equipment:Array, playAnimation:Boolean = true):void
      {
         var i:int = numChildren;
         while (i-- > 1)
            removeChildAt(i);
         i = numChildren;
         while (i < equipment.length)
            addChild(Main.newMovieClip(equipment[i++]));
         if (playAnimation)
            gotoAndPlay(currentFrame);
         else
            gotoAndStop(currentFrame);
      }
   }
 
}
Не нравится мне такой вариант =(
Думаю второй был бы быстрее... Но с ним не знаю как лучше сделать смену изображений в зависимости от кадра (собственно анимацию). Просто подписать обработчик события EnterFrame с сменой битмапДаты? Не будет ли это слишком долго?


Последний раз редактировалось mickfallout; 24.04.2010 в 22:33.
Старый 26.04.2010, 12:34
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 6  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
http://blog.hexagonstar.com/animatedbitmapclass/
вот что-то похожее делал:
http://k0t0vich.megaforce.ru/test/fl...t/Animtest.swf
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 26.04.2010 в 12:44.
Старый 26.04.2010, 13:29
Bgg вне форума Посмотреть профиль Отправить личное сообщение для Bgg Найти все сообщения от Bgg
  № 7  
Ответить с цитированием
Bgg
 
Аватар для Bgg

Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
Цитата:
Сообщение от Котяра Посмотреть сообщение
вот что-то похожее делал:
http://k0t0vich.megaforce.ru/test/fl...t/Animtest.swf
оо, очень шустро работает. А как сортируется такая толпа? childIndex'ом?

Старый 26.04.2010, 13:45
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 8  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
очень шустро и очень криво =)

Старый 27.04.2010, 17:59
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 9  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Цитата:
Сообщение от BlooDHounD Посмотреть сообщение
очень шустро и очень криво =)
Это даже не прототип - тестик: потянет/не потянет 50 - одновременно движущихся с большой битмапой..
Там xml - персонажа кривая (координаты, положения, некоторых кадров элементарно нет), рендеры тестовые, нет никакой практически оптимизации, но свою цель тест выполнил на все 100%.
Если будет возможность/разрешение вышестоящих органов - выложу что в итоге получилось))
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 27.04.2010 в 18:01.
Создать новую тему Ответ Часовой пояс GMT +4, время: 01:42.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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