unit rei10;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type // 定义精灵 记录类型
TpatDt = record
Used : Byte;
Sban : Byte;
Xpos : Integer;
Ypos : Integer;
Smov : Byte;
Sadd : Byte;
end;
TR10 = class(TForm)
tmr1: TTimer;
procedure FormCreate(Sender: TObject);
procedure tmr1Timer(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
procedure YScroll;
procedure ChrDi(Sban:Byte;X1,Y1:Integer;Bmap:TBitmap);
procedure SbanDi(Sary:array of Byte;X1,Y1:Integer;Bmap:TBitmap );
procedure PatDi(Pnum:Byte;X1,Y1:Integer;Bmap:TBitmap );
public
{ Public declarations }
end;
const
Yoko = 37;
Tate = 27;
DYoko = Yoko * 16;
Dtate = Tate *16;
PtFull = 16; //全面显示 图案数,
MaxMap = 370; //图案最大数
ScDot = 2; // 滚动点数
var
R10: TR10;
// 定义 载入用,去除模板用,背景用,绘制用 点阵图,
LoadBmap,XpatBmap,BackBmap,MakeBmap: TBitmap;
P,PX,PY,n :Byte;
RectL,RectB,RectM,RectD :TRect;
ChPon :array[0..9] of TpatDt;
Yplus :array[0..20] of Byte = (
0,10,19,27,34,40,45,49,52,54,55,
55,54,52,49,45,40,34,27,19,10);
Smap :array[0..(Yoko -1),0..(MaxMap -1)] of Byte;
// 图案点,滚动点,绘制点 的定义,初始 设置
Mpoint : Word = 0;
Spoint : Integer = 16;
Ypoint : Integer = 0;
//复合图案 数组
Spr00 : array[0..5] of Byte =(2,2,24,25,26,27);
Spr01 : array[0..5] of Byte = (2,2,28,29,30,31);
Spr02 : array[0..5] of Byte = (2,2,32,33,48,49);
implementation
{$R *.dfm}
procedure TR10.YScroll; //图像滚动
var
X : Byte;
begin
MakeBmap.Canvas.CopyMode := cmSrcCopy;
if Spoint <= 16 then
begin
RectB := Rect(0,Spoint,DYoko,Dtate + Spoint);
RectD := Rect(16,16,DYoko + 16,Dtate + 16);
MakeBmap.Canvas.CopyRect(RectD,BackBmap.Canvas,RectB);
end
else begin
RectB := Rect(0,Spoint,DYoko,Dtate + 16);
RectD := Rect(16,16,Dyoko + 16,Dtate + 32- Spoint);
MakeBmap.Canvas.CopyRect(RectD,BackBmap.Canvas,RectB);
RectB := Rect(0,0,DYoko,Spoint - 16);
RectD := Rect(16,Dtate + 32 - Spoint,DYoko + 16,Dtate + 16);
MakeBmap.Canvas.CopyRect(RectD,BackBmap.Canvas,RectB);
end;
//ScDot:=2,单次滚动点数 ,Spoint 累计 滚动点数
Spoint := Spoint - ScDot;
Ypoint := Ypoint - ScDot;
if Spoint < 0 then
Spoint := Dtate + 16 - ScDot;
if Ypoint < 0 then
Ypoint := Dtate + 16 - ScDot;
//累计滚动过16点,绘制一行
if (Spoint and 15 ) = 0 then
begin
for X := 0 to (Yoko -1 ) do
PatDi(Smap[X, Mpoint],X * 16,Ypoint,BackBmap );
Mpoint := Mpoint + 1;
// 最大 绘制 ,归零
if Mpoint = MaxMap then
Mpoint := 0 ;
end;
end;
procedure TR10.ChrDi(Sban:Byte;X1,Y1:Integer;Bmap:TBitmap);
begin
case Sban of
0: SbanDi(Spr00,X1 + 16,Y1+ 16,Bmap);
1: SbanDi(Spr01,X1 + 16,Y1 + 16,Bmap);
2: SbanDi(Spr02, X1 + 16,Y1 + 16,Bmap);
end;
end;
procedure TR10.SbanDi(Sary:array of Byte;X1,Y1:Integer;Bmap:TBitmap );
var
X :Byte;
Y :Word;
begin
n := 2;
for Y := 0 to ( Sary[1] -1) do
for X := 0 to ( Sary[0]-1) do
begin
if (X1 + X* 16 >= 0 )and ( X1 + X *16 <= DYoko + 16) and
( Y1 + Y *16 >= 0) and ( Y1 + Y* 16 <= Date + 16) then
PatDi(Sary[n],X1 + X * 16, Y1 + Y *16,Bmap);
n := n +1;
end;
end;
procedure TR10.PatDi(Pnum:Byte;X1,Y1:Integer;Bmap:TBitmap );
begin
PX := (Pnum and $F) * 16;
PY := Pnum and $F0;
RectL := Rect(PX,PY,PX + 16,PY + 16);
RectD := Rect(X1,Y1,X1 + 16, Y1 + 16);
if Pnum <> 0 then
if Pnum >= PtFull then
begin
Bmap.Canvas.CopyMode := cmSrcPaint;
Bmap.Canvas.CopyRect(RectD,XpatBmap.Canvas,RectL );
Bmap.Canvas.CopyMode := cmSrcAnd;
Bmap.Canvas.CopyRect(RectD,LoadBmap.Canvas,RectL );
end
else begin
Bmap.Canvas.CopyMode := cmSrcCopy;
Bmap.Canvas.CopyRect(RectD,LoadBmap.Canvas,RectL);
end;
end;
procedure TR10.FormCreate(Sender: TObject);
var
X,Cn :Byte;
Y :Word;
begin
R10.Height := 480;
R10.Width := 640;
LoadBmap := TBitmap.Create;
LoadBmap.LoadFromFile(GetCurrentDir + '\Pat_Sample.bmp');
XpatBmap :=TBitmap.Create;
XpatBmap.Width :=256;
XpatBmap.Height :=256;
RectL := Rect(0,0,256,256);
XpatBmap.Canvas.CopyMode := cmSrcCopy;
XpatBmap.Canvas.CopyRect(RectL,LoadBmap.Canvas,RectL );
XpatBmap.Canvas.Brush.Color := clBlack;
XpatBmap.Canvas.BrushCopy(RectL,LoadBmap,RectL,clWhite );
XpatBmap.Canvas.CopyMode := cmMergePaint;
XpatBmap.Canvas.CopyRect(RectL,LoadBmap.Canvas,RectL );
//设置背景图案
for Y := 0 to (MaxMap -1) do
for X := 0 to (Yoko -1 ) do
begin
if(X>(Y mod Yoko)) and ((X+ (Y mod Yoko)+1)< Yoko) then
P := 15
else if (X < ( Y mod Yoko ))and ((X + (Y mod Yoko )+1) > Yoko) then
P := 15
else if Y < Yoko then
P := 12
else if Y < Yoko *2 then
P := 13
else if Y < Yoko *3 then
P := 14
else if Y < Yoko * 4 then
P:= 2
else if Y < Yoko * 5 then
P:= 14
else if Y < Yoko *6 then
P := 13
else if Y < Yoko * 7 then
P:= 12
else if Y < Yoko * 8 then
P:= 13
else if Y < Yoko * 9 then
P:= 14
else
P := 15;
Smap[X,Y ] := P;
end;
BackBmap := TBitmap.Create;
BackBmap.Width:= DYoko;
BackBmap.Height:= Dtate + 16;
for Y := 0 to Tate do
begin
for X := 0 to ( Yoko -1 ) do
PatDi(Smap[X,Y ],X * 16,(Tate - Y )* 16,BackBmap);
Mpoint := Mpoint + 1;
end;
MakeBmap := TBitmap.Create;
MakeBmap.Width := DYoko + 32;
MakeBmap.Height := Dtate + 32;
//设置精灵
for Cn := 0 to 4 do
begin
ChPon[Cn *2 ].Used := 1;
ChPon[Cn * 2].Sban := 0 ;
ChPon[Cn * 2].Xpos := Cn *90 + 100;
ChPon[Cn *2 ].Ypos := (Cn and 1 )* 100 + 200;
ChPon[Cn *2 ].Smov := 0;
ChPon[Cn *2 ].Sadd := 0;
ChPon[Cn *2 + 1].Used := 1;
ChPon[Cn * 2+1 ].Sban := (Cn and 1 ) +1 ;
ChPon[Cn * 2+1 ].Xpos := Cn *90 + 100;
ChPon[Cn *2 +1 ].Ypos := 0;
ChPon[Cn *2 +1 ].Smov := 1;
ChPon[Cn *2 +1 ].Sadd := Random(21);
end;
end;
procedure TR10.tmr1Timer(Sender: TObject);
var
Cn : Byte;
begin
// 计算精灵的位置
for Cn := 0 to 4 do
if (ChPon[Cn *2 +1].Used = 1) and (ChPon[Cn *2 +1 ].Smov =1) then
begin
ChPon[Cn *2 + 1 ].Ypos := ChPon[Cn *2].Ypos - Yplus[ChPon[Cn *2 +1].Sadd];
ChPon[Cn *2 +1 ].Sadd := ChPon[Cn *2 +1].Sadd +1;
if ChPon[Cn *2+1].Sadd > 20 then
ChPon[Cn *2 +1].Sadd := 0;
end;
YScroll;
// 绘制精灵
for Cn := 0 to 9 do
if ChPon[Cn].Used = 1 then
ChrDi(ChPon[Cn].Sban,ChPon[Cn].Xpos, ChPon[Cn].Ypos,MakeBmap);
R10.Canvas.CopyMode := cmSrcCopy;
RectM := Rect(16,16, DYoko + 16,DTate + 16);
RectD := Rect(0,0,DYoko,DTate);
R10.Canvas.CopyRect(RectD,MakeBmap.Canvas,RectM);
end;
procedure TR10.FormClose(Sender: TObject; var Action: TCloseAction);
begin
LoadBmap.Free;
XpatBmap.Free;
BackBmap.Free;
MakeBmap.Free;
end;
end.