Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2009, 17:30   #11
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию Демка по анимациям.

У тебя сложные исходники с ошибками. В них мне нет смысла разбираться поэтому сделал демку с рабочим классом анимации.
Код при запуске:
Код:
procedure TMainForm.FormCreate(Sender: TObject);
begin
//создаем буфер
Buffer:=TBitmap.Create;
//размерами под панель рендера
Buffer.Width:=MainForm.RenderPanel.Width;
Buffer.Height:=MainForm.RenderPanel.Height;

//устанавливаем рендер анимаций в буфер
AnimEngine_SetRenderTarget(Buffer);

//Test - переменная анимации (var Test:TAnimation)
//создаем ее
Test:=TAnimation.Create('TreeAnim.bmp',50,50,5,6);
//устанавливаем тип анимации (aNormal - анимация проходит 1 круг;aNo-рисуется первый кадр анимации;aLoop-анимация зациклена)
Test.SetAnimType(aNo);
//запускается анимация
Test.SartAnim;

//включаем таймер с обработкой
MainForm.AnimTimer.Enabled:=true;
end;
В таймере обрабатывается анимация, рисуется буфер на форму:
Код:
procedure TMainForm.AnimTimerTimer(Sender: TObject);
begin
Test.Processing(100,100);

MainForm.RenderPanel.Canvas.Draw(0,0,Buffer);
AnimEngine_ClearBuffer;
end;
Все комманды анимационного движка в AnimSystem.pas
Вложения
Тип файла: rar AnimTest.rar (188.5 Кб, 19 просмотров)
Вадим Буренков вне форума Ответить с цитированием
Старый 16.11.2009, 17:34   #12
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

В редакторе есть класс, но им почему-то не пользуются, вот код:

Код:
procedure TMainForm._ReDraw;
var
  i,j: byte;
  ip, jp: integer;
  Frame: integer;  // этого не нужно
begin
  _2DEraseBuffer;
  _2DDrawNet(sPoint);

   for i := 0 to MapResolutionX-1 do
    for j := 0 to MapResolutionY-1 do
    begin
    if Map.ObjMatrix[i + Map.sx, j + Map.sy] <> -1 then
      begin

        // это смена кадров
        If Animations[Map.ObjMatrix[i + Map.sx, j + Map.sy]].FrameNumber > Animations[Map.ObjMatrix[i + Map.sx, j + Map.sy]].MaxFrameCount then
          Animations[Map.ObjMatrix[i + Map.sx, j + Map.sy]].FrameNumber := 0
        else Inc(Animations[Map.ObjMatrix[i + Map.sx, j + Map.sy]].FrameNumber);


        ip := i * sPoint;
        jp := j * sPoint;

        // это режим анимации
        if not cbGame.Checked then _2DDraw(ip, jp, Textures[Map.ObjMatrix[i + Map.sx, j + Map.sy]])
        else Animations[Map.ObjMatrix[i + Map.sx, j + Map.sy]].DrawAnimation(ip,jp);

      end;
    end;


  _2DDrawScreen(0,0,Canvas);
end;
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 16.11.2009, 18:16   #13
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Beermonza, работает код правильно, но всё равно есть некоторые проблемы, которые уже исправил. Большое спасибо.
Вадим, твой исходник не смотрел - не понадобилось. Спасибо.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 16.11.2009, 18:21   #14
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Код:
procedure TMainForm._ReDraw;
var
  i,j: byte;
  ip, jp, im, jm: integer;
begin
  _2DEraseBuffer;
  _2DDrawNet(sPoint);

 for i := 0 to MapResolutionX-1 do
    for j := 0 to MapResolutionY-1 do
    begin
    if Map.ObjMatrix[i + Map.sx, j + Map.sy] <> -1 then
      begin
        im := i + Map.sx;
        jm := j + Map.sy;

        ip := i * sPoint;
        jp := j * sPoint;

        if not cbGame.Checked
        then _2DDraw(ip, jp, Textures[Map.ObjMatrix[im, jm]])
        else Animations[Map.ObjMatrix[im, jm]].DrawAnimation(ip,jp);
        
     end;
    end;

    for i := 0 to al do
        If Animations[i].FrameNumber >
           Animations[i].MaxFrameCount
        then
           Animations[i].FrameNumber := 0
        else
           Inc(Animations[i].FrameNumber);

  _2DDrawScreen(0,0,Canvas);
end;
Правильный, рабочий, полит корректный, нормальный код

Последний раз редактировалось Манжосов Денис :); 16.11.2009 в 18:34.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 16.11.2009, 20:20   #15
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Первое, ...код не совсем политкорректный. Ты в первом цикле наталкиваешься на конкретный объект, именно в нем должна быть запись на счет кадров. Почему? ...да потому, что хоть у них и одинаковая текстура, но они все же разные объекты и у них не должно быть все синхронно. Одной и той же анимацией можно пользоваться по разному. Допустим рубят дерево, пошла анимация его падения, тут же срубили еще одно дерево, ...т.е. на первом дереве еще не завершилась анимация, а на втором нужен 0-й кадр, а если вспомнить, что у тебя на анимацию конкретной текстуры только один счет в конце по переменной "al", то ты получишь глюк на экране, ...не до конца падающее дерево снова встанет на место и синхронно со вторым повторно начнет падать.

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

Третье, ...если на участке карты нет объектов с анимацией, но на карте где-то есть объект с такой анимацией, но его не видно, у тебя все равно идет счет, ..."ай, какая мелочь..." скажешь? ...не торопись с выводами. Когда в банке будет не одна сотня текстур и динамический выбор, не только по кадрам, но и по состояниям, то ты в полной мере почувствуешь тормозность кода. Я уже через все это прошел, ты же можешь не тратить попросту время.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 16.11.2009, 21:02   #16
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Цитата:
Первое, ...
Анимация будет одинаковой для всех объектов данного типа анимации.

Насчёт третьего суждения. У меня проверка только на видимый участок карты идёт:
Код:
 for i := 0 to MapResolutionX-1 do
    for j := 0 to MapResolutionY-1 do
MapResolutionX = 16, MapResolutionY = 8. Так что тормозности никакой нет, а ображение к массиву такое:
Код:
Map.ObjMatrix[i + Map.sx, j + Map.sy]
, где sx и sy - это сдвиг так называемой игровой камеры. Всё, что можно было рассчитать, уже рассчитано. . Или я не совсем Вас понял?
Единственное, что меня не устраивает так это то, что при полной загруженности видимого участка карты 16x8 загрузка ЦП 13 %.

Последний раз редактировалось Манжосов Денис :); 16.11.2009 в 21:06.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 17.11.2009, 00:51   #17
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

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

По первой у меня тоже были такие вроде бы логичные ответы самому себе: "да это мне не нужно", "какое расширение? ...один вид на всех и хорошо", "какая динамика? ...вот, что в ручную в коде прописано, то и загрузит", ...как видишь, я свои мнения по этому поводу уже сменил, и правильно сделал, ...у меня полный игровой кадр с независимой анимацией всего, кушает 45% ЦП, ...это не предел.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 17.11.2009, 08:49   #18
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

У меня в самом начале создаются объекты (текстуры), а вместе с ними в самом начале загружаются анимации. Но ведь смысл подгружать текстуры, если на пустом участке карты они не рисуются? Тем более, как мне кажется, это будет слишком большой нагрузкой для ЦП: сначала свыделить память, загрузить текстуру и потом её освободить?
Загруженность процессора 13 % только для видимого полностью загруженного участка карты, если же переключить камеру на 16 позиций, при условии, что на видимом участке нет объектов, то загрузка становиться равной 0 %.
Код:
procedure TMainForm._ReDraw;
var
  i,j: byte;
  ip, jp, im, jm: integer;
begin
  _2DEraseBuffer;
  _2DDrawNet(sPoint);

 for i := 0 to MapResolutionX-1 do
    for j := 0 to MapResolutionY-1 do
    begin
    if Map.ObjMatrix[i + Map.sx, j + Map.sy] <> -1 then
      begin
        im := i + Map.sx;
        jm := j + Map.sy;

        ip := i * sPoint;
        jp := j * sPoint;

        if cbGame.Checked then
             if   Animations[Map.ObjMatrix[im, jm]].Enabled
             then Animations[Map.ObjMatrix[im, jm]].DrawAnimation(ip,jp)
             else _2DDraw(ip, jp, Textures[Map.ObjMatrix[im, jm]])
             else _2DDraw(ip, jp, Textures[Map.ObjMatrix[im, jm]]);

     end;
    end;

    for i := 0 to al do
     if Animations[i].Enabled then
        If Animations[i].FrameNumber >
           Animations[i].MaxFrameCount
        then
           Animations[i].FrameNumber := 0
        else
           Inc(Animations[i].FrameNumber);

  _2DDrawScreen(0,0,Canvas);
Немного поправленный код: в случае, если есть неанимационные объекты, рисовать простой спрайт.

Последний раз редактировалось Манжосов Денис :); 17.11.2009 в 16:16.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 17.11.2009, 14:49   #19
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Я согласен с Beermonza.
По организации кода:
Вообще лучше раскидывать код по разным модулям: анимации в одном, процедуры для работы с камерой в другом и.т.д. Это не только структурирует код, но облегчает работу, один и тот де код не придется писать несколько раз. Такой код отвечающий за элементарное:
Код:
    for i := 0 to al do
     if Animations[i].Enabled then
        If Animations[i].FrameNumber >
           Animations[i].MaxFrameCount
        then
           Animations[i].FrameNumber := 0
        else
           Inc(Animations[i].FrameNumber);
вообще лучше не писать в самом проэкте. Это только ухудшает читаемость. Как сделаешь редактор и начнешь разрабатывать игру тебе придется делать copy-past больших кусков (так как например код отвечающий за работу анимации везде одинаков). А если в проэкте игры изменятся какие-нибудь основные типы? Придется также менять тот же код в проэкте редактора. Я советую тебе посмотреть мой исходник, там весь код структоризован а модуль анимаций независим от конкретного проэкта.
Вадим Буренков вне форума Ответить с цитированием
Старый 17.11.2009, 16:12   #20
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Читаемость кода облегчать для кого? Мне лучше, когда всё в одном модуле содержится, но некоторые функции или процедуры я всё равно по другим заголовочным файлам распределил, так как я использую их не в одном проекте, а в нескольких. Я ведь проект не для кого-то пишу, чтобы ему читать легче было... Если от меня будут требовать структуризации кода по модулям, то я сделаю так, иначе зачем мне это ?
Насчёт copy-past'ов так у меня их нет. Если код повторяется несколько раз в проекте, то он заносится в отдельную процедуру.
Манжосов Денис :) вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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