382 lines
9.0 KiB
Plaintext
382 lines
9.0 KiB
Plaintext
|
|
|||
|
{ Copyright (c) 1985, 88 by Borland International, Inc. }
|
|||
|
|
|||
|
program Arty;
|
|||
|
{ This program is a demonstration of the Borland Graphics Interface
|
|||
|
(BGI) provided with Turbo Pascal 5.0.
|
|||
|
|
|||
|
To run this program you will need the following files:
|
|||
|
|
|||
|
TURBO.EXE (or TPC.EXE)
|
|||
|
TURBO.TPL - The standard units
|
|||
|
GRAPH.TPU - The Graphics unit
|
|||
|
*.BGI - The graphics device drivers
|
|||
|
|
|||
|
Runtime Commands for ARTY
|
|||
|
-------------------------
|
|||
|
<B> - changes background color
|
|||
|
<C> - changes drawcolor
|
|||
|
<ESC> - exits program
|
|||
|
Any other key pauses, then regenerates the drawing
|
|||
|
|
|||
|
Note: If a /H command-line parameter is specified, the highest
|
|||
|
resolution mode will be used (if possible).
|
|||
|
}
|
|||
|
|
|||
|
uses
|
|||
|
Crt, Graph;
|
|||
|
|
|||
|
const
|
|||
|
Memory = 100;
|
|||
|
Windows = 4;
|
|||
|
|
|||
|
type
|
|||
|
ResolutionPreference = (Lower, Higher);
|
|||
|
ColorList = array [1..Windows] of integer;
|
|||
|
|
|||
|
var
|
|||
|
Xmax,
|
|||
|
Ymax,
|
|||
|
ViewXmax,
|
|||
|
ViewYmax : integer;
|
|||
|
|
|||
|
Line: array [1..Memory] of record
|
|||
|
LX1,LY1: integer;
|
|||
|
LX2,LY2: integer;
|
|||
|
LColor : ColorList;
|
|||
|
end;
|
|||
|
X1,X2,Y1,Y2,
|
|||
|
CurrentLine,
|
|||
|
ColorCount,
|
|||
|
IncrementCount,
|
|||
|
DeltaX1,DeltaY1,DeltaX2,DeltaY2: integer;
|
|||
|
Colors: ColorList;
|
|||
|
Ch: char;
|
|||
|
BackColor:integer;
|
|||
|
GraphDriver, GraphMode : integer;
|
|||
|
MaxColors : word;
|
|||
|
MaxDelta : integer;
|
|||
|
ChangeColors: Boolean;
|
|||
|
|
|||
|
procedure Frame;
|
|||
|
begin
|
|||
|
SetViewPort(0, 0, Xmax, Ymax-(TextHeight('M')+4)-1,ClipOn);
|
|||
|
SetColor(MaxColors);
|
|||
|
Rectangle(0, 0, Xmax-1, (Ymax-(TextHeight('M')+4)-1)-1);
|
|||
|
SetViewPort(1, 1, Xmax-2, (Ymax-(TextHeight('M')+4)-1)-2,ClipOn);
|
|||
|
end { Frame };
|
|||
|
|
|||
|
procedure FullPort;
|
|||
|
{ Set the view port to the entire screen }
|
|||
|
begin
|
|||
|
SetViewPort(0, 0, Xmax, Ymax, ClipOn);
|
|||
|
end; { FullPort }
|
|||
|
|
|||
|
procedure MessageFrame(Msg:string);
|
|||
|
begin
|
|||
|
FullPort;
|
|||
|
SetColor(MaxColors);
|
|||
|
SetTextStyle(DefaultFont, HorizDir, 1);
|
|||
|
SetTextJustify(CenterText, TopText);
|
|||
|
SetLineStyle(SolidLn, 0, NormWidth);
|
|||
|
SetFillStyle(EmptyFill, 0);
|
|||
|
Bar(0, Ymax-(TextHeight('M')+4), Xmax, Ymax);
|
|||
|
Rectangle(0, Ymax-(TextHeight('M')+4), Xmax, Ymax);
|
|||
|
OutTextXY(Xmax div 2, Ymax-(TextHeight('M')+2), Msg);
|
|||
|
{ Go back to the main window }
|
|||
|
Frame;
|
|||
|
end { MessageFrame };
|
|||
|
|
|||
|
procedure WaitToGo;
|
|||
|
var
|
|||
|
Ch : char;
|
|||
|
begin
|
|||
|
MessageFrame('Press any key to continue... Esc aborts');
|
|||
|
repeat until KeyPressed;
|
|||
|
Ch := ReadKey;
|
|||
|
if Ch = #27 then begin
|
|||
|
CloseGraph;
|
|||
|
Writeln('All done.');
|
|||
|
Halt(1);
|
|||
|
end
|
|||
|
else
|
|||
|
ClearViewPort;
|
|||
|
MessageFrame('Press a key to stop action, Esc quits.');
|
|||
|
end; { WaitToGo }
|
|||
|
|
|||
|
procedure TestGraphError(GraphErr: integer);
|
|||
|
begin
|
|||
|
if GraphErr <> grOk then begin
|
|||
|
Writeln('Graphics error: ', GraphErrorMsg(GraphErr));
|
|||
|
repeat until keypressed;
|
|||
|
ch := readkey;
|
|||
|
Halt(1);
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
procedure Init;
|
|||
|
var
|
|||
|
Err, I: integer;
|
|||
|
StartX, StartY: integer;
|
|||
|
Resolution: ResolutionPreference;
|
|||
|
s: string;
|
|||
|
begin
|
|||
|
Resolution := Lower;
|
|||
|
if paramcount > 0 then begin
|
|||
|
s := paramstr(1);
|
|||
|
if s[1] = '/' then
|
|||
|
if upcase(s[2]) = 'H' then
|
|||
|
Resolution := Higher;
|
|||
|
end;
|
|||
|
|
|||
|
CurrentLine := 1;
|
|||
|
ColorCount := 0;
|
|||
|
IncrementCount := 0;
|
|||
|
Ch := ' ';
|
|||
|
GraphDriver := Detect;
|
|||
|
DetectGraph(GraphDriver, GraphMode);
|
|||
|
TestGraphError(GraphResult);
|
|||
|
case GraphDriver of
|
|||
|
CGA : begin
|
|||
|
MaxDelta := 7;
|
|||
|
GraphDriver := CGA;
|
|||
|
GraphMode := CGAC1;
|
|||
|
end;
|
|||
|
|
|||
|
MCGA : begin
|
|||
|
MaxDelta := 7;
|
|||
|
case GraphMode of
|
|||
|
MCGAMed, MCGAHi: GraphMode := MCGAC1;
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
EGA : begin
|
|||
|
MaxDelta := 16;
|
|||
|
If Resolution = Lower then
|
|||
|
GraphMode := EGALo
|
|||
|
else
|
|||
|
GraphMode := EGAHi;
|
|||
|
end;
|
|||
|
|
|||
|
EGA64 : begin
|
|||
|
MaxDelta := 16;
|
|||
|
If Resolution = Lower then
|
|||
|
GraphMode := EGA64Lo
|
|||
|
else
|
|||
|
GraphMode := EGA64Hi;
|
|||
|
end;
|
|||
|
|
|||
|
HercMono : MaxDelta := 16;
|
|||
|
EGAMono : MaxDelta := 16;
|
|||
|
PC3270 : begin
|
|||
|
MaxDelta := 7;
|
|||
|
GraphDriver := CGA;
|
|||
|
GraphMode := CGAC1;
|
|||
|
end;
|
|||
|
|
|||
|
|
|||
|
ATT400 : case GraphMode of
|
|||
|
ATT400C1,
|
|||
|
ATT400C2,
|
|||
|
ATT400Med,
|
|||
|
ATT400Hi :
|
|||
|
begin
|
|||
|
MaxDelta := 7;
|
|||
|
GraphMode := ATT400C1;
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
VGA : begin
|
|||
|
MaxDelta := 16;
|
|||
|
end;
|
|||
|
end;
|
|||
|
InitGraph(GraphDriver, GraphMode, '');
|
|||
|
TestGraphError(GraphResult);
|
|||
|
SetTextStyle(DefaultFont, HorizDir, 1);
|
|||
|
SetTextJustify(CenterText, TopText);
|
|||
|
|
|||
|
MaxColors := GetMaxColor;
|
|||
|
BackColor := 0;
|
|||
|
ChangeColors := TRUE;
|
|||
|
Xmax := GetMaxX;
|
|||
|
Ymax := GetMaxY;
|
|||
|
ViewXmax := Xmax-2;
|
|||
|
ViewYmax := (Ymax-(TextHeight('M')+4)-1)-2;
|
|||
|
StartX := Xmax div 2;
|
|||
|
StartY := Ymax div 2;
|
|||
|
for I := 1 to Memory do with Line[I] do begin
|
|||
|
LX1 := StartX; LX2 := StartX;
|
|||
|
LY1 := StartY; LY2 := StartY;
|
|||
|
end;
|
|||
|
|
|||
|
X1 := StartX;
|
|||
|
X2 := StartX;
|
|||
|
Y1 := StartY;
|
|||
|
Y2 := StartY;
|
|||
|
end; {init}
|
|||
|
|
|||
|
procedure AdjustX(var X,DeltaX: integer);
|
|||
|
var
|
|||
|
TestX: integer;
|
|||
|
begin
|
|||
|
TestX := X+DeltaX;
|
|||
|
if (TestX<1) or (TestX>ViewXmax) then begin
|
|||
|
TestX := X;
|
|||
|
DeltaX := -DeltaX;
|
|||
|
end;
|
|||
|
X := TestX;
|
|||
|
end;
|
|||
|
|
|||
|
procedure AdjustY(var Y,DeltaY: integer);
|
|||
|
var
|
|||
|
TestY: integer;
|
|||
|
begin
|
|||
|
TestY := Y+DeltaY;
|
|||
|
if (TestY<1) or (TestY>ViewYmax) then begin
|
|||
|
TestY := Y;
|
|||
|
DeltaY := -DeltaY;
|
|||
|
end;
|
|||
|
Y := TestY;
|
|||
|
end;
|
|||
|
|
|||
|
procedure SelectNewColors;
|
|||
|
begin
|
|||
|
if not ChangeColors then exit;
|
|||
|
Colors[1] := Random(MaxColors)+1;
|
|||
|
Colors[2] := Random(MaxColors)+1;
|
|||
|
Colors[3] := Random(MaxColors)+1;
|
|||
|
Colors[4] := Random(MaxColors)+1;
|
|||
|
ColorCount := 3*(1+Random(5));
|
|||
|
end;
|
|||
|
|
|||
|
procedure SelectNewDeltaValues;
|
|||
|
begin
|
|||
|
DeltaX1 := Random(MaxDelta)-(MaxDelta Div 2);
|
|||
|
DeltaX2 := Random(MaxDelta)-(MaxDelta Div 2);
|
|||
|
DeltaY1 := Random(MaxDelta)-(MaxDelta Div 2);
|
|||
|
DeltaY2 := Random(MaxDelta)-(MaxDelta Div 2);
|
|||
|
IncrementCount := 2*(1+Random(4));
|
|||
|
end;
|
|||
|
|
|||
|
|
|||
|
procedure SaveCurrentLine(CurrentColors: ColorList);
|
|||
|
begin
|
|||
|
with Line[CurrentLine] do
|
|||
|
begin
|
|||
|
LX1 := X1;
|
|||
|
LY1 := Y1;
|
|||
|
LX2 := X2;
|
|||
|
LY2 := Y2;
|
|||
|
LColor := CurrentColors;
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
procedure Draw(x1,y1,x2,y2,color:word);
|
|||
|
begin
|
|||
|
SetColor(color);
|
|||
|
Graph.Line(x1,y1,x2,y2);
|
|||
|
end;
|
|||
|
|
|||
|
procedure Regenerate;
|
|||
|
var
|
|||
|
I: integer;
|
|||
|
begin
|
|||
|
Frame;
|
|||
|
for I := 1 to Memory do with Line[I] do begin
|
|||
|
Draw(LX1,LY1,LX2,LY2,LColor[1]);
|
|||
|
Draw(ViewXmax-LX1,LY1,ViewXmax-LX2,LY2,LColor[2]);
|
|||
|
Draw(LX1,ViewYmax-LY1,LX2,ViewYmax-LY2,LColor[3]);
|
|||
|
Draw(ViewXmax-LX1,ViewYmax-LY1,ViewXmax-LX2,ViewYmax-LY2,LColor[4]);
|
|||
|
end;
|
|||
|
WaitToGo;
|
|||
|
Frame;
|
|||
|
end;
|
|||
|
|
|||
|
procedure Updateline;
|
|||
|
begin
|
|||
|
Inc(CurrentLine);
|
|||
|
if CurrentLine > Memory then CurrentLine := 1;
|
|||
|
Dec(ColorCount);
|
|||
|
Dec(IncrementCount);
|
|||
|
end;
|
|||
|
|
|||
|
procedure CheckForUserInput;
|
|||
|
begin
|
|||
|
if KeyPressed then begin
|
|||
|
Ch := ReadKey;
|
|||
|
if Upcase(Ch) = 'B' then begin
|
|||
|
if BackColor > MaxColors then BackColor := 0 else Inc(BackColor);
|
|||
|
SetBkColor(BackColor);
|
|||
|
end
|
|||
|
else
|
|||
|
if Upcase(Ch) = 'C' then begin
|
|||
|
if ChangeColors then ChangeColors := FALSE else ChangeColors := TRUE;
|
|||
|
ColorCount := 0;
|
|||
|
end
|
|||
|
else if Ch<>#27 then Regenerate;
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
procedure DrawCurrentLine;
|
|||
|
var c1,c2,c3,c4: integer;
|
|||
|
begin
|
|||
|
c1 := Colors[1];
|
|||
|
c2 := Colors[2];
|
|||
|
c3 := Colors[3];
|
|||
|
c4 := Colors[4];
|
|||
|
if MaxColors = 1 then begin
|
|||
|
c2 := c1; c3 := c1; c4 := c1;
|
|||
|
end;
|
|||
|
|
|||
|
Draw(X1,Y1,X2,Y2,c1);
|
|||
|
Draw(ViewXmax-X1,Y1,ViewXmax-X2,Y2,c2);
|
|||
|
Draw(X1,ViewYmax-Y1,X2,ViewYmax-Y2,c3);
|
|||
|
if MaxColors = 3 then c4 := Random(3)+1; { alternate colors }
|
|||
|
Draw(ViewXmax-X1,ViewYmax-Y1,ViewXmax-X2,ViewYmax-Y2,c4);
|
|||
|
SaveCurrentLine(Colors);
|
|||
|
end;
|
|||
|
|
|||
|
procedure EraseCurrentLine;
|
|||
|
begin
|
|||
|
with Line[CurrentLine] do begin
|
|||
|
Draw(LX1,LY1,LX2,LY2,0);
|
|||
|
Draw(ViewXmax-LX1,LY1,ViewXmax-LX2,LY2,0);
|
|||
|
Draw(LX1,ViewYmax-LY1,LX2,ViewYmax-LY2,0);
|
|||
|
Draw(ViewXmax-LX1,ViewYmax-LY1,ViewXmax-LX2,ViewYmax-LY2,0);
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
|
|||
|
procedure DoArt;
|
|||
|
begin
|
|||
|
SelectNewColors;
|
|||
|
repeat
|
|||
|
EraseCurrentLine;
|
|||
|
if ColorCount = 0 then SelectNewColors;
|
|||
|
|
|||
|
if IncrementCount=0 then SelectNewDeltaValues;
|
|||
|
|
|||
|
AdjustX(X1,DeltaX1); AdjustX(X2,DeltaX2);
|
|||
|
AdjustY(Y1,DeltaY1); AdjustY(Y2,DeltaY2);
|
|||
|
|
|||
|
if Random(5)=3 then begin
|
|||
|
x1 := (x1+x2) div 2; { shorten the lines }
|
|||
|
y2 := (y1+y2) div 2;
|
|||
|
end;
|
|||
|
|
|||
|
DrawCurrentLine;
|
|||
|
Updateline;
|
|||
|
CheckForUserInput;
|
|||
|
until Ch=#27;
|
|||
|
end;
|
|||
|
|
|||
|
begin
|
|||
|
Init;
|
|||
|
Frame;
|
|||
|
MessageFrame('Press a key to stop action, Esc quits.');
|
|||
|
DoArt;
|
|||
|
CloseGraph;
|
|||
|
RestoreCrtMode;
|
|||
|
Writeln('The End.');
|
|||
|
end.
|
|||
|
|