156 lines
3.2 KiB
Plaintext
156 lines
3.2 KiB
Plaintext
|
{************************************************}
|
||
|
{ }
|
||
|
{ Breakout Demo Program }
|
||
|
{ Copyright (c) 1992 by Borland International }
|
||
|
{ }
|
||
|
{************************************************}
|
||
|
|
||
|
unit Bricks;
|
||
|
|
||
|
{
|
||
|
See BREAKOUT.PAS.
|
||
|
This unit contains the Ball object and the object types that
|
||
|
end up as bricks on the screen.
|
||
|
}
|
||
|
|
||
|
interface
|
||
|
|
||
|
uses Screen, Count;
|
||
|
|
||
|
type
|
||
|
Block = object(Location)
|
||
|
Color : Integer;
|
||
|
Width : Integer;
|
||
|
BChar : Char;
|
||
|
constructor Init(InitX, InitY, InitColor, InitWidth : Integer;
|
||
|
InitChr : Char);
|
||
|
procedure Show; virtual;
|
||
|
procedure Hide; virtual;
|
||
|
end;
|
||
|
|
||
|
Ball = object(Block)
|
||
|
XVel : Integer;
|
||
|
YVel : Integer;
|
||
|
constructor Init(InitX, InitY, InitXVel, InitYVel, InitColor : Integer);
|
||
|
function NextX : Integer;
|
||
|
function NextY : Integer;
|
||
|
procedure MoveX;
|
||
|
procedure MoveY;
|
||
|
procedure ReverseX;
|
||
|
procedure ReverseY;
|
||
|
procedure ChangeXVel(Delta : Integer);
|
||
|
end;
|
||
|
|
||
|
Brick = object(Block)
|
||
|
Value : Integer;
|
||
|
constructor Init(InitX, InitY, InitColor, InitValue : Integer);
|
||
|
function GetValue : Integer;
|
||
|
end;
|
||
|
|
||
|
implementation
|
||
|
|
||
|
uses Crt;
|
||
|
|
||
|
constructor Block.Init(InitX, InitY, InitColor, InitWidth : Integer;
|
||
|
InitChr : Char);
|
||
|
begin
|
||
|
Location.Init(InitX, InitY);
|
||
|
Color := InitColor;
|
||
|
Width := InitWidth;
|
||
|
BChar := InitChr;
|
||
|
end;
|
||
|
|
||
|
procedure Block.Show;
|
||
|
var
|
||
|
Str : String[10];
|
||
|
begin
|
||
|
FillChar(Str[1], Width, BChar);
|
||
|
Str[0] := Chr(Width);
|
||
|
Location.Show;
|
||
|
TextColor(Color);
|
||
|
GoToXY(X, Y);
|
||
|
Write(Str);
|
||
|
end;
|
||
|
|
||
|
procedure Block.Hide;
|
||
|
begin
|
||
|
Location.Hide;
|
||
|
GoToXY(X, Y);
|
||
|
Write('' : Width);
|
||
|
end;
|
||
|
|
||
|
constructor Brick.Init(InitX, InitY, InitColor, InitValue : Integer);
|
||
|
var
|
||
|
BlockChar : Char;
|
||
|
begin
|
||
|
BlockChar := Chr($B2);
|
||
|
if (LastMode = Mono) and Odd(InitX + InitY) then
|
||
|
BlockChar := Chr($B0);
|
||
|
Block.Init(InitX, InitY, InitColor, 5, BlockChar);
|
||
|
Value := InitValue;
|
||
|
end;
|
||
|
|
||
|
function Brick.GetValue : Integer;
|
||
|
begin
|
||
|
GetValue := Value;
|
||
|
end;
|
||
|
|
||
|
constructor Ball.Init(InitX, InitY, InitXVel, InitYVel, InitColor : Integer);
|
||
|
begin
|
||
|
Block.Init(InitX, InitY, InitColor, 1, Chr(15));
|
||
|
XVel := InitXVel;
|
||
|
YVel := InitYVel;
|
||
|
end;
|
||
|
|
||
|
function Ball.NextX : Integer;
|
||
|
begin
|
||
|
NextX := X + XVel;
|
||
|
end;
|
||
|
|
||
|
function Ball.NextY : Integer;
|
||
|
begin
|
||
|
NextY := Y + YVel;
|
||
|
end;
|
||
|
|
||
|
procedure Ball.MoveX;
|
||
|
begin
|
||
|
Hide;
|
||
|
X := NextX;
|
||
|
Show;
|
||
|
end;
|
||
|
|
||
|
procedure Ball.MoveY;
|
||
|
begin
|
||
|
Hide;
|
||
|
Y := NextY;
|
||
|
Show;
|
||
|
end;
|
||
|
|
||
|
procedure Ball.ReverseX;
|
||
|
begin
|
||
|
XVel := -XVel;
|
||
|
end;
|
||
|
|
||
|
procedure Ball.ReverseY;
|
||
|
begin
|
||
|
YVel := -YVel;
|
||
|
end;
|
||
|
|
||
|
{ This procedure introduces the variations in horizontal velocity for
|
||
|
the ball. Horizontal velocity ranges from -2 to 2. If you hit the
|
||
|
ball with the edge of the paddle, you'll get a large change in
|
||
|
horizontal velocity. }
|
||
|
|
||
|
procedure Ball.ChangeXVel(Delta : Integer);
|
||
|
begin
|
||
|
Inc(XVel, Delta);
|
||
|
if XVel < -2 then
|
||
|
XVel := -2
|
||
|
else if XVel > 2 then
|
||
|
XVel := 2
|
||
|
else if XVel = 0 then
|
||
|
XVel := Integer(Random(2))*2 - 1;
|
||
|
end;
|
||
|
|
||
|
end.
|