Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Мультфильмы


Автор: Coca-colchic 15.5.2004, 21:30
Как делать мультфильмы в Basic?
Например, я сделал рисунки в формате .bmp, как теперь их в Basic прокрутить, чтобы сделать мульт?
P. s. Желательно поподробнее пожалуйста exclamation.gif biggrin.gif

Автор: chipset 16.5.2004, 20:34
Фиг с ним, кодируй в jpg... BMP огромнющие wow.gif
Таймер просто настрой, сделай массив строк на файлы, а вот как JPG просматривать в VB я не знаю sad.gif

Автор: Guest 16.5.2004, 20:56
А можно по-подробнее что писать в таймере и что надо делать, чтобы туда засунуть музыку, звуки? sarcasm.gif

Автор: bankuss 17.5.2004, 15:37
ерундой занимаетесь... для мультиков есть другие языки программирования, например flash
или накрайняк dark basic

Автор: Vach 17.5.2004, 16:42
Пример:
http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=29885&lngWId=1
Удачи.

Автор: Guest 17.5.2004, 17:43
А где flash скачать? Только скажите русский сайт. И flash белплатный?

Автор: bankuss 18.5.2004, 07:13
Компакт диски с этим флэшем на каждом углу продаются smile.gif
Документации и книжек тоже завались. Изучай! Может Масяню-2 сделаешь smile.gif

Автор: chipset 18.5.2004, 07:19
Да.. я помню когда вращающуюся луну сделал на VB то прыгал от радости...
эх... tounge.gif

Автор: Некто 18.5.2004, 07:35
А если на VB хочешь писать, то вот что надо: создаешь элементы Image (в каждом один кадр), обЪединяешь их в массив (даешь одинаковые имена), создаешь таймер с интервалом придется поиграть, чтобы выбрать самую подходящую смену кадров, а вот код:
Код

Dim i As Long

Private Sub Timer1_Timer()
Image(i).Visible = True
If i <> 0 Then
Image(i - 1).Visible = False
End If
If i = 99 Then
Timer1.Enabled = False
End If
End Sub

Число 99 зависит от числа кадров.

Автор: Гость_виктор 22.5.2004, 12:04
Как в VB делаются библиотеки с открытыми функциями или процедурами

Автор: cardinal 25.5.2004, 01:47
Цитата
А где flash скачать? Только скажите русский сайт. И flash белплатный?

Coca-colchic, ты почему вобще это дело в VB затеял? И почему ты тогда так испугался, когда тебе сказали, что для этого есть flash? Ну есть. Ну и что. Посмотри пример, который тебе Vach дал. Проще некуда! Лично я во flash'е ничего не соображаю, но кажется мне, что во flash'e легче чем в этом примере не будет. Может я ошибаюсь...
Добавлено @ 01:48
Цитата
Как в VB делаются библиотеки с открытыми функциями или процедурами

Модератор: Пожалуйста, один топик - один вопрос.

Автор: ulukbek 22.9.2004, 12:02
Как добавить учетную запись (почту) в Outlook Express 5 из yahoo.com

Автор: Desdichado 11.11.2004, 11:54
Cразу скажу, что Visual Basic не подходит для создания мультфильмов, для этого надо использовать какой-нибудь другой редактор. Но иногда в программе необходимо сделать маленькое слайд шоу или еще что-нибудь, что требует смены рисунков с заданным интервалом времени, средства Visual Basic'а это позволяют.

Подготовка рисунков (кадров).
Для начала нарисуйте несколько рисунков (кадров) для вашего мультфильма, это можно сделать в любом графическом редакторе и сохраните их с именами 0.*, 1.*, 2.* : (*.bmp, *.gif, *jpg) Запустите Visual Basic и создайте новый проект.

Визуальное проектирование.
Откройте форму, выберите Image (рисунок) в панели инструментов и поместите элемент Image на форму. Нажмите на добавленный элемент Image, в панели Properties в свойство Name, впишите "imgPicture", найдите свойство Visible и установите его как False.

Затем необходимо создать массив элементов Image. Нажмите на ваш элемент Image, который вы назвали, как "imgPicture". Нажмите Ctrl+C, что бы скопировать элемент Image в буфер обмена. Затем нажмите Ctrl+V. У вас на экране появится сообщение: "You already have a control named 'imgPicture'. Do you want to create a control array?" (перевод: "У вас уже есть элемент с именем 'imgPicture'. Хотите ли вы создать массив элементов?).

Нажмите Yes (Да). На форму добавится еще один элемент Image с именем imgPicture и порядковым номером 1. Обратите внимание, что элемент Image, который был добавлен первым, получил номер 0. Порядковый номер элемента определяется свойством Index. В панели Properties вы можете увидеть, что свойство Index одного из элементов равно 0, а другого 1. Нажмите на элемент imgPicture(0) и в панели Properties найдите Picture, справа от этого свойства нажмите на маленькую кнопочку ":" и в открывшемся окне выберите файл с первым кадром вашего мультфильма, если вы еще не нарисовали кадры, сделайте это. Рисунок, который вы выбрали, появится в элементе imgPicture(0). То же сделайте для imgPicture(1). Для добавления новых элементов Image, щелкните по любому из уже созданных элементов (imgPicture(0) или imgPicture(1)) и нажмите Ctrl+C, а затем нажмите Ctrl+V. Создайте их столько, сколько кадров вы нарисовали, но не забывайте, что первый элемент имеет номер 0 (например, если вы создали 5 кадров, то последний элемент будет иметь номер 4). Так же не забудьте вставлять в них ваши рисунки (кадры).

После этого выберите PictureBox в панели инструментов и поместите графическое окно на форму. Нажмите на только что созданное окно и в панели Properties в свойство Name, впишите "picPicture", найдите свойство AutoSize и установите его как True.

Теперь на панели инструментов найдите значок Timer и дважды щелкните по нему. Элемент Timer добавится на форму. Нажмите на него и в панели Properties в свойство Name, впишите "tmrTimer". Теперь необходимо установить интервал смены рисунков. В панели Properties найдите Interval, впишите туда что-нибудь типа 100, это означает, что ваши рисунки будут меняться с интервалом в 100 миллисекунд.

Пишем программный код.
Откройте окно программного кода (View-Code), впишите:

Dim y As Integer

Вы объявили глобальную переменную y.
Затем перейдите обратно на форму (View-Object) и дважды щелкните по таймеру (tmrTimer), откроется окно программного кода, введите:

y = y + 1: If y = imgPicture.Count Then y = 0 picPicture.Picture = imgPicture(y).Picture

Теперь каждые 100 миллисекунд переменная "y" будет увеличиваться на 1 и рисунок в picPicture будет равен рисунку imgPicture(y). Если переменная "y" достигнет значения равного номеру последнего кадра (imgPicture.Count), то мультфильм начнет проигрываться заново.

Заключение.
Вы закончили работу над программой теперь посмотрим на нее в действии. Нажмите F5 или щелкните на кнопку со стрелкой повернутой вправо, которая расположена на панели инструментов. Если вы все сделали правильно, программа запустится, и вы увидите, как в picPicture меняются рисунки

Автор: Akina 11.11.2004, 12:13
Цитата
y = y + 1: If y = imgPicture.Count Then y = 0

y=(y+1) MOD imgPicture.Count

Автор: Гость_Старуха 11.11.2004, 12:56
Вот в Интернете нашла.
Анимация
Ура!!! Я так долго ждал этого момента! Сейчас ты научишься работать с анимацией.
Как мы все знаем фильм это набор картинок, последовательно сменяющих друг друга. В VB картинки сменяться будут с помощью таймера - оно и понятно, любое движение это движение во времени.
Сейчас мы сделаем мультик из девятнадцати кадров, для этого расположи двадцать объектов Image. Для удобства у первого изображения оставь стандартное имя, а у остальных с img1 до img19 и присвой каждой по последовательной картинке соответственно. Расположи на форме таймер и установиу него Interval как 1 и выключи его. Расположи на форме кнопку, по нажатии которой мы и включим наш таймер.
Не буду тебя долго мучить, вот код для мультика:

Dim a As Integer

Private Sub Command1_Click()
Timer1.Enabled = True
a = 19
Command1.Visible = False
End Sub

Private Sub Timer1_Timer()
a = a - 1

If a = 19 Then
Image1.Picture = img1.Picture
End If
If a = 18 Then
Image1.Picture = Img2.Picture
End If
If a = 17 Then
Image1.Picture = Img3.Picture
End If
If a = 16 Then
Image1.Picture = Img4.Picture
End If
If a = 15 Then
Image1.Picture = Img5.Picture
End If
If a = 14 Then
Image1.Picture = Img6.Picture
End If
If a = 13 Then
Image1.Picture = Img7.Picture
End If
If a = 12 Then
Image1.Picture = Img8.Picture
End If
If a = 11 Then
Image1.Picture = img9.Picture
End If
If a = 10 Then
Image1.Picture = img10.Picture
End If
If a = 9 Then
Image1.Picture = img11.Picture
End If
If a = 8 Then
Image1.Picture = img12.Picture
End If
If a = 7 Then
Image1.Picture = img13.Picture
End If
If a = 6 Then
Image1.Picture = img14.Picture
End If
If a = 5 Then
Image1.Picture = img15.Picture
End If
If a = 4 Then
Image1.Picture = img16.Picture
End If
If a = 3 Then
Image1.Picture = img17.Picture
End If
If a = 2 Then
Image1.Picture = img18.Picture
End If
If a = 1 Then
Image1.Picture = img19.Picture
End If
If a = 1 Then
a = 19
End If
End Sub
Никогда не используй для анимации картинки формата Jpeg (*.jpg) или прочие сжатые файлы! При распаковке получается эффект мерцания, это занимет дополнительные ресурсы процессора и памяти! Используй только "чистые" картинки (*.bmp).
Запомни! Сэкономишь на размере - потеряешь в качестве, а на качестве не экономят!!!

Автор: korob2001 11.11.2004, 19:36
Может я ошибаюсь, но помоему вместо всех этих условий If....End If гораздо разумнее воспользоваться Select Case a ..... End Select.

Автор: cardinal 11.11.2004, 19:38
Старуха, а не проще каждому img по индексу раздать? smile
Код

Dim a As Integer

Private Sub Command1_Click()
Timer1.Enabled = True
a = 19
Command1.Visible = False
End Sub

Private Sub Timer1_Timer()
a = a - 1
Image1.Picture = img(a).Picture
End Sub

Ну и таймер неплохо было бы выключить если он больше не нужен.

Автор: Staruha 11.11.2004, 20:54
Ну вот я думаю можно тему закрывать smile
(а тот код из обучалки ,для начинающих) smile

Автор: korob2001 11.11.2004, 22:16
Меня интересует по данной теме ещё такой вопрос:
Каким способом лучше всего создавать анимацию? С помощью таймера или цикла с DoEvents?
У меня в одной книге написано что с циклом можно добиться большей скорости смены кадров, чем с таймером.

Модератору:
Извини что не создал отдельный топ для данной темы, просто вопрос вполне подходит под эту тему.

Автор: -Mikle- 11.11.2004, 22:41
Да хоть че используй, смотря с какой скоростью тебе анимировать надо...
На таймер, больше чем 40 кадров в секунду не рассчитывай...
в цикле, можно и больше добиться...

Автор: korob2001 11.11.2004, 22:44
Всё понял. Спасибо.

Автор: cardinal 11.11.2004, 23:47
Цитата(korob2001 @ 11.11.2004, 21:16)
Каким способом лучше всего создавать анимацию?

Прямым обращением к видео карте smile

Автор: -Mikle- 12.11.2004, 00:13
Цитата(cardinal @ 12.11.2004, 03:47)
Прямым обращением к видео карте

И напрямую из VB, минуя всякие там DirectX'ы smile

Автор: Гость_Vladimir 17.2.2005, 12:52
Кто нибудь знает как настроить Outlook Express на Yahoo.com
у меня нихрена не получается
что писать в строке сервера pop3 и smtp

Автор: cardinal 17.2.2005, 18:27
Модератор: Пожалуйста, один топик - один вопрос.

Автор: Exception 17.2.2005, 18:31
Цитата
Кто нибудь знает как настроить Outlook Express на Yahoo.com
у меня нихрена не получается
что писать в строке сервера pop3 и smtp

На топик посмотри! Хренась, "Анимация"!!!
При чем тут Outlook, Yahoo.com и pop3 с smtp???
Ты кажца заблудился smile

Автор: ~FoX~ 18.2.2005, 11:33
Вот если кому интересно, я тут статейку накатал.......

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 'счетчик кадров



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

И так у меня получилось 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



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

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

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

Автор: cardinal 18.2.2005, 18:33
Уже в FAQ'e smile

http://vingrad.ru/VB-ART-002308

Автор: Voldemar2004 4.4.2005, 21:14
Вот посмотрите:
Timer.Index = 0,
2-a PictureBox

в General

Код

Const f_name = "mult.bmp"   ' имя файла, содержащего
                            ' кадры фильма
Const Nframe = 5           ' количество кадров в фильме
                            '(для данного файла)
Dim fW As Integer           ' ширина и высота кадра
Dim fH As Integer
Dim currentFrame As Integer ' номер текущего кадра



Код


Private Sub Form_Initialize()
   Picture2.Visible = False
   Picture2.AutoSize = True
   ' фильм загружается в Picture2 полностью, а затем
   ' по кадрам выводится в Picture1
   Picture2.Picture = LoadPicture(CurDir + "\" + f_name)
           
   fW = Round(Picture2.Width / Nframe)
   fH = Picture2.Height
   
   Picture1.Height = fH
   Picture1.Width = fW
   
   currentFrame = 1
   
   Timer1.Interval = 100
   Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
   ' если выводились все кадры -  переход к первому
   If currentFrame > Nframe Then currentFrame = 1
      
   ' вывод кадра
   Picture1.PaintPicture Picture2.Picture, _
   0, 0, , , fW * (currentFrame - 1), 0, fW, fH
   ' PaintPicture выводит часть Picture2.Picture в
   ' Picture1.Picture:
   ' 0, 0 - координаты левого верхнего угла области вывода,
   ' fW * (currentFrame - 1), 0 - координаты начала области,
   ' из которой будет копироваться изображение,
   ' fW, fH - размеры копируемой области
    
   currentFrame = currentFrame + 1
End Sub


Добавлено @ 21:19
ПРимер взял из "Освой на примерах", Никита Культин автор книги. В качестве фоток хотел использовать свой аватарчик (Осла из Фильма), но сделал Ogg Vorbis Fish.
ЧЕрт потерял у вас тут кнопку "присоединить файл" - послал бы mult.bmp c примерчиком.

Автор: ~FoX~ 5.4.2005, 08:06
Цитата(cardinal @ 18.2.2005, 19:33)
Уже в FAQ'e

Дякою smile

Автор: cardinal 30.6.2005, 03:24
Цитата
Дякою

smile

Автор: korob2001 30.6.2005, 08:53
Дякою == Спасибо
только наверное правильнее будет дякую, а может и нет. smile

Автор: cardinal 2.7.2005, 01:41
Voldemar2004, пожалуйста поменьше флейма...
Цитата(korob2001 @ 30.6.2005, 06:53)
Дякою == Спасибо

Спасибо, буду знать...

Автор: Xeim 3.12.2005, 14:34
Я бы тоже мультик на ВБ зделал, да лень читать всю эту ерунду. А так вобще хорошо написано. Зачот.
Помню раньше делал кучу хороших мультиков. Но никто не заценил (не доходит). smile

Автор: NewSWA 11.12.2005, 05:55
Весь процесс создания можно упростить, для этого в качестве анимации графики используем анимированные *.Gif файлы, а модулей для их проигрывания в нете давольно много. Проблему составляет, как мне кажется, только звук

Автор: KEKCCCP 25.12.2005, 17:51
Desdichado, "%?%?№ писать тут болтовни столько... ! smile smile

Автор: cardinal 26.12.2005, 17:07
Модератор: KEKCCCP, думай в след. раз, что говоришь!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)