|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
13.09.2013, 19:50 | #1 |
Пользователь
Регистрация: 08.02.2013
Сообщений: 10
|
Delphi. Как воспроизвести текстурную анимацию?
Вот пример картинки:
Как в Delphi менять положение изображения так, чтобы получилась анимация? |
13.09.2013, 21:01 | #2 |
Пользователь
Регистрация: 31.08.2013
Сообщений: 93
|
По сути, алгоритм прост: - Вы имеете дело с текстурой, которая представляет из себя матрицу 5 x 5 и получим 25 фреймов анимации, где каждый фрейм, это какой то участок текстуры в зависимости от фрейма...
Предположим у нас есть текстура размером 255 x 255: TextureWidth = 255; TextureHeight = 255; разделим её на 5 спрайтов по вертикали и по горизонтали, тем самым получим ширину и высоту каждого спрайта: SpriteWidth = TextureWidth / 5; SpriteHeight = TextureHeight / 5; Теперь нам остается просто узнать координаты спрайта X и Y в зависимости от текущего фрейма при отрисовке: SpritePosX = (Frame * SpriteWidth) % TextureWidth; SpritePosY = (Frame / 5 * SpriteHeight) % TextureHeight; Всё... Перебирая в цикле от 0 до 24 каждый фрейм, отрисовываем каждый спрайт по очереди. Но остается вопрос: - Чем будем рисовать? Direct Show, DirectX, OpenGL? |
13.09.2013, 22:57 | #3 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,885
|
Для GDI=Canvas можно использовать либо Canvas.CopyRect либо работать через ImageList. В любом случае понадобится таймер и буферное изображение. В процедуре таймера, должен меняться Frame кадра и потом там же по сути в таймерном событии - отрисовка:
Код:
|
14.09.2013, 12:24 | #4 |
Пользователь
Регистрация: 08.02.2013
Сообщений: 10
|
Похоже, что проще использовать GIF анимацию с помощью дополнительных компонентов... А какой из вариантов на ваш взгляд лучше?
|
14.09.2013, 16:14 | #5 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Крайне неудобная система хранения анимации, с последующими тормозными операциями вычленения кадра. Гораздо проще и эффективнее хранить анимацию в "портянке", т.е. в одну полоску кадра. В начале анимации сдвиг кадра равен 0, участок портянки начальный левый. При достижении конца процедуры таймера, на смене кадров, сдвиг увеличивается на длину кадра, т.е. сложение. Отрисовка использует готовый сдвиг и вырежет тем же TRect следующий кадр. И, естественно, нужно элементарное условие конца портянки анимации, тут сравнение сдвига с длиной графического файла анимации.
Ещё проще "нарезать" анимацию по собственным кадрам в одномерный массив типа array of TBitmap. Тут у каждого кадра есть номер, ...обращаемся к ячейке и выводим в буфер. Нужен элементарный счётчик кадров с условием перехода на 0-й кадр.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
14.09.2013, 17:41 | #6 | |
Пользователь
Регистрация: 31.08.2013
Сообщений: 93
|
Цитата:
Но это может быть не лучшим решением если текстура загружается в видеопамять. Она должна быть квадратная. Хотя топикстартером и не обозначено где и как должна ипользоваться эта текстура, но я уже вперед забежал, судя по всему использоваться она будет в какой нибудь игре. А если игра начнет разрастаться то Tbitmap явно начнет не хватать, в ход пойдет DirectX или OpenGL и все... И понеслась!!! |
|
14.09.2013, 17:58 | #7 | |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Цитата:
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
|
14.09.2013, 18:39 | #8 | |
Пользователь
Регистрация: 31.08.2013
Сообщений: 93
|
Цитата:
Сейчас погуглил немного: - Действительно, люди используют всякие текстуры. Видимо информация о их "квадратности" сильно устарела и была направлена на "очень" древние видеокарточки с объемом 8-16 Мб, при том это не означало что неквадратную текстуру нельзя в них использовать, а означало то, что это сильно снижало производительность этих карточек, а так же такие текстуры занимали слишком много видео памяти, гораздо больше чем сами текстуры... Но насколько я понял, в данный момент роль играет не только кратность 2, но и кратность сторон текстуры. Т.Е. если высота текстуры 32, то ширина может быть 64, 96, 128 и.т.д и.т.п... например текстура 32x320 - это "правильная" текстура, а 32x322 - "неправильная"... Или это тоже не важно? |
|
14.09.2013, 20:07 | #9 | |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Цитата:
Если текстура по ширине или высоте не делится на 4, то остатки текстуры в 3, 2, 1 пиксель будут обрабатываться отдельно с "коротких" 64-битных, 32-битных регистрах, теряя на этом время. Со стандартными наборами Canvas или WinApi GDI можно не заморачиваться, т.к. обрабатывается за такт только 1 пиксель, применять можно произвольные размеры текстуры.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Pascal. Любо построить график, либо воспроизвести анимацию, либо программу для редактирования анимации | bchouse1 | Помощь студентам | 0 | 03.04.2012 20:33 |
Завис программы при попытки воспроизвести анимацию | АуМ | Мультимедиа в Delphi | 1 | 21.11.2011 22:12 |
Как нарисовать на форме в delphi анимацию? | Yamkin | Помощь студентам | 10 | 13.04.2011 17:50 |
Как установить и воспроизвести | cargo29 | Мультимедиа в Delphi | 2 | 08.04.2011 20:40 |
Delphi: как поместить анимацию (без звука) в отдельный поток? | ex.cluz | Помощь студентам | 0 | 15.01.2010 14:26 |