📄 rei_26.pas
字号:
unit Rei_26;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, ExtCtrls, StdCtrls, ImgList;
type
// 定义管理角色的记录类型
TPatDt = record
Used: Byte;
Sban: Byte;
Xpos: Integer;
Ypos: Integer;
Smov: Byte;
Scon: Byte;
end;
TRei40_26 = class(TForm)
MainMenu1: TMainMenu;
ImageList1: TImageList;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Timer1Timer(Sender: TObject);
private
{ Private 定义 }
procedure LoReg(Sban: Byte; X1, Y1: Integer);
procedure MiReg(Sban: Byte; X1, Y1: Integer);
procedure HiReg(Sban: Byte; X1, Y1: Integer);
Procedure DpSprite;
procedure ClSprite;
procedure ChrDi(Xsiz, Ysiz: Byte; Dpon: Word; X1, Y1: Integer;
Bmap: TBitmap);
procedure ChrCl(Sban: Byte; X1, Y1: Integer; Bmap: TBitmap);
public
{ Public 定义 }
end;
const
Yoko = 37; //显示的横向图案数
Tate = 27; //显示的纵向图案数
DYoko = Yoko * 16; //显示的横向点数
DTate = Tate * 16; //显示的纵向点数
MaxSp = 6; //本次使用的总复合图样数
MaxChr = 12; //本次出现的角色总数
Mdots = 3; //角色的移动点数
var
Rei40_26: TRei40_26;
// 定义载入用、ImageList传送用、背景用与绘制用的点阵图
Load_Bmap: TBitmap;
Ipat_Bmap: TBitmap;
Back_Bmap: TBitmap;
Make_Bmap: TBitmap;
// 定义各种变量(Byte类型、Word类型、TRect类型、Integer类型、数组类型)
P, Sn, Rn: Byte;
Sc, Xdot, Ydot: Word;
Rect_L, Rect_B, Rect_M, Rect_D, Rect_I: TRect;
Y2: Integer;
ChPon: array[0..255] of TPatDt;
DipLo: array[0..(3 * 255)] of Integer;
DipMi: array[0..(4 * 255)] of Integer;
DipHi: array[0..(3 * 255)] of Integer;
// 复合图样数组
SpSiz: array[0..(MaxSp * 2 - 1)] of Byte = (
2,2, 2,2, 2,2, 2,3, 3,3, 31,1
);
SpPon: array[0..(MaxSp - 1)] of Word;
SpDat: array[0..57] of Byte = (
24,25,26,27,
28,29,30,31,
32,33,48,49,
64,65,80,81,96,97,
0,19,0,19,0,19,0,19,0,
16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
16,16,16,16,16,16,16,16,16,16
);
implementation
{$R *.DFM}
procedure TRei40_26.FormCreate(Sender: TObject);
var
// 定义局部变量
X, Y, n, Cn: Byte;
begin
// 设定Form属性
Rei40_26.Height := 480;
Rei40_26.Width := 640;
Rei40_26.Canvas.CopyMode := cmSrcCopy;
// 载入图案
Load_Bmap := TBitmap.Create;
Load_Bmap.LoadFromFile(GetCurrentDir + '\ExData\Pat_Sample.bmp');
// 登录至ImageList1
Ipat_Bmap := TBitmap.Create;
Ipat_Bmap.Width := 16;
Ipat_Bmap.Height := 16;
Ipat_Bmap.Canvas.CopyMode := cmSrcCopy;
Rect_I := Rect(0, 0, 16, 16);
for Y := 0 to 15 do
for X := 0 to 15 do
begin
Rect_L := Rect(X * 16, Y * 16, X * 16 + 16, Y * 16 + 16);
Ipat_Bmap.Canvas.CopyRect(Rect_I, Load_Bmap.Canvas, Rect_L);
ImageList1.AddMasked(Ipat_Bmap, clWhite);
end;
Ipat_Bmap.Free;
// 零件贴图指标数组的初始设定
Sc := 0;
for n := 0 to (MaxSp - 1) do
begin
SpPon[n] := Sc;
Sc := Sc + SpSiz[n * 2] * SpSiz[n * 2 + 1];
end;
// 将背景绘制至Back_Bmap上
Back_Bmap := TBitmap.Create;
Back_Bmap.Width := DYoko + 32;
Back_Bmap.Height := DTate + 32;
for Y := 0 to (Tate - 1) do
for X := 0 to (Yoko - 1) do
begin
if (X = 0) or (Y = 0) or (X = Yoko - 1) or (Y = Tate - 1) then
P := 7
else
P := 15;
ImageList1.Draw(Back_Bmap.Canvas, X * 16 + 16, Y * 16 + 16, P);
end;
// 储存绘制用点阵图并复制背景(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);
// 角色数组的初始设定
for Cn := 0 to (MaxChr - 1) do
begin
ChPon[Cn].Used := 1;
ChPon[Cn].Sban := (Cn and 1) + 1;
ChPon[Cn].Xpos := Random(528) + 32;
ChPon[Cn].Ypos := Cn * 24 + 20;
ChPon[Cn].Smov := Random(4);
ChPon[Cn].Scon := Random(20) + 20;
end;
// 零件贴图登录的初始设定
DipLo[0] := 0;
DipMi[0] := 0;
DipHi[0] := 0;
end;
procedure TRei40_26.Timer1Timer(Sender: TObject);
var
// 定义局部变量
Cn: Byte;
begin
// 所有角色的动作管理与零件贴图显示的登录
for Cn := 0 to (MaxChr - 1) do
if ChPon[Cn].Used = 1 then
begin
ChPon[Cn].Scon := ChPon[Cn].Scon - 1;
if ChPon[Cn].Scon = 0 then
begin
ChPon[Cn].Scon := Random(20) + 20;
ChPon[Cn].Smov := Random(4);
end;
case ChPon[Cn].Smov of
0: ChPon[Cn].Xpos := ChPon[Cn].Xpos + Mdots;
1: ChPon[Cn].Xpos := ChPon[Cn].Xpos - Mdots;
2: ChPon[Cn].Ypos := ChPon[Cn].Ypos + Mdots;
3: ChPon[Cn].Ypos := ChPon[Cn].Ypos - Mdots;
end;
if ChPon[Cn].Xpos < 17 then
begin
ChPon[Cn].Xpos := ChPon[Cn].Xpos + Mdots;
ChPon[Cn].Smov := 0;
end
else if ChPon[Cn].Xpos > DYoko - 49 then
begin
ChPon[Cn].Xpos := ChPon[Cn].Xpos - Mdots;
ChPon[Cn].Smov := 1;
end
else if ChPon[Cn].Ypos < 17 then
begin
ChPon[Cn].Ypos := ChPon[Cn].Ypos + Mdots;
ChPon[Cn].Smov := 2;
end
else if ChPon[Cn].Ypos > DTate - 49 then
begin
ChPon[Cn].Ypos := ChPon[Cn].Ypos - Mdots;
ChPon[Cn].Smov := 3;
end;
MiReg(ChPon[Cn].Sban, ChPon[Cn].Xpos, ChPon[Cn].Ypos);
end;
// 其他的零件贴图显示登录
MiReg(5, 3 * 16, 13 * 16);
MiReg(3, 80, 11 * 16 - 6);
MiReg(3, 200, 11 * 16 + 12);
MiReg(3, 330, 11 * 16 - 8);
MiReg(3, 480, 11 * 16 + 16);
LoReg(0, 32, 32);
LoReg(0, 32, 23 * 16);
LoReg(0, 33 * 16, 32);
LoReg(0, 33 * 16, 23 * 16);
HiReg(4, 17 * 16, 12 * 16);
// 零件贴图绘制~Form显示~零件贴图去除
DpSprite;
Rect_M := Rect(16, 16, DYoko + 16, DTate + 16);
Rect_D := Rect(0, 0, DYoko, DTate);
Rei40_26.Canvas.CopyRect(Rect_D, Make_Bmap.Canvas, Rect_M);
ClSprite;
end;
procedure TRei40_26.LoReg(Sban: Byte; X1, Y1: Integer);
begin
// 零件贴图显示登录(DipLo)
Sn := DipLo[0];
if Sn <> 255 then
begin
DipLo[Sn * 3 + 1] := Sban;
DipLo[Sn * 3 + 2] := X1;
DipLO[Sn * 3 + 3] := Y1;
DipLo[0] := Sn + 1;
end;
end;
procedure TRei40_26.MiReg(Sban: Byte; X1, Y1: Integer);
var
// 定义局部变量
n: Byte;
begin
// 零件贴图显示登录(DipMi)
Sn := DipMi[0];
if Sn <> 255 then
begin
Rn := 0;
Y2 := Y1 + SpSiz[Sban * 2 + 1] * 16;
while (Rn < Sn) and (Y2 >= DipMi[Rn * 4 + 4]) do
Rn := Rn + 1;
if Rn < Sn then
for n := Sn downto (Rn + 1) do
begin
DipMi[n * 4 + 4] := DipMi[(n - 1) * 4 + 4];
DipMi[n * 4 + 3] := DipMi[(n - 1) * 4 + 3];
DipMi[n * 4 + 2] := DipMi[(n - 1) * 4 + 2];
DipMi[n * 4 + 1] := DipMi[(n - 1) * 4 + 1];
end;
DipMi[0] := Sn + 1;
DipMi[Rn * 4 + 1] := Sban;
DipMi[Rn * 4 + 2] := X1;
DipMi[Rn * 4 + 3] := Y1;
DipMi[Rn * 4 + 4] := Y2;
end;
end;
procedure TRei40_26.HiReg(Sban: Byte; X1, Y1: Integer);
begin
// 零件贴图显示登录(DipHi)
Sn := DipHi[0];
if Sn <> 255 then
begin
DipHi[Sn * 3 + 1] := Sban;
DipHi[Sn * 3 + 2] := X1;
DipHi[Sn * 3 + 3] := Y1;
DipHi[0] := Sn + 1;
end;
end;
procedure TRei40_26.DpSprite;
var
// 定义局部变量
DPn, n: Byte;
begin
// 被登录的零件贴图显示
for DPn := 1 to DipLO[0] do
begin
n := DipLo[DPn * 3 - 2];
ChrDi(SpSiz[n * 2], SpSiz[n * 2 + 1], SpPon[n],
DipLo[DPn * 3 - 1] + 16, DipLO[DPn * 3] + 16, Make_Bmap);
end;
for DPn := 1 to DipMi[0] do
begin
n := DipMi[DPn * 4 - 3];
ChrDi(SpSiz[n * 2], SpSiz[n * 2 + 1], SpPon[n],
DipMi[DPn * 4 - 2] + 16, DipMi[DPn * 4 - 1] + 16, Make_Bmap);
end;
for DPn := 1 to DipHi[0] do
begin
n := DipHi[DPn * 3 - 2];
ChrDi(SpSiz[n * 2], SpSiz[n * 2 + 1], SpPon[n],
DipHi[DPn * 3 - 1] + 16, DipHi[DPn * 3] + 16, Make_Bmap);
end;
end;
procedure TRei40_26.ClSprite;
var
// 定义局部变量
Dpn: Byte;
begin
// 被登录的零件贴图之去除与清除
for DPn := 1 to DipLO[0] do
ChrCl(DipLo[DPn * 3 - 2], DipLo[DPn * 3 - 1] + 16,
DipLO[DPn * 3] + 16, Make_Bmap);
for DPn := 1 to DipMi[0] do
ChrCl(DipMi[DPn * 4 - 3], DipMi[DPn * 4 - 2] + 16,
DipMi[DPn * 4 - 1] + 16, Make_Bmap);
for DPn := 1 to DipHi[0] do
ChrCl(DipHi[DPn * 3 - 2], DipHi[DPn * 3 - 1] + 16,
DipHi[DPn * 3] + 16, Make_Bmap);
DipLo[0] := 0;
DipMi[0] := 0;
DipHi[0] := 0;
end;
procedure TRei40_26.ChrDi(Xsiz, Ysiz: Byte; Dpon: Word;
X1, Y1: Integer; Bmap: TBitmap);
var
// 定义局部变量
CDX, CDY: Byte;
begin
// 将指定角色绘制至指定的点阵图上
for CDY := 0 to (Ysiz - 1) do
for CDX := 0 to (Xsiz - 1) do
begin
if (X1 + CDX * 16 >= 0) and (X1 + CDX * 16 <= DYoko + 16) and
(Y1 + CDY * 16 >= 0) and (Y1 + CDY * 16 <= DTate + 16) then
ImageList1.Draw(Bmap.Canvas, X1 + CDX * 16, Y1 + CDY * 16,
SpDat[Dpon]);
Dpon := Dpon + 1;
end;
end;
procedure TRei40_26.ChrCl(Sban: Byte; X1, Y1: Integer; Bmap: TBitmap);
begin
// 以背景去除指定编号的复合图样
Xdot := SpSiz[Sban * 2] * 16 + 16;
Ydot := SpSiz[Sban * 2 + 1] * 16 + 16;
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_26.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// 将载入用、背景用与绘制用的点阵图释放掉
Load_Bmap.Free;
Back_Bmap.Free;
Make_Bmap.Free;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -