demo05.pas 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. program demo05;
  2. {$I zglCustomConfig.cfg}
  3. {$I zgl_config.cfg}
  4. uses
  5. {$IFDEF UNIX}
  6. cthreads,
  7. {$ENDIF}
  8. {$IfDef USE_ZENGL_STATIC}
  9. zgl_screen,
  10. zgl_window,
  11. zgl_timers,
  12. zgl_keyboard,
  13. zgl_fx,
  14. zgl_render_2d,
  15. zgl_primitives_2d,
  16. zgl_primitives_2dEX,
  17. zgl_types,
  18. zgl_math_2d,
  19. {$IfNDef OLD_METHODS}
  20. gegl_color,
  21. {$EndIf}
  22. zgl_utils
  23. {$Else}
  24. zglHeader
  25. {$EndIf}
  26. ;
  27. var
  28. calc : Integer;
  29. points : array[ 0..359 ] of zglTPoint2D;
  30. TimeStart : LongWord = 0;
  31. {$IfNDef OLD_METHODS}
  32. dirRes : UTF8String {$IFNDEF MACOSX} = '../data/' {$ENDIF};
  33. newColor: array[0..1] of LongWord;
  34. {$EndIf}
  35. {$IfNDef OLD_METHODS}
  36. // RU: это для создания ломанных линий. Можно создать динамический массив и делать
  37. // линии с произвольным количеством точек.
  38. // EN: this is for creating broken lines. You can create a dynamic array and draw
  39. // lines with an arbitrary number of points.
  40. myPointArray: array[0..3] of zglTPoint2DColor;
  41. deltaX, deltaY: array [0..3] of Integer;
  42. {$EndIf}
  43. procedure Init;
  44. var
  45. i : Integer;
  46. begin
  47. for i := 0 to 359 do
  48. begin
  49. points[ i ].X := 400 + m_Cos( i ) * ( 96 + random( 32 ) );
  50. points[ i ].Y := 300 + m_Sin( i ) * ( 96 + random( 32 ) );
  51. end;
  52. {$IfNDef OLD_METHODS}
  53. // Rus: устанавливаем новый цвет. Которого нет в списке стандартных. Все константы в gegl_color.
  54. // Eng: set a new color. Which is not in the standard list. All constants in gegl_color.
  55. newColor[0] := Color_FindOrAdd($0000009B);
  56. newColor[1] := Color_FindOrAdd($FFFFFF4B);
  57. myPointArray[0].X := 20;
  58. myPointArray[0].Y := 20;
  59. myPointArray[0].Color := cl_Red;
  60. myPointArray[1].X := wndWidth - 20;
  61. myPointArray[1].Y := 20;
  62. myPointArray[1].Color := cl_Blue;
  63. myPointArray[3].X := wndWidth - 80;
  64. myPointArray[3].Y := wndHeight - 20;
  65. myPointArray[3].Color := cl_Green;
  66. myPointArray[2].X := 80;
  67. myPointArray[2].Y := wndHeight - 20;
  68. myPointArray[2].Color := cl_Yellow;
  69. deltaX[0] := 1; deltaY[0] := 1;
  70. deltaX[1] := - 1; deltaY[1] := 1;
  71. deltaX[2] := - 1; deltaY[2] := - 1;
  72. deltaX[3] := 1; deltaY[3] := - 1;
  73. {$EndIf}
  74. end;
  75. procedure Draw;
  76. var
  77. i : Integer;
  78. begin
  79. batch2d_Begin;
  80. // RU: Устанавливаем цвет и альфу для каждой вершины.
  81. // EN: Set color and alpha for each vertex.
  82. fx2d_SetVCA( $FF0000, $00FF00, $0000FF, $FFFFFF, 255, 255, 255, 255 );
  83. // RU: Рисуем прямоугольник с заливкой(флаг PR2D_FILL) с использованием отдельных цветов для каждой вершины(флаг FX2D_VCA).
  84. // EN: Render filled rectangle(flag PR2D_FILL) and use different colors for each vertex(flag FX2D_VCA).
  85. pr2d_Rect( 0, 0, 800, 600, {$IfDef OLD_METHODS}$000000, 255{$Else}cl_Black{$EndIf}, FX2D_VCA or PR2D_FILL );
  86. // RU: мне лень переделывать под старые методы, потому просто отключаю. Но сама линия приспособлена к использованию старых методов,
  87. // вы можете сами потренироваться и реализовать использование этой функции для старых методов.
  88. // EN: I'm too lazy to remake under the old methods, so I just turn it off. But the line itself is adapted to use the old methods,
  89. // you can practice and implement the use of this function for old methods.
  90. {$IfNDef OLD_METHODS}
  91. // RU: рисуем широкую ломанную линию. Каждая точка имеет свой цвет, ширина линии 10 пикселей.
  92. // EN: draw a wide broken line. Each point has its own color, the line width is 10 pixels.
  93. pr2d_LineStripEX(@myPointArray, 4, 0, 10, LINE_RGBA);
  94. {$EndIf}
  95. // RU: Рисуем в центре экрана круг с радиусом 128 пиксела.
  96. // EN: Render circle in the center of screen with radius 128 pixels.
  97. pr2d_Circle( 400, 300, 128, {$IfDef OLD_METHODS}$000000, 155{$Else}newColor[0]{$EndIf}, 32, PR2D_FILL );
  98. // RU: Рисуем линии внутри круга.
  99. // EN: Render lines inside the circle.
  100. for i := 0 to 359 do
  101. pr2d_Line( 400, 300, points[ i ].X, points[ i ].Y, {$IfDef OLD_METHODS}$FFFFFF, 255{$Else}cl_White{$EndIf} );
  102. // RU: Рисуем эллипсы с заливкой и без, со сглаженными контурами(флаг PR2D_SMOOTH).
  103. // EN: Render filled ellipses with smoothed edges(flag PR2D_SMOOTH).
  104. pr2d_Ellipse( 400 + 300, 300, 64, 256, {$IfDef OLD_METHODS}$FFFFFF, 75{$Else}newColor[1]{$EndIf}, 64, PR2D_FILL or PR2D_SMOOTH );
  105. pr2d_Ellipse( 400 + 300, 300, 64, 256, {$IfDef OLD_METHODS}$000000, 255{$Else}cl_Black{$EndIf}, 32, PR2D_SMOOTH );
  106. pr2d_Ellipse( 400 - 300, 300, 64, 256, {$IfDef OLD_METHODS}$FFFFFF, 75{$Else}newColor[1]{$EndIf}, 64, PR2D_FILL{ or PR2D_SMOOTH });
  107. pr2d_Ellipse( 400 - 300, 300, 64, 256, {$IfDef OLD_METHODS}$000000, 255{$Else}cl_Black{$EndIf}, 32, PR2D_SMOOTH );
  108. batch2d_End;
  109. end;
  110. procedure Timer;
  111. var
  112. i: Integer;
  113. begin
  114. INC( calc );
  115. if calc > 359 Then
  116. calc := 0;
  117. points[ calc ].X := 400 + m_Cos( calc ) * ( 96 + random( 32 ) );
  118. points[ calc ].Y := 300 + m_Sin( calc ) * ( 96 + random( 32 ) );
  119. {$IfNDef OLD_METHODS}
  120. for i := 0 to 3 do
  121. begin
  122. if (myPointArray[i].X > wndWidth - 20) or (myPointArray[i].X < 20) then
  123. deltaX[i] := - deltaX[i];
  124. if (myPointArray[i].Y > wndHeight - 20) or (myPointArray[i].Y < 20) then
  125. deltaY[i] := - deltaY[i];
  126. myPointArray[i].X := myPointArray[i].X + deltaX[i];
  127. myPointArray[i].Y := myPointArray[i].Y + deltaY[i];
  128. end;
  129. {$EndIf}
  130. end;
  131. Begin
  132. {$IFNDEF USE_ZENGL_STATIC}
  133. if not zglLoad( libZenGL ) Then exit;
  134. {$ENDIF}
  135. TimeStart := timer_Add( @Timer, 16, t_Start );
  136. zgl_Reg( SYS_LOAD, @Init );
  137. zgl_Reg( SYS_DRAW, @Draw );
  138. wnd_SetCaption(utf8_Copy('05 - Primitives'));
  139. zgl_Init();
  140. End.