Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 12.11.2009, 00:04   #1
Манжосов Денис :)
Профессионал
 
Регистрация: 29.01.2008
Сообщений: 1,039
Репутация: 228
По умолчанию Проблема с анимацией

Что-то я совсем не могу понять, как должна правильно работать анимация? К примеру. Есть проверка на вывод кадра:
Код:

  _2DEraseBuffer;
  _2DDrawNet(50);

  k := -1;
   for i := 0 to Map.LengthX - Map.sx do
    for j := 0 to Map.LengthY - Map.sy do
    begin
     while k <> Map.ObjMatrix[i+Map.sx, j+Map.sy] do
       Inc(k);
      if k <> -1 then
       if not cbGame.Checked
       then
          _2DDraw(i * sPoint, j * sPoint, Textures[k])
       else
          _2DDrawAnimation(i * sPoint, j * sPoint, High(MAL[k]), MAL[k], true);

      k := 0;
    end;


  _2DDrawScreen(0,0,Canvas);

_2D - это функции моего движка. Вот в этом коде идёт проверка: включена ли анимация? Если да, то начинать проигрывать кадры. MAL[k] - массив анимация типа TAnimList (= array of TBitmap). Тоесть есть анимация дерева и анимация земли, значит нарисовать картинки можно так: _2DDraw(0,0,MAL[0,3]) _2DDraw(0,0,MAL[1,1]) где в MAL первое значение - это какая анимация, второе значение - какой кадр из анимации вывести на экран. Так вот. Если к примеру анимация дерева имеет 4 кадра, а анимация травы имеет 6 кадров, то для каждого массива должно быть своё значение, сколько кадров анимации используется и уже проверять в коде программы. В общем, я совершенно запутан и мозггг кипит. Мне кажется, я сбился с правильного пути, подскажите, как организовать анимацию в игре?
P.S. Простую анимацию я знаю как делать, а вот если строится двумерная карта и на каждый объект своя анимация...вот это уже проблема(или мозг не варит уже...). Спасибо...
Манжосов Денис :) вне форума   Ответить с цитированием
Старый 12.11.2009, 00:20   #2
Beermonza
Инженер ИС
Профессионал
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
Репутация: 746
По умолчанию

Анимация, текстура анимации - это портянка, ...делается соединение всех кадров в один файл, с файлом идет описание как работать с анимацией, какого размера кадры, какое смещение относительно центра, сколько кадров.

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

Если число кадров больше 1, то обработчик пользуется трафаретом, т.е. вырезает кусок по формуле: от "номер текущего кадра * ширину кадра" до "номер текущего кадра * ширину кадра + ширина кадра"

Если ширина кадра 45, то на 0-м кадре это будет размер от 0 до 45, на 1-м - от 45 до 90 и т.д. Замыкающее условие переводит кадр на 0-й, в случае перехода за макс. кадр (это значение в тип уже записано при загрузке).

У тебя получится система универсальная, рисующая анимацию любого размера и количества кадров.
__________________
Руководитель проекта MMO 2D RPG
Beermonza вне форума   Ответить с цитированием
Старый 12.11.2009, 00:36   #3
Манжосов Денис :)
Профессионал
 
Регистрация: 29.01.2008
Сообщений: 1,039
Репутация: 228
По умолчанию

Я знал, что так тоже можно сделать и даже делал, но что-то этот код оказался не совсем удобным в моём случае. Всё равно спасибо за информацию. У меня по-другому картинка на экран выводится и с анимацией по другому работаю. В общем, тему можно закрыть или удалить, потому как разбираться буду сам
Манжосов Денис :) вне форума   Ответить с цитированием
Старый 12.11.2009, 16:35   #4
Beermonza
Инженер ИС
Профессионал
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
Репутация: 746
По умолчанию

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

Такая система есть в VCL, TImageList называется, ...в роде банка текстур, и в DelphiX тоже пародия на это с поиском (какая нещадная трата ресурсов ЦП).

Что за особый метод отрисовки, через что, секрет?
__________________
Руководитель проекта MMO 2D RPG
Beermonza вне форума   Ответить с цитированием
Старый 12.11.2009, 16:56   #5
Манжосов Денис :)
Профессионал
 
Регистрация: 29.01.2008
Сообщений: 1,039
Репутация: 228
По умолчанию

Цитата:
Что за особый метод отрисовки, через что, секрет?
Метод совсем не особый, а на самом деле самый обычный - через VCL. Движок использую для облегчения программирования.
Цитата:
какая нещадная трата ресурсов ЦП
Есть тип TAnimList = array of TBitmap ; все картинки одной анимации (кстати, все картинки не в одном файле, а в разных и в одном каталоге).
А что, разве каждые 33 мс разумней загружать картинку, "выдерать" картинку из файла анимации, выводить изображение на экран и освобождать память под картинку?
Код:

   for i := 0 to Map.LengthX - Map.sx do
    for j := 0 to Map.LengthY - Map.sy do
     case Map.ObjMatrix[i,j] of
       1: _2DDraw(i * sPoint, j * sPoint, Textures[0]);
       2: _2DDraw(i * sPoint, j * sPoint, Textures[1]);
     end;

Вот такой код выводит неанимированную картинку на экран. С анимацией вообще проблема полнейшая. Это ж для каждой анимации делать свой счётчик кадров(анимаций всего две, но ведь может быть и больше)? Ещё если учитывать то, что вся картинка может не успевать выводиться на экран, а ведь таймер через 33 мс опять рисует...Короче, я в полном заблуждении...
К примеру, если делать проверку на элемент массива и потом выводить картинку на экран по результатам проверки...ну вот так:
Код:

   for i := 0 to Map.LengthX - Map.sx do
    for j := 0 to Map.LengthY - Map.sy do
     case Map.ObjMatrix[i,j] of
       1: _2DDraw(i * sPoint, j * sPoint, Textures[0]);
       2: _2DDraw(i * sPoint, j * sPoint, Textures[1]);
       3: _2DDraw(i * sPoint, j * sPoint, Textures[2]);
//       ...а если их 50? ..
     end;

Можно оптимизировать вот так:
Код:

 
k := -1;
  for i := 0 to Map.LengthX - Map.sx do
    for j := 0 to Map.LengthY - Map.sy do
     begin
     while k <> Map.ObjMatrix[i + map.sx, J + map.sy] do Inc(k);
      _2DDraw(i * sPoint, j * sPoint, Texture[k]);
    k := -1;
     end;
     end;

Но это тоже не катит, я думаю... нерационально...
Манжосов Денис :) вне форума   Ответить с цитированием
Старый 12.11.2009, 17:45   #6
Вадим Буренков
Профессионал
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
Репутация: 383
По умолчанию

На самом деле все просто. Для начала нужно сделать единый тип (или класс) для анимации, например (пример для canvas из моих старых модулей):
Код:

TEffects = class{класс эффектов}
//графика
AnimFile:TBitmap;//файл анимации (все кадры)
Frame:TBitmap;//буффер для отдельного кадра из анимации

//параметры
XRes,YRes:integer;//разрешение кадра
MaxFrame:integer;//количество кадров в анимации
Time:integer;//счетчик времени
FrameTime:integer;//промежуток времени между сменой кадров
FrameNumber:integer;//номер текущего кадра

//логические переменные
Enable:boolean; //вкл/выкл анимации

В тип помещаем все что нужно для работы анимации
Должны быть процедуры загрузки параметров:
Код:

Procedure TEffects.LoadMem(FName:string;XPix,Ypix,FrameT,MaxFr:integer);
{
FName - путь и название файла анимации
XPix,Ypix - разрещение файла
FrameT - скорость смены кадров
MaxFr - количество кадров
}
begin
  XRes:=Xpix;
  YRes:=YPix;
  FrameTime:=FrameT;
  MaxFrame:=MaxFr;

  AnimFile:= TBitMap.Create; // создали соответствующие буферы
  Frame:= TBitMap.Create; // создали соответствующие буферы
  Frame.Transparent:=true;
  Frame.Width:=XRes;
  Frame.Height:=YRes;
  AnimFile.LoadFromFile(FName);  // загрузили соответствующие рисунки
  FrameNumber:=0;
end;

И основное - процедура рисования. Рисуется кадр номер которого TEffects.FrameNumber.
Код:

procedure TEffects.Effect(X,Y:integer);//создание эффекта по координатам Xpos и Ypos.
{
X,Y - положение анимации,
}
begin
//в случае если анимация включена
if Enable then begin

//задержка кадов (скорость анимации)
if Time = FrameTime then
begin
//вырезаеи нужный кадр
Frame.Canvas.CopyRect(bounds(0,0,XRes,YRes),AnimFile.Canvas,bounds(FrameNumber*XRes,0,XRes,YRes));
Time:=0;
FrameNumber:=FrameNumber+1;
end;

//рисуем нужный кадр анимации
Buffer.Canvas.Draw(round(X),round(Y),Frame);
Time:=Time+1;

//после последнего кадра снова переходим на первый
if FrameNumber=MaxFrame then FrameNumber:=0;

end;

end;

Также должны быть процедуры выгрузки анимации, стоп,старт,пауза и.т.д...
Вадим Буренков вне форума   Ответить с цитированием
Старый 12.11.2009, 18:53   #7
Beermonza
Инженер ИС
Профессионал
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
Репутация: 746
По умолчанию

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

По поводу загрузки: тут рулит метод динамического пополнения банка текстур. При открытии карты происходит предварительный анализ, присутствующих в ней объектов, и подгружаются все текстуры анимации. Например, обработчик в цикле видит в точке X,Y код, ищет путь на диске, находит файлы, загружает в ячейку 0 (!), в списке объектов, в записи "anim" указывает индекс, в данном случае - 0, ...и так по порядку. Т.е. у нас код в карте отвечает за типы объектов, а банк текстур ведет свой счет от 0 и до количества текстур, поскольку, если объект на карте под номером 9 и их всего 3, то не стоит создавать банк на 9 ячеек. Думаю, понятно. В развернутом виде на карте не должно быть значений, например, типа Byte, оно ни о чем не говорит, нужен код деления по уровням, ...например, "Дерево" - "Клен" - "Клен 1", ...т.е. есть некий каталог деревьев, есть подкаталог особых деревьев, и в нем масса видов: большие, маленькие, кривые, ровные, зимние, летние, осенние, весенние, срубленные )))) ...и т.д.
Стразу нужно продумать систему классифицирования и кодирования объектов на карте.
__________________
Руководитель проекта MMO 2D RPG

Последний раз редактировалось Beermonza; 12.11.2009 в 19:07.
Beermonza вне форума   Ответить с цитированием
Старый 15.11.2009, 23:54   #8
Манжосов Денис :)
Профессионал
 
Регистрация: 29.01.2008
Сообщений: 1,039
Репутация: 228
По умолчанию

Так... Анимацию от части удалось сделать. Но вот что за ****мо происходит такое, кто мне может объяснить? Берём объект "Дерево". Ставим несколько экземпляров на карту, включаем анимацию - работает! Теперь ставим объект "Трава". Анимация "Дерево" работает, а "Трава" - нет! Сделаем наоборот. Берём объект "Трава". Ставим несколько экземпляров на карту, включаем анимацию - работает! Берём объект "Дерево". Анимация "Трава" работает, а "Дерево" нет! Что за *****? Или... Создадим несколько экземпляров объектов "Трава" и "Дерево" на карте. Сохраним. Выходим из программы. Заходим, загружаем сохранённую заранее карту - абсолютно все анимации работают! Что за чертовщина?
Спасибо всем откликнувшимся.
P.S. Если нужен проект - выложу проект.

Последний раз редактировалось Beermonza; 16.11.2009 в 17:15.
Манжосов Денис :) вне форума   Ответить с цитированием
Старый 16.11.2009, 00:02   #9
Вадим Буренков
Профессионал
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
Репутация: 383
По умолчанию

Выложи проэкт, завтра посмотрю.

Последний раз редактировалось Вадим Буренков; 16.11.2009 в 18:07.
Вадим Буренков вне форума   Ответить с цитированием
Старый 16.11.2009, 00:13   #10
Манжосов Денис :)
Профессионал
 
Регистрация: 29.01.2008
Сообщений: 1,039
Репутация: 228
По умолчанию

Удалите сообщение, пожалуйста.

Последний раз редактировалось Манжосов Денис :); 16.11.2009 в 19:42.
Манжосов Денис :) вне форума   Ответить с цитированием
Ответ

Опции темы

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

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi 7 проблема с Анимацией Rus 47 Помощь студентам 1 26.05.2009 00:17
Помогите с анимацией проги! Aboltus Общие вопросы Delphi 3 29.07.2008 23:21
Работа с анимацией в ACCESS kuk132 Microsoft Office Access 1 17.07.2008 14:07
Задача с анимацией KpeHDeJIb Помощь студентам 1 04.07.2008 20:23
Помогите с анимацией в Паскале ЕвгениуS Помощь студентам 6 06.06.2008 15:10


17:41.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru