2
0

ggi1.pp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // (c) 1999 Sebastian Guenther
  2. {$MODE objfpc}
  3. {$H-}
  4. program GGI1;
  5. uses GGI;
  6. const
  7. WhiteColor: TGGIColor = (r: $ffff; g: $ffff; b: $ffff; a: 0);
  8. StarCount = 500;
  9. Frame: Integer = 0;
  10. type
  11. TStar = record
  12. x, y, z: Integer;
  13. end;
  14. var
  15. Visual: TGGIVisual;
  16. mode: TGGIMode;
  17. ScreenW, ScreenH: Integer;
  18. i, rx, ry: Integer;
  19. angle: Single;
  20. White: TGGIPixel;
  21. Stars: array[1..StarCount] of TStar;
  22. begin
  23. if ggiInit <> 0 then
  24. begin
  25. WriteLn(StdErr, 'Initialization of GGI failed');
  26. Halt(2);
  27. end;
  28. Visual := ggiOpen(nil, []); // Open default visual
  29. if not Assigned(Visual) then
  30. begin
  31. WriteLn(StdErr, 'Could not get default visual');
  32. Halt(3);
  33. end;
  34. ggiSetFlags(Visual, GGIFLAG_ASYNC);
  35. ggiParseMode({'S640x480[GT_8BIT]'}'', mode);
  36. ggiSetMode(Visual, mode);
  37. ggiGetMode(Visual, mode);
  38. ScreenW := mode.Virt.x;
  39. ScreenH := mode.Virt.y;
  40. WriteLn('Screen size: ', ScreenW, ' x ', ScreenH);
  41. White := ggiMapColor(Visual, WhiteColor);
  42. for i := 1 to StarCount do
  43. begin
  44. Stars[i].x := Random(ScreenW) - ScreenW div 2;
  45. Stars[i].y := Random(ScreenH) - ScreenH div 2;
  46. Stars[i].z := Random(99) + 1;
  47. end;
  48. angle := 0.0;
  49. while ggiKbhit(Visual) = 0 do
  50. begin
  51. ggiSetWriteFrame(Visual, Frame);
  52. ggiFillscreen(Visual);
  53. for i := 1 to StarCount do
  54. begin
  55. // the following is not as optimized as it could be...
  56. rx := Trunc(Sin(angle) * Stars[i].x + Cos(angle) * Stars[i].y) * 50 div Stars[i].z + (ScreenW div 2);
  57. ry := Trunc(Cos(angle) * Stars[i].x - Sin(angle) * Stars[i].y) * 50 div Stars[i].z + (ScreenH div 2);
  58. ggiPutPixel(Visual, rx, ry, White);
  59. if Stars[i].z = 1 then
  60. Stars[i].z := Random(99) + 1
  61. else
  62. Dec(Stars[i].z);
  63. end;
  64. angle := angle + 0.01;
  65. ggiFlush(Visual);
  66. Frame := (Frame + 1) mod mode.Frames;
  67. ggiSetDisplayFrame(Visual, Frame);
  68. end;
  69. ggiClose(Visual);
  70. ggiExit;
  71. end.