ggi1.pp 2.2 KB

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