demo11.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #define ZGL_IMPORT
  2. #include <memory.h>
  3. #include <math.h>
  4. #include "zglHeader.h"
  5. zglPFont fntMain;
  6. zglPTexture texBack;
  7. zglTGrid2D grid;
  8. float wave;
  9. char resource[256];
  10. char* GetResource( char* FileName )
  11. {
  12. sprintf_s( resource, "../data/%s", FileName );
  13. return resource;
  14. }
  15. void Init()
  16. {
  17. texBack = tex_LoadFromFile( GetResource( "back04.jpg" ) );
  18. fntMain = font_LoadFromFile( GetResource( "font.zfi" ) );
  19. // RU: Инициализация сетки размером 21x16. Основная идея - каждый узел сетки это смещение относительно её верхнего левого угла.
  20. // EN: Initialization of grid with size 21x16. Main idea - every node of grid is an offset from the top left corner.
  21. grid.Cols = 21;
  22. grid.Rows = 16;
  23. grid.Grid = (zglTPoint2D**)malloc( grid.Cols * sizeof( zglTPoint2D* ) );
  24. for ( int i = 0; i < grid.Cols; i++ )
  25. {
  26. grid.Grid[ i ] = (zglTPoint2D*)malloc( grid.Rows * sizeof( zglTPoint2D ) );
  27. for ( int j = 0; j < grid.Rows; j++ )
  28. {
  29. grid.Grid[ i ][ j ].X = i * 40.f;
  30. grid.Grid[ i ][ j ].Y = j * 40.f;
  31. }
  32. }
  33. }
  34. void Draw()
  35. {
  36. // RU: Рендерим сетку в координатах 0,0.
  37. // EN: Render grid in coordinates 0,0.
  38. sgrid2d_Draw( texBack, 0, 0, &grid );
  39. char text[64];
  40. sprintf_s( text, "FPS: %i", zgl_Get( RENDER_FPS ) );
  41. text_Draw( fntMain, 0, 0, text );
  42. }
  43. void Timer()
  44. {
  45. wave = wave + ( rand() % 1000 ) / 10000.f;
  46. float cwave = cos( wave );
  47. float swave = sin( wave );
  48. // RU: Симуляция простого эффекта под водой.
  49. // EN: Simulation of simple underwater effect.
  50. for ( int i = 1; i < grid.Cols - 1; i++ )
  51. for ( int j = 1; j < grid.Rows - 1; j++ )
  52. {
  53. if ( ( i % 2 == 0 ) && ( j % 2 == 0 ) )
  54. {
  55. grid.Grid[ i ][ j ].X = i * 40.f + cwave;
  56. grid.Grid[ i ][ j ].Y = j * 40.f + swave;
  57. }
  58. else
  59. {
  60. grid.Grid[ i ][ j ].X = i * 40.f - cwave;
  61. grid.Grid[ i ][ j ].Y = j * 40.f - swave;
  62. }
  63. }
  64. if ( key_Press( K_ESCAPE ) ) zgl_Exit();
  65. key_ClearState();
  66. }
  67. void Quit()
  68. {
  69. for ( int i = 0; i < grid.Cols; i++ )
  70. free( grid.Grid[ i ] );
  71. free( grid.Grid );
  72. }
  73. int CALLBACK WinMain (
  74. __in HINSTANCE hInstance,
  75. __in_opt HINSTANCE hPrevInstance,
  76. __in_opt LPSTR lpCmdLine,
  77. __in int nShowCmd
  78. )
  79. {
  80. if ( !zglLoad( libZenGL ) ) return 0;
  81. srand( 0xDeaDBeeF );
  82. timer_Add( (void*)&Timer, 16 );
  83. zgl_Reg( SYS_LOAD, (void*)&Init );
  84. zgl_Reg( SYS_DRAW, (void*)&Draw );
  85. zgl_Reg( SYS_EXIT, (void*)&Quit );
  86. wnd_SetCaption( "11 - Grid" );
  87. wnd_ShowCursor( TRUE );
  88. scr_SetOptions( 800, 600, REFRESH_MAXIMUM, FALSE, FALSE );
  89. zgl_Init();
  90. zglFree();
  91. return 0;
  92. }