unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 =
class(TForm)
PB_ViewingBox: TPaintBox;
PB_BufferBox: TPaintBox;
I_Background: TImage;
I_Mask: TImage;
I_Inhalt: TImage;
Label14: TLabel;
Label15: TLabel;
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Button2: TButton;
Timer1: TTimer;
Label7: TLabel;
Button3: TButton;
Button4: TButton;
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
strict private
public
procedure definiereMaskundInhaltRects();
function invertiereXRichtung(p_nr:integer):integer;
procedure frageXRichtung(p_nr: integer);
procedure ZeichneNeu();
procedure ZeichneBackground();
procedure ZeichneMaskAndInhalt();
procedure AusgabeViewingBox();
procedure zeichneBalken(x1,y1,x2,y2: integer);
end;
var
Form1: TForm1;
anzahlBalken: integer = 0;
BalkenKoordinaten:
array[1..8,0..4]
of integer;
BackgroundZielRect: TRect;
BackgroundQuellRect: TRect;
MaskZielRect:
array[1..8]
of TRect;
MaskQuellRect:
array[1..8]
of TRect;
InhaltZielRect:
array[1..8]
of TRect;
InhaltQuellRect:
array[1..8]
of TRect;
BufferBoxZielRect: TRect;
BufferBoxQuellRect: TRect;
gedrueckteTasten:
array[0..3]
of boolean;
geschwX: integer = 5;
// Geschwindigkeit in X
geschwY: integer = 1;
// und Y
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
var i: integer;
begin
for i:=1
to anzahlBalken
do
begin
frageXRichtung(i);
if BalkenKoordinaten[i,0] = 0
then
begin
BalkenKoordinaten[i,1] := BalkenKoordinaten[i,1]-geschwX;
BalkenKoordinaten[i,3] := BalkenKoordinaten[i,3]-geschwX;
end;
if BalkenKoordinaten[i,0] = 1
then
begin
BalkenKoordinaten[i,1] := BalkenKoordinaten[i,1]+geschwX;
BalkenKoordinaten[i,3] := BalkenKoordinaten[i,3]+geschwX;
end;
BalkenKoordinaten[i,2] := BalkenKoordinaten[i,2]-geschwY;
BalkenKoordinaten[i,4] := BalkenKoordinaten[i,4]-geschwY;
end;
ZeichneNeu();
label7.caption := IntToStr(StrToInt(label7.caption)+1)
end;
procedure TForm1.ZeichneNeu();
begin
ZeichneBackground();
ZeichneMaskAndInhalt();
AusgabeViewingBox();
end;
procedure TForm1.definiereMaskundInhaltRects();
begin
I_Mask.Canvas.Brush.Color := clBlack;
I_Mask.Canvas.Pen.Color := clBlack;
I_Mask.Canvas.Rectangle(BalkenKoordinaten[anzahlBalken,1],BalkenKoordinaten[1,2],BalkenKoordinaten[anzahlBalken,3],BalkenKoordinaten[anzahlBalken,4]);
MaskZielRect[anzahlBalken] := Rect(BalkenKoordinaten[anzahlBalken,1],BalkenKoordinaten[anzahlBalken,2],BalkenKoordinaten[anzahlBalken,3],BalkenKoordinaten[anzahlBalken,4]);
MaskQuellRect[anzahlBalken] := Rect(BalkenKoordinaten[anzahlBalken,1],BalkenKoordinaten[anzahlBalken,2],BalkenKoordinaten[anzahlBalken,3],BalkenKoordinaten[anzahlBalken,4]);
I_Inhalt.Canvas.Brush.Color := clBlue;
I_Inhalt.Canvas.Pen.Color := clBlue;
I_Inhalt.Canvas.Rectangle(BalkenKoordinaten[anzahlBalken,1],BalkenKoordinaten[anzahlBalken,2],BalkenKoordinaten[anzahlBalken,3],BalkenKoordinaten[anzahlBalken,4]);
InhaltZielRect[anzahlBalken] := Rect(BalkenKoordinaten[anzahlBalken,1],BalkenKoordinaten[anzahlBalken,2],BalkenKoordinaten[anzahlBalken,3],BalkenKoordinaten[anzahlBalken,4]);
InhaltQuellRect[anzahlBalken] := Rect(BalkenKoordinaten[anzahlBalken,1],BalkenKoordinaten[anzahlBalken,2],BalkenKoordinaten[anzahlBalken,3],BalkenKoordinaten[anzahlBalken,4]);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
BackgroundZielRect := Rect(0,0,PB_BufferBox.Width,PB_BufferBox.Height);
BackgroundQuellRect := Rect(0,0,I_Background.Width,I_Background.Height);
BufferBoxZielRect := Rect(0,0,PB_ViewingBox.Width,PB_ViewingBox.Height);
BufferBoxQuellRect := Rect(0,0,PB_BufferBox.Width,PB_BufferBox.Height);
end;
procedure TForm1.frageXRichtung(p_nr: integer);
begin
if BalkenKoordinaten[p_nr,1]>geschwX
then
begin
BalkenKoordinaten[p_nr,0] := invertiereXRichtung(p_nr);
end;
if BalkenKoordinaten[p_nr,3]>(400-geschwX)
then
begin
BalkenKoordinaten[p_nr,0] := invertiereXRichtung(p_nr);
end;
end;
function TForm1.invertiereXRichtung(p_nr: integer):integer;
begin
if BalkenKoordinaten[p_nr,0] = 0
then
begin
result := 1;
end;
if BalkenKoordinaten[p_nr,0] = 1
then
begin
result := 0;
end;
end;
procedure TForm1.zeichneBalken(x1,y1,x2,y2: integer);
begin
BalkenKoordinaten[anzahlBalken,1] := x1;
BalkenKoordinaten[anzahlBalken,2] := y1;
BalkenKoordinaten[anzahlBalken,3] := x2;
BalkenKoordinaten[anzahlBalken,4] := y2;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
anzahlBalken := anzahlBalken+1;
zeichneBalken(StrToInt(Edit1.Text),StrToInt(Edit2.Text),
StrToInt(Edit3.Text),StrToInt(Edit4.Text));
definiereMaskundInhaltRects();
zeichneMaskAndInhalt();
end;
procedure TForm1.ZeichneBackground();
begin
PB_BufferBox.Canvas.CopyMode := cmSrcCopy;
PB_BufferBox.Canvas.CopyRect(BackgroundZielRect,
I_Background.Canvas,
BackgroundQuellRect);
end;
procedure TForm1.ZeichneMaskAndInhalt();
var i: integer;
begin
for i:=1
to anzahlBalken
do
begin
PB_BufferBox.Canvas.CopyMode := cmSrcAnd;
PB_BufferBox.Canvas.CopyRect(MaskZielRect[i],
I_Mask.Canvas,
MaskQuellRect[i]);
PB_BufferBox.Canvas.CopyMode := cmSrcPaint;
PB_BufferBox.Canvas.CopyRect(InhaltZielRect[i],
I_Inhalt.Canvas,
InhaltQuellRect[i]);
end;
end;
procedure TForm1.AusgabeViewingBox();
begin
PB_ViewingBox.Canvas.CopyMode := cmSrcCopy;
PB_ViewingBox.Canvas.CopyRect(BufferBoxZielRect,
PB_BufferBox.Canvas,
BufferBoxQuellRect);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
ZeichneBackground();
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
AusgabeViewingBox();
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled := true;
end;
end.