home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 03 / ldm / world.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-01-02  |  12.2 KB  |  484 lines

  1. (* ------------------------------------------------------ *)
  2. (*                     WORLD.PAS                          *)
  3. (*                                                        *)
  4. (* Unit zur Umrechnung fester auf gegebene Koordinaten.   *)
  5. (* Beachten Sie bitte, daß die Parameter der Prozedur     *)
  6. (* "GivenWorld" keine Variablen oder Funktionen erhalten  *)
  7. (* dürfen, die sich bei jedem Programmstart, Computer-    *)
  8. (* oder Systemzustand ändern.                             *)
  9. (* Falsch ist also:                                       *)
  10. (*    GivenWorld(GetMaxX, GetMaxY);                       *)
  11. (* Richtig ist :                                          *)
  12. (*    GivenWorld(640, 480);                               *)
  13. (*                                                        *)
  14. (*         (c) 1991 Hagen Lehmann & TOOLBOX               *)
  15. (* -----------------------------------------------------  *)
  16. UNIT  World;
  17.  
  18. {$IFDEF VER40}
  19.   {$R-,S-,I-,D-,T-,F-,V-,B-,N-,L- }
  20. {$ELSE}
  21.   {$A+,B-,D-,E+,F-,I-,L-,N-,O-,R-,S-,V- }
  22. {$ENDIF}
  23.  
  24. {$M 16384,0,655360 }
  25.  
  26. INTERFACE
  27.  
  28. USES  Graph;
  29.  
  30. CONST
  31.   MaxWorld  = 10;             { maximale Anzahl von Welten }
  32.  
  33. TYPE
  34.   WorldType = RECORD     { Abspeicherungstyp der Weltdaten }
  35.                 X1, Y1, X2, Y2 : WORD;       { Koordinaten }
  36.                 Clipping       : BOOLEAN;       { Clipping }
  37.               END;
  38.  
  39. { WORLD-spezifische Befehle }
  40.  
  41.   PROCEDURE GivenWorld(MaxX, MaxY : WORD);
  42.  
  43.   PROCEDURE DefineWorld(Number         : WORD;
  44.                         X1, Y1, X2, Y2 : WORD;
  45.                         Clip           : BOOLEAN);
  46.  
  47.   PROCEDURE DefineWorldByType(Number    : WORD;
  48.                               WorldData : WorldType);
  49.  
  50.   PROCEDURE SelectWorld(Number : WORD);
  51.  
  52.   PROCEDURE ResetWorlds;
  53.  
  54.   PROCEDURE Clear(Number : WORD);
  55.  
  56.   PROCEDURE ClearWorld;
  57.  
  58.   PROCEDURE AwakeWorld;
  59.  
  60.   PROCEDURE SleepWorld;
  61.  
  62.   FUNCTION  GetWorld : WORD;
  63.  
  64.   PROCEDURE GetGivenWorld(VAR MaxX, MaxY : WORD);
  65.  
  66.   PROCEDURE GetWorldData(    Number    : WORD;
  67.                          VAR WorldData : WorldType);
  68.  
  69.   FUNCTION  GetFactorX(Number : WORD) : REAL;
  70.  
  71.   FUNCTION  GetFactorY(Number : WORD) : REAL;
  72.  
  73. (* ---- neue Deklarationen der X,Y-Grafikbefehle -------- *)
  74.  
  75.   PROCEDURE Arc(X, Y                      : INTEGER;
  76.                 StAngle, EndAngle, Radius : WORD);
  77.  
  78.   PROCEDURE Bar(X1, Y1, X2, Y2 : INTEGER);
  79.  
  80.   PROCEDURE Bar3D(X1, Y1, X2, Y2 : INTEGER;
  81.                   Depth          : WORD;
  82.                   Top            : BOOLEAN);
  83.  
  84.   PROCEDURE Circle(X, Y : INTEGER; Radius : WORD);
  85.  
  86.   PROCEDURE Ellipse(X, Y               : INTEGER;
  87.                     StAngle, EndAngle,
  88.                     XRadius, YRadius   : WORD);
  89.  
  90.   PROCEDURE FloodFill(X, Y : INTEGER; Border : WORD);
  91.  
  92.   PROCEDURE GetImage(X1, Y1, X2, Y2 : INTEGER; VAR BitMap);
  93.  
  94.   FUNCTION  GetPixel(X, Y : INTEGER) : WORD;
  95.  
  96.   FUNCTION  ImageSize(X1, Y1, X2, Y2 : INTEGER) : WORD;
  97.  
  98.   PROCEDURE Line(X1, Y1, X2, Y2 : INTEGER);
  99.  
  100.   PROCEDURE LineRel(DX, DY : INTEGER);
  101.  
  102.   PROCEDURE LineTo(X, Y : INTEGER);
  103.  
  104.   PROCEDURE MoveRel(DX, DY : INTEGER);
  105.  
  106.   PROCEDURE MoveTo(X, Y : INTEGER);
  107.  
  108.   PROCEDURE OutTextXY(X, Y : INTEGER; TextString : STRING);
  109.  
  110.   PROCEDURE PieSlice(X, Y                      : INTEGER;
  111.                      StAngle, EndAngle, Radius : WORD);
  112.  
  113.   PROCEDURE PutImage(X, Y : INTEGER; VAR BitMap;
  114.                      BitBlt : WORD);
  115.  
  116.   PROCEDURE PutPixel(X, Y : INTEGER;Pixel : WORD);
  117.  
  118.   PROCEDURE Rectangle(X1, Y1, X2, Y2 : INTEGER);
  119.  
  120.   PROCEDURE SetViewPort(X1, Y1, X2, Y2 : INTEGER;
  121.                         Clip           : BOOLEAN);
  122.  
  123. (* ------------------------------------------------------ *)
  124. IMPLEMENTATION
  125.  
  126. VAR
  127.   CalledGiven   : BOOLEAN;
  128.   Loop,
  129.   Selected,
  130.   SleepNumber   : WORD;
  131.   Given         : RECORD
  132.                     X, Y : WORD;
  133.                   END;
  134.   Worlds        : ARRAY [1..MaxWorld] OF WorldType;
  135.   SleepingWorld : WorldType;
  136.   FactorX,
  137.   FactorY       : ARRAY [1..MaxWorld] OF REAL;
  138.  
  139. (* ---- WORLD-interne Befehle --------------------------- *)
  140.  
  141.   PROCEDURE SwapWord(VAR One, Two : WORD);
  142.     { Vertausch zweier Wortwerte }
  143.   VAR
  144.     Temp : WORD;
  145.   BEGIN
  146.     Temp := One;
  147.     One  := Two;
  148.     Two  := Temp;
  149.   END;
  150.  
  151.   PROCEDURE CalcFour(VAR One,Two,Three,Four : INTEGER);
  152.     { berechnet vier Koordinaten neu }
  153.   BEGIN
  154.     One   := Round(One/FactorX[Selected]);
  155.     Two   := Round(Two/FactorY[Selected]);
  156.     Three := Round(Three/FactorX[Selected]);
  157.     Four  := Round(Four/FactorY[Selected]);
  158.   END;
  159.  
  160.   PROCEDURE CalcTwo(VAR One, Two : INTEGER);
  161.     { berechnet zwei Koordinaten neu }
  162.   BEGIN
  163.     One := Round(One/FactorX[Selected]);
  164.     Two := Round(Two/FactorY[Selected]);
  165.   END;
  166.  
  167. (* ------------------------------------------------------ *)
  168.  
  169.   PROCEDURE GivenWorld;
  170.   { gibt die Welt an, die beim Programmieren benutzt wurde }
  171.   BEGIN
  172.     CalledGiven := TRUE;     { GivenWorld wurde aufgerufen }
  173.     Given.X     := MaxX;     { maximale X-Werte übergeben  }
  174.     Given.Y     := MaxY;     { maximale Y-Werte übergeben  }
  175.   END;
  176.  
  177.  
  178.   PROCEDURE DefineWorld;
  179.    { definiert eine neue Welt (maximal <MaxWorld> Welten) }
  180.   BEGIN
  181.     IF CalledGiven THEN BEGIN
  182.       IF NOT (Number IN [1..MaxWorld]) THEN Number := 1;
  183.       IF X1 > X2 THEN SwapWord(X1, X2);
  184.       IF Y1 > Y2 THEN SwapWord(Y1, Y2);
  185.       IF X2 = X1 THEN Inc(X2);
  186.                                  { X2-X1 darf nicht 0 sein }
  187.       IF Y2 = Y1 THEN Inc(Y2);
  188.                                  { Y2-Y1 darf nicht 0 sein }
  189.       FactorX[Number]         := Given.X/(X2-X1);
  190.       FactorY[Number]         := Given.Y/(Y2-Y1);
  191.       Worlds[Number].X1       := X1;
  192.       Worlds[Number].Y1       := Y1;
  193.       Worlds[Number].X2       := X2;
  194.       Worlds[Number].Y2       := Y2;
  195.       Worlds[Number].Clipping := Clip;
  196.     END;
  197.   END;
  198.  
  199.   PROCEDURE DefineWorldByType;
  200.   BEGIN
  201.     WITH WorldData DO
  202.       DefineWorld(Number, X1, Y1, X2, Y2, Clipping);
  203.   END;
  204.  
  205.   PROCEDURE SelectWorld;
  206.     { gibt eine vordefinierte Welt zur Benutzung frei }
  207.   BEGIN
  208.     IF CalledGiven THEN BEGIN
  209.       IF NOT (Number IN [1..MaxWorld]) THEN Number := 1;
  210.       Selected := Number;
  211.       Graph.SetViewPort(Worlds[Number].X1,Worlds[Number].Y1,
  212.                         Worlds[Number].X2,Worlds[Number].Y2,
  213.                         Worlds[Number].Clipping);
  214.     END;
  215.   END;
  216.  
  217.   PROCEDURE ResetWorlds;
  218.    { löscht alle Welten, bzw. überschreibt die Koordinaten }
  219.   BEGIN
  220.     IF CalledGiven THEN BEGIN
  221.       Selected := 1;
  222.       FOR Loop := 1 TO MaxWorld DO
  223.         DefineWorld(Loop, 0, 0, Given.X, Given.Y, TRUE);
  224.     END;
  225.   END;
  226.  
  227.   PROCEDURE Clear;
  228.     { löscht den Inhalt einer gegebenen Welt }
  229.   VAR
  230.     SaveWorld : WORD;
  231.   BEGIN
  232.     IF CalledGiven THEN BEGIN
  233.       IF NOT (Number IN [1..MaxWorld]) THEN Number := 1;
  234.       SaveWorld := Selected;     { aktuelle Welt speichern }
  235.       SelectWorld(Number);       { neue Welt auswählen     }
  236.       ClearWorld;                { Weltinhalt löschen      }
  237.       SelectWorld(SaveWorld);    { alte Welt setzen        }
  238.     END;
  239.   END;
  240.  
  241.   PROCEDURE ClearWorld;
  242.     { löscht den Inhalt der aktuellen Welt }
  243.   BEGIN
  244.     IF CalledGiven THEN
  245.       ClearViewPort;      { normale GRAPH-Routine benutzen }
  246.   END;
  247.  
  248.   PROCEDURE AwakeWorld;
  249.   { macht die "eingeschläferte"  Welt wieder aktiv }
  250.   BEGIN
  251.     IF CalledGiven THEN BEGIN
  252.       DefineWorldByType(SleepNumber, SleepingWorld);
  253.     END;
  254.   END;
  255.  
  256.   PROCEDURE SleepWorld;
  257.     { "schläfert" eine Welt ein }
  258.   BEGIN
  259.     IF CalledGiven THEN BEGIN
  260.       SleepNumber := Selected;
  261.       GetWorldData(SleepNumber, SleepingWorld);
  262.       DefineWorld(SleepNumber, 0,0, GetMaxX, GetMaxY, TRUE);
  263.     END;
  264.   END;
  265.  
  266.   FUNCTION GetWorld;
  267.     { gibt die aktuelle Welt zurück }
  268.   BEGIN
  269.     GetWorld := Selected;
  270.   END;
  271.  
  272.   PROCEDURE GetGivenWorld;
  273.   { liefert die Welt, die beim Programmieren benutzt wurde }
  274.   BEGIN
  275.     IF CalledGiven THEN BEGIN
  276.       MaxX := Given.X;
  277.       MaxY := Given.Y;
  278.     END;
  279.   END;
  280.  
  281.   PROCEDURE GetWorldData;
  282.     { gibt die Weltdaten zurück }
  283.   BEGIN
  284.     IF CalledGiven THEN BEGIN
  285.       IF NOT (Number IN [1..MaxWorld]) THEN Number := 1;
  286.       WorldData.X1       := Worlds[Number].X1;
  287.       WorldData.Y1       := Worlds[Number].Y1;
  288.       WorldData.X2       := Worlds[Number].X2;
  289.       WorldData.Y2       := Worlds[Number].Y2;
  290.       WorldData.Clipping := Worlds[Number].Clipping;
  291.     END;
  292.   END;
  293.  
  294.   FUNCTION GetFactorX;
  295.     { gibt den X-Faktor einer Welt zurück }
  296.   BEGIN
  297.     GetFactorX := FactorX[Number];
  298.   END;
  299.  
  300.   FUNCTION GetFactorY;
  301.     { gibt den Y-Faktor einer Welt zurück }
  302.   BEGIN
  303.     GetFactorY := FactorY[Number];
  304.   END;
  305.  
  306. (* ---- die in GRAPH definierten Grafikbefehle ---------- *)
  307.  
  308.   PROCEDURE Arc;
  309.   BEGIN
  310.     IF CalledGiven THEN BEGIN
  311.       CalcTwo(X, Y);
  312.                         { Koordinaten und Radius berechnen }
  313.       Radius := Round(Radius/FactorY[Selected]);
  314.       Graph.Arc(X, Y, StAngle, EndAngle, Radius);
  315.     END;
  316.   END;
  317.  
  318.   PROCEDURE Bar;
  319.   BEGIN
  320.     IF CalledGiven THEN BEGIN
  321.       CalcFour(X1, Y1, X2, Y2);
  322.       Graph.Bar(X1, Y1, X2, Y2);
  323.     END;
  324.   END;
  325.  
  326.   PROCEDURE Bar3D;
  327.   BEGIN
  328.     IF CalledGiven THEN BEGIN
  329.       CalcFour(X1, Y1, X2, Y2);
  330.       Depth := Round(Depth/FactorY[Selected]);
  331.       Graph.Bar3D(X1, Y1, X2, Y2, Depth, Top);
  332.     END;
  333.   END;
  334.  
  335.   PROCEDURE Circle;
  336.   BEGIN
  337.     IF CalledGiven THEN BEGIN
  338.       CalcTwo(X, Y);
  339.       Radius := Round(Radius/FactorY[Selected]);
  340.       Graph.Circle(X, Y, Radius);
  341.     END;
  342.   END;
  343.  
  344.   PROCEDURE Ellipse;
  345.   BEGIN
  346.     IF CalledGiven THEN BEGIN
  347.       CalcTwo(X, Y);
  348.       XRadius := Round(XRadius/FactorX[Selected]);
  349.       YRadius := Round(YRadius/FactorY[Selected]);
  350.       Graph.Ellipse(X, Y, StAngle, EndAngle,
  351.                           XRadius, YRadius);
  352.     END;
  353.   END;
  354.  
  355.   PROCEDURE FloodFill;
  356.   BEGIN
  357.     IF CalledGiven THEN BEGIN
  358.       CalcTwo(X, Y);
  359.       Graph.FloodFill(X, Y, Border);
  360.     END;
  361.   END;
  362.  
  363.   PROCEDURE GetImage;
  364.   BEGIN
  365.     IF CalledGiven THEN BEGIN
  366.       CalcFour(X1, Y1, X2, Y2);
  367.       Graph.GetImage(X1, Y1, X2, Y2, BitMap);
  368.     END;
  369.   END;
  370.  
  371.   FUNCTION GetPixel;
  372.   BEGIN
  373.     IF CalledGiven THEN BEGIN
  374.       CalcTwo(X, Y);
  375.       GetPixel := Graph.GetPixel(X, Y);
  376.     END;
  377.   END;
  378.  
  379.   FUNCTION ImageSize;
  380.   BEGIN
  381.     IF CalledGiven THEN BEGIN
  382.       CalcFour(X1, Y1, X2, Y2);
  383.       ImageSize := Graph.ImageSize(X1, Y1, X2, Y2);
  384.     END;
  385.   END;
  386.  
  387.   PROCEDURE Line;
  388.   BEGIN
  389.     IF CalledGiven THEN BEGIN
  390.       CalcFour(X1, Y1, X2, Y2);
  391.       Graph.Line(X1, Y1, X2, Y2);
  392.     END;
  393.   END;
  394.  
  395.   PROCEDURE LineRel;
  396.   BEGIN
  397.     IF CalledGiven THEN BEGIN
  398.       CalcTwo(DX, DY);
  399.       Graph.LineRel(DX, DY);
  400.     END;
  401.   END;
  402.  
  403.   PROCEDURE LineTo;
  404.   BEGIN
  405.     IF CalledGiven THEN BEGIN
  406.       CalcTwo(X, Y);
  407.       Graph.LineTo(X, Y);
  408.     END;
  409.   END;
  410.  
  411.   PROCEDURE MoveRel;
  412.   BEGIN
  413.     IF CalledGiven THEN BEGIN
  414.       CalcTwo(DX, DY);
  415.       Graph.MoveRel(DX, DY);
  416.     END;
  417.   END;
  418.  
  419.   PROCEDURE MoveTo;
  420.   BEGIN
  421.     IF CalledGiven THEN BEGIN
  422.       CalcTwo(X, Y);
  423.       Graph.MoveTo(X, Y);
  424.     END;
  425.   END;
  426.  
  427.   PROCEDURE OutTextXY;
  428.   BEGIN
  429.     IF CalledGiven THEN BEGIN
  430.       CalcTwo(X, Y);
  431.       Graph.OutTextXY(X, Y, TextString);
  432.     END;
  433.   END;
  434.  
  435.   PROCEDURE PieSlice;
  436.   BEGIN
  437.     IF CalledGiven THEN BEGIN
  438.       CalcTwo(X, Y);
  439.       Radius := Round(Radius/FactorY[Selected]);
  440.       Graph.PieSlice(X, Y, StAngle, EndAngle, Radius);
  441.     END;
  442.   END;
  443.  
  444.   PROCEDURE PutImage;
  445.   BEGIN
  446.     IF CalledGiven THEN BEGIN
  447.       CalcTwo(X, Y);
  448.       Graph.PutImage(X, Y, BitMap, BitBlt);
  449.     END;
  450.   END;
  451.  
  452.   PROCEDURE PutPixel;
  453.   BEGIN
  454.     IF CalledGiven THEN BEGIN
  455.       CalcTwo(X, Y);
  456.       Graph.PutPixel(X, Y, Pixel);
  457.     END;
  458.   END;
  459.  
  460.   PROCEDURE Rectangle;
  461.   BEGIN
  462.     IF CalledGiven THEN BEGIN
  463.       CalcFour(X1, Y1, X2, Y2);
  464.       Graph.Rectangle(X1, Y1, X2, Y2);
  465.     END;
  466.   END;
  467.  
  468.   PROCEDURE SetViewPort;
  469.   BEGIN
  470.     IF CalledGiven THEN BEGIN
  471.       CalcFour(X1, Y1, X2, Y2);
  472.       Graph.SetViewPort(X1, Y1, X2, Y2, Clip);
  473.     END;
  474.   END;
  475.  
  476. BEGIN
  477.   CalledGiven := FALSE;
  478.   Selected    := 1;
  479.   FactorX[1]  := 1.0;
  480.   FactorY[1]  := 1.0;
  481. END.
  482. (* ------------------------------------------------------ *)
  483. (*                 Ende von WORLD.PAS                     *)
  484.