📄 rei_07.pas
字号:
unit Rei_07;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, Menus;
type
// 定义管理角色的记录型态
TPatDt = record
Used: Byte;
Xpos: Integer;
Ypos: Integer;
Sban: Byte;
Smov: Byte;
Slife: Byte;
Count: Byte;
end;
TRei40_07 = class(TForm)
Timer1: TTimer;
MainMenu1: TMainMenu;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private 定义 }
procedure StChk(var Chpon: TPatDt);
procedure Stars(var Chpon: TPatDt);
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);
procedure ChrCl(Sban: Byte; X1, Y1: Integer; Bmap: TBitmap);
procedure SbanCl(Xdot, Ydot: Word; X1, Y1: Integer; Bmap: TBitmap);
public
{ Public 定义 }
end;
const
Yoko = 37; //显示的横向图案数
Tate = 27; //显示的纵向图案数
DYoko = Yoko * 16; //显示的横向点数
DTate = Tate * 16; //显示的纵向点数
PtFull = 16; //全面显示(不要重叠显示)的图案数
ChMax = 30; //角色总数
var
Rei40_07: TRei40_07;
// 定义载入用、去除模版用、背景用与绘制用的点阵图
Load_Bmap: TBitmap;
Xpat_Bmap: TBitmap;
Back_Bmap: TBitmap;
Make_Bmap: TBitmap;
// 定义各种变数(Byte型态、Trect型态)
PX, PY, n: Byte;
Rect_L, Rect_B, Rect_M, Rect_D: TRect;
// 定义角色用与复合图案用的阵列
ChPon: array[0..(ChMax - 1)] of TPatDt;
Spr00: array[0..2] of Byte = (1, 1, 0);
Spr01: array[0..2] of Byte = (1, 1, 19);
Spr02: array[0..2] of Byte = (1, 1, 23);
implementation
{$R *.DFM}
procedure TRei40_07.FormCreate(Sender: TObject);
var
// 定义区域变数
X, Y, Cn: Byte;
begin
// 设定Form属性
Rei40_07.Height := 480;
Rei40_07.Width := 640;
// 载入图案
Load_Bmap := TBitmap.Create;
Load_Bmap.LoadFromFile(GetCurrentDir + '\ExData\Pat_Sample.bmp');
// 储存去除用点阵图
Xpat_Bmap := TBitmap.Create;
Xpat_Bmap.Width := 256;
Xpat_Bmap.Height := 256;
// 制作去除用点阵图
Rect_L := Rect(0, 0, 256, 256);
Xpat_Bmap.Canvas.CopyMode := cmSrcCopy;
Xpat_Bmap.Canvas.CopyRect(Rect_L, Load_Bmap.Canvas, Rect_L);
Xpat_Bmap.Canvas.Brush.Color := clBlack;
Xpat_Bmap.Canvas.BrushCopy(Rect_L, Load_Bmap, Rect_L, clWhite);
Xpat_Bmap.Canvas.CopyMode := cmMergePaint;
Xpat_Bmap.Canvas.CopyRect(Rect_L, Load_Bmap.Canvas, Rect_L);
// 储存背景用点阵图
Back_Bmap := TBitmap.Create;
Back_Bmap.Width := DYoko + 32;
Back_Bmap.Height := DTate + 32;
// 将背景绘制至Back_Bmap上
for Y := 0 to (Tate - 1) do
for X := 0 to (Yoko - 1) do
PatDi(2, X * 16 + 16, Y * 16 + 16, Back_Bmap);
// 储存绘制用点阵图并复制背景(Back_Bmap)
Make_Bmap := TBitmap.Create;
Make_Bmap.Width := Back_Bmap.Width;
Make_Bmap.Height := Back_Bmap.Height;
Make_Bmap.Canvas.Draw(0, 0, Back_Bmap);
// 设定角色的初始值
Randomize;
for Cn := 0 to (ChMax - 1) do
begin
ChPon[Cn].Used := 0;
ChPon[Cn].Count := Random(15);
end;
end;
procedure TRei40_07.Timer1Timer(Sender: TObject);
var
// 定义区域变数
Cn: Byte;
begin
// 确认角色的行动
for Cn := 0 to (ChMax - 1) do
begin
ChPon[Cn].Count := ChPon[Cn].Count + 1;
if ChPon[Cn].Used = 0 then
StChk(ChPon[Cn])
else
Stars(ChPon[Cn]);
end;
// 将所有的角色绘制至Make_Bmap
for Cn := 0 to (ChMax - 1) do
if ChPon[Cn].Used = 1 then
ChrDi(ChPon[Cn].Sban, ChPon[Cn].Xpos, ChPon[Cn].Ypos, Make_Bmap);
// 将绘制用点阵图显示在Form上
Rei40_07.Canvas.CopyMode := cmSrcCopy;
Rect_M := Rect(16, 16, DYoko + 16, DTate + 16);
Rect_D := Rect(0, 0, DYoko, DTate);
Rei40_07.Canvas.CopyRect(Rect_D, Make_Bmap.Canvas, Rect_M);
// 以背景去除所有的角色
for Cn := 0 to (ChMax - 1) do
if ChPon[Cn].Used = 1 then
ChrCl(ChPon[Cn].Sban, ChPon[Cn].Xpos, ChPon[Cn].Ypos, Make_Bmap);
end;
procedure TRei40_07.StChk(var Chpon: TPatDt);
begin
// 管理新出现的星星
if (ChPon.Count > 20) and (Random(100) < 3) then
begin
ChPon.Used := 1;
ChPon.Xpos := Random(DYoko - 16);
ChPon.Ypos := Random(DTate - 16);
ChPon.Sban := 1;
ChPon.Smov := 0;
ChPon.Slife := Random(80) + 100;
ChPon.Count := 0;
end;
end;
procedure TRei40_07.Stars(var Chpon: TPatDt);
begin
// 管理出现在画面上的星星的行动
case ChPon.Smov of
0: begin
if ChPon.Count > ChPon.Slife then
begin
ChPon.Smov := 1;
ChPon.Count := 0;
end;
end;
1: begin
ChPon.Sban := ChPon.Count and 1;
if ChPon.Count > 16 then
begin
ChPon.Smov := 2;
ChPon.Count := 0;
ChPon.Sban := 2;
end;
end;
2: begin
if ChPon.Count > 5 then
begin
ChPon.Smov := 3;
ChPon.Count := 0;
end;
end;
3: begin
ChPon.Ypos := ChPon.Ypos + 1;
if ChPon.Count > 7 then
begin
ChPon.Smov := 4;
ChPon.Count := 0;
end;
end;
4: ChPon.Ypos := ChPon.Ypos + ChPon.Count;
end;
if ChPon.Ypos > Tate * 16 then
begin
ChPon.Used := 0;
ChPon.Count := 0;
end;
end;
procedure TRei40_07.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 TRei40_07.SbanDi(Sary: array of Byte; X1, Y1: Integer;
Bmap: TBitmap);
var
X, Y: Byte;
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 <= DTate + 16) then
PatDi(Sary[n], X1 + X * 16, Y1 + Y * 16, Bmap);
n := n + 1;
end;
end;
procedure TRei40_07.PatDi(Pnum: Byte; X1, Y1: Integer; Bmap: TBitmap);
begin
// 将指定图案绘制至指定点阵图的指定位置上(重叠显示适用)
PX := (Pnum and $F) * 16;
PY := Pnum and $F0;
Rect_L := Rect(PX, PY, PX + 16, PY + 16);
Rect_D := Rect(X1, Y1, X1 + 16, Y1 + 16);
if Pnum <> 0 then
if Pnum >= PtFull then
begin
Bmap.Canvas.CopyMode := cmSrcPaint;
Bmap.Canvas.CopyRect(Rect_D, Xpat_Bmap.Canvas, Rect_L);
Bmap.Canvas.CopyMode := cmSrcAnd;
Bmap.Canvas.CopyRect(Rect_D, Load_Bmap.Canvas, Rect_L);
end
else begin
Bmap.Canvas.CopyMode := cmSrcCopy;
Bmap.Canvas.CopyRect(Rect_D, Load_Bmap.Canvas, Rect_L);
end;
end;
procedure TRei40_07.ChrCl(Sban: Byte; X1, Y1: Integer; Bmap: TBitmap);
begin
// 以背景去除指定编号的复合图案
case Sban of
0: SbanCl(Spr00[0] * 16, Spr00[1] * 16, X1 + 16, Y1 + 16, Bmap);
1: SbanCl(Spr01[0] * 16, Spr01[1] * 16, X1 + 16, Y1 + 16, Bmap);
2: SbanCl(Spr02[0] * 16, Spr02[1] * 16, X1 + 16, Y1 + 16, Bmap);
end;
end;
procedure TRei40_07.SbanCl(Xdot, Ydot: Word; X1, Y1: Integer; Bmap: TBitmap);
begin
// 将指定大小的背景复制在指定点阵图上
if X1 < 0 then
begin
Xdot := Xdot + X1;
X1 := 0;
end;
if Y1 < 0 then
begin
Ydot := Ydot + Y1;
Y1 := 0;
end;
if (X1 < DYoko + 32) and (Y1 < DTate + 32) then
begin
if (X1 + Xdot) >= (DYoko + 32) then
Xdot := DYoko + 32 - X1;
if (Y1 + Ydot) >= (DTate + 32) then
Ydot := DTate + 32 - Y1;
Bmap.Canvas.CopyMode := cmSrcCopy;
Rect_B := Rect(X1, Y1, X1 + Xdot, Y1 + Ydot);
Bmap.Canvas.CopyRect(Rect_B, Back_Bmap.Canvas, Rect_B);
end;
end;
procedure TRei40_07.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// 将载入用、去除用、背景用与绘制用的点阵图释放掉
Load_Bmap.Free;
Xpat_Bmap.Free;
Back_Bmap.Free;
Make_Bmap.Free;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -