Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:

Error. Page cannot be displayed. Please contact your service provider for more details. (10)


2D анимация

Поиск:
И так приступим.

Для работы нам понадобиться API функция - BitBlt.

Функция BitBlt выполняет передачу битовых блоков данных о цвете, соответствующих прямоугольнику пикселей из заданного исходного контекста устройства в целевой контекст устройства. И лежит она в Gdi32.lib

А вот её С прототип:

Код


BOOL BitBlt(
HDC hdcDest, // дескриптор целевого контекста устройства
int nXDest,  // X-координата левого верхнего угла целевого прямоугольника
int nYDest,  // Y-координата левого верхнего угла целевого прямоугольника
int nWidth,  // ширина целевого прямоугольника
int nHeight, // высота целевого прямоугольника
HDC hdcSrc,  // дескриптор исходного контекста устройства
int nXSrc,   // X-координата левого верхнего угла исходного прямоугольника
int nYSrc,   // Y-координата левого верхнего угла исходного прямоугольника
DWORD dwRop  // код операции
);



А возвращает эта функция не ноль если все прошло успешно и ноль если в чем то проблема.

Жутко выглядит на первый взгляд, не правда ли?
Но не пугайтесь ни чего страшного в ней нет.

Переходим к практике.
Первым делам создаем новый проект. И объявляем в области General нашу функцию. А объявляется она следующим образом:

Код


Private Declare Function BitBlt Lib "gdi32" _
 (ByVal hDestDC As Long, _
  ByVal X As Long, _
  ByVal Y As Long, _
  ByVal nWidth As Long, _
  ByVal nHeight As Long, _
  ByVal hSrcDC As Long, _
  ByVal xSrc As Long, _
  ByVal ySrc As Long, _
  ByVal dwRop As Long) As Long



Дальше мы опишем несколько глобальных переменных необходимых нам для работы:

Код


Dim PicHeight As Single 'высота картинки
Dim PicWidth As Single,'ширина картинки
Dim SKadr As Integer 'счетчик кадров



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

И так у меня получилось 6 изображений (кадров) и соответственно 6 изображений масок.
Дальше мы открываем нашу форму и устанавливаем свойство AutoRedraw в значение True. Теперь на понадобиться массив из 6 Image, в которые мы загрузим наши кадры и 6 Image, в которые мы загрузим наши маски. Внимательно следите что бы кадр и маска к этому кадру имели одинаковые индексы. Первый массив мы назовем Kadr(), а второй соответственно Msk(). Установим у всех Image свойства Visible=False, AutoRedraw=True, AutoSize=True.
Теперь бросаем на форму таймер и устанавливаем свойство Interval ну например 50.
И еще на понадобиться два PictureBox для вывода нашего изображения. Кстати их тоже сделаем невидимыми Visible=False.

Все приготовления завершены, приступаем к кодингу:

Первое что мы делаем это узнаем размер картинки которую мы будем показывать:


Код


Private Sub Form_Load()
Skadr=0
PicHeight = Kadr(SKadr).Width
PicWidth = Kadr(SKadr).Height
End Sub



Теперь добавим процедуру в наш таймер.

Код


Private Sub Timer1_Timer()

Me.Cls 'Очистим нашу форму

PictureBox1.Picture = Msk(i).Picture
PictureBox2.Picture = Kadr(i).Picture

'Приступим к рисованию
BitBlt Me.hDC, 0, 0, PicWidth, PicHeight, PictureBox1.hDC, 0, 0, vbMergePaint
BitBlt Me.hDC, 0, 0, PicWidth, PicHeight, PictureBox2.hDC, 0, 0, vbSrcAnd

'Обновимся
Me.Refresh

'Увеличиваем счетчик кадров
'и если счетчик превосходит количество кадров возвращаем его в 0
SKadr = SKadr + 1
If SKadr > (Kadr.Count - 1) Then SKadr = 0

End Sub



Все готово!!! Можете пробывать запускать проект и наблюдать как у вас на форме происходит невообразимой кросаты действо называемое анимацией

З.Ы.Статья не претендует на полноту изложения, она просто описывает один из вариантов воспроизведения анимации.

З.З.Ы. Надеюсь она кому ни будь поможет.
Автор: ~FoX~






Просмотров: 3323

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную