demo15.pas 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. program demo15;
  2. {$I zglCustomConfig.cfg}
  3. uses
  4. zgl_screen,
  5. zgl_window,
  6. zgl_timers,
  7. zgl_keyboard,
  8. zgl_mouse,
  9. zgl_textures,
  10. zgl_textures_png,
  11. zgl_font,
  12. zgl_text,
  13. zgl_primitives_2d,
  14. zgl_sprite_2d,
  15. zgl_video,
  16. zgl_video_theora,
  17. zgl_utils
  18. ;
  19. var
  20. dirRes : UTF8String {$IFNDEF MACOSX} = '../data/' {$ENDIF};
  21. fntMain : Byte;
  22. video : zglPVideoStream;
  23. videoSeek: Boolean;
  24. TimeStart: Byte;
  25. procedure Init;
  26. begin
  27. fntMain := font_LoadFromFile(dirRes + 'font.zfi');
  28. // EN: Open the video file.
  29. // RU: Îòêðûòü âèäåî ôàéë.
  30. video := video_OpenFile(dirRes + 'video.ogv');
  31. setTextScale(15, fntMain);
  32. end;
  33. procedure Draw;
  34. begin
  35. if Assigned(video) Then
  36. begin
  37. // EN: Rendering the current video frame in the center of screen using parameters of it from video.Info.
  38. // RU: Ðåíäåðèíã òåêóùåãî êàäðà âèäåî â öåíòðå ýêðàíà èñïîëüçóÿ ïàðàìåòðû èç video.Info.
  39. ssprite2d_Draw(video.Texture, (800 - video.Info.Width) / 2, (600 - video.Info.Height) / 2, video.Info.Width, video.Info.Height, 0);
  40. // EN: Rendering of progress bar.
  41. // RU: Ðåíäåðèíã ïîëîñû ïðîãðåññà.
  42. pr2d_Rect(0, 600 - 100, 800, 20, $00FF00, 255);
  43. pr2d_Rect(0, 600 - 100, (800 / video.Info.Duration) * video.Time, 20, $00FF00, 155, PR2D_FILL);
  44. text_Draw(fntMain, 0, 0, 'FPS: ' + u_IntToStr(zgl_Get(RENDER_FPS)));
  45. text_Draw(fntMain, 0, 20, 'Frame: ' + u_IntToStr(video.Frame));
  46. text_Draw(fntMain, 100, 0, 'Duration: ' + u_FloatToStr(video.Info.Duration / 1000));
  47. text_Draw(fntMain, 100, 20, 'Frames: ' + u_IntToStr(video.Info.Frames));
  48. text_Draw(fntMain, 230, 0, 'Time: ' + u_FloatToStr(video.Time / 1000));
  49. end;
  50. end;
  51. procedure Timer;
  52. begin
  53. // EN: If left mouse button is down on progress bar, then seek the video.
  54. // RU: Åñëè çàæàòà ëåâàÿ êíîïêà ìûøè íàä ïîëîñîé ïðîãðåññà - ïåðåìåùàòüñÿ ïî âèäåî.
  55. if mBUpDown(M_BLEFT_DOWN) and (mouse_Y > 500) and (mouse_Y < 520) Then
  56. begin
  57. videoSeek := TRUE;
  58. video_Seek(video, (mouse_X / 800) * video.Info.Duration);
  59. end else
  60. videoSeek := FALSE;
  61. key_ClearState();
  62. mouse_ClearState();
  63. end;
  64. procedure Update(dt: Double);
  65. begin
  66. if not videoSeek Then
  67. video_Update(video, dt, TRUE);
  68. end;
  69. Begin
  70. randomize();
  71. TimeStart := timer_Add(@Timer, 16, Start);
  72. zgl_Reg(SYS_LOAD, @Init);
  73. zgl_Reg(SYS_DRAW, @Draw);
  74. zgl_Reg(SYS_UPDATE, @Update);
  75. wnd_SetCaption(utf8_Copy('15 - Video'));
  76. zgl_Init();
  77. End.