![]() |
![]() ![]() ![]() ![]() |
|
Видео формат для использования в играх. Со звуком формата WAV (скоро будет MP3)Delphi , Графика и Игры , Создание игр
Оформил: XVeL Вот типы процедур, которые будут использоваться в статье: 1.StartScene - эта процедура будет выполнятся один раз, и только перед началом Scene, обычно, создает Объекты для Scene и ставит нужные параметры для отрисовки. 2.Scene - эта процедура, выполняемая каждую секунду столько раз сколько у Вас кадров всекунду (FPS) у DxTimer'а, обычно отрисовывает те объекты, которые создавались в StartScene. 3.EndScene - в этой процедуре, обычно, очищают память от тех объектов, которые не будут использованы в других сценах, а использовались только в этой. Сначала укажем в USES что будем использовать Jpeg, потом после слова TYPE пишем:
TIMHeader = record
Face:array[1..5] of char; //Это типа мой идентификатор
fps:byte; //Количество кадров в секунду
Pictures:integer; //Количество картинок в файле
width,height:integer; //Ширина и высота картинок
sound:byte; //Если 1 то звук есть, если 0 то звука нет
soundsize:int64; //Размер звукового файла
end;
//А в поле VAR пишем:
var
schet:integer=1; //Количество картинок-schet=кадров осталось до конца
fs:tfilestream; //Компонент необходимый для чтения файлов
f:TImHeader; //Собственно заголовок Видео Файла
center,str:boolean; //1е - елси нужно ровнять по центру, 2е-растянуть
jpg:TjpegImage;//Картинка Jpeg
Теперь идет процедура типа StartScene:
fs:=tfilestream.Create('Имя файла',fmOpenRead); //Открываем видео файл
fs.Read(f,sizeof(f)); //Читаем заголовок
if f.sound=1 then
begin
m:=tmemorystream.Create;
m.CopyFrom(fs,f.soundsize);
m.Position:=0;
wl.Items.Find('sound').Wave.LoadFromStream(m);
wl.Items.Find('sound').Restore;
end;
timer.Interval:=1000 div f.fps; //Устанавливаем скорость отрисовки картинок(кадры в секунду)
dximagelist.items.clear; //Отчищаем Имэйдж Лист от картинок, для освобождения памяти
dximagelist.Items.Add; //Добавляем один Итэм в Имэйдж Лист (в нем будет лежать каждый кадр видеоролика)
if (f.width=640) or (f.height=480) then //Если картинка например 640х240 то рисуем по центру
center:=true
else
begin
if (f.width=320) and (f.height=240) then //Если картинка пропорциональна 640х480 то растягиваем
str:=true;
end;
jpg:=tjpegimage.create;
dxtimer.Enabled:=true; //Начинаем отрисовку
end;
Ну и наконец сама процедура отрисовки, она ставится на dxdtimer.ontimer или попросту к процедурам типа Scene:
var //Объявляем переменные
size:int64; //Размер изображения в Видео Файле
memo:tmemorystream; //Временый участок памяти под картинку
begin
if not ddraw.CanDraw then exit;
if (schet=1) and (f.sound=1) then //Начинаем с первого кадра играть звук
if dxsound.Initialized then wl.Items.Find('sound').Play(false);
if schet<f.Pictures then //Если картинки в Видео Файле закончились
begin //ТО:
fs.Free; //Закрываем видео файл
endscene; //Конец сцены (процедура типа EndScene)
jpg.free; //Картинку тоже отчищаем
exit; // Далее не продолжаем
end else //А если картинки не закончились то:
inc(schet); //Schet увеличиваем на единицу
memo:=tmemorystream.Create; //Выделяем участок в памяти
fs.Read(size,sizeof(size)); //Читаем из Видео Файла размер изображения
memo.CopyFrom(fs,size); //Загружаем это изображение в память
memo.Position:=0;
jpg.LoadFromStream(memo); //Загружаем в нее изображение
dximagelist.items.Items[0].Picture.Assign(jpg); //Засовываем картинку в Имэйдж Лист
dximagelist.Items.Items[0].Restore; //принимаем изменения
ddraw.Surface.Fill(0); //Заливаем фон черным(в случае если видео непрозрачное или на весь экран, можно не писать)
{Далее 8 строк, проверяем на центрированость и на растяг, потом орисовываем картинку}
if center then
begin
x:=(640-f.width)div 2;
y:=(480-f.height)div 2;
il.Items.Items[0].draw(ddraw.Surface,x,y,0);
end;
if str then il.Items.Items[0].stretchdraw(ddraw.Surface,bounds(0,0,640,480),0);
memo.Free; //Отчищаем память от нарисованой картинки
ddraw.flip; //Переключаем страницу видеопамяти (если эта процедура типа Scene, то можно не писать)
Пример. Перетащите файл file.imp на файл video.exe(Сначала откомпилируйте проект). Программа создающая видео файлы теперь на русском языке. Описание: Hеобходимо, чтобы в папке с программой находились картинки (из которых состоит видео фрагмент) в формате BMP. При этом их названия должны быть, не такие: 1 10 11 12 2 3 4 5 6 7 8 9 А такие: 01 02 03 04 05 06 07 08 09 10 11 12 Чтобы сохранить их порядок! Вот в принципе и всё. В статье описан видеоформат для использования в играх, который использует компоненты DelphiX и Jpeg для отрисовки изображения, с возможностью добавления звука формата WAV (в будущем - MP3). Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш :: Главная :: Создание игр ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 | ||||