Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 2D анимация 
:(
    Опции темы
cardinal
Дата 18.2.2005, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



И так приступим.

Для работы нам понадобиться 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
    


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

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

З.З.Ы. Надеюсь она кому ни будь поможет.


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0579 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.