📄 unit3.pas
字号:
unit Unit3; //types,consts and basic functions
interface
uses SysUtils;
type
SByte = -100..100;
T3DPoint = array[1..3] of Single;
T3DPointB = array[1..3] of SByte;
MinRange = -1..1;
PMinRange = 0..1; //Postive MinRange
Directions = (md_Up, md_Down, md_Left, md_Right, md_In, md_Out); //按1.上 2.下 3.左 4.右 5.前 6.后
//转动方向,指的是ASDW按键
TurnDirection = (td_Up, td_Down, td_Left, td_Right, td_Accelerate);
EyePos = (ep_Front, ep_Right, ep_Back, ep_Left);
EyeHeight = (eh_Low, eh_Middle, eh_High);
SnakeCollisionType = (ct_Wall, ct_Obstacle, ct_SelfBody); //蛇碰撞到什么了?
const
MaxLength = 20;
Chr10Chr13 = Chr(10) + Chr(13); //回车换行符
str_Snake = 'Snake';
str_Color = 'Color';
str_ShowGrid = 'ShowGrid';
str_WallAlpha = 'WallAlpha';
str_MapCount = 'MapCount';
str_LightOn = 'LightOn';
str_ShowAidLine = 'ShowAidLine';
str_SnakeHeadPos = '蛇头位置: ';
str_SnakeLength = '蛇长度: ';
str_ApplePos = '苹果位置: ';
str_DrawEngine = '绘图引擎: ';
str_MapName = '关卡名称: ';
str_MapAppleCount = '关卡苹果数: ';
str_SnakeSpeed = '蛇速度: ';
str_AppleRemains = '还有%d个苹果。';
msg_WantEndNowGame = '想要结束现在的游戏吗?';
msg_FileMissing = '文件丢失!';
msg_FileFailed = '地图文件损坏!读取失败。';
msg_SnakeCollision: array[ct_Wall..ct_SelfBody] of string = ('蛇碰到墙壁了,', '蛇碰到障碍物了,', '蛇碰到自己的身体了,');
msg_GameEnd = '游戏结束。';
msg_GameEngToDo = '你可以重玩这一关,也可以换张地图。';
msg_IfPlayAgain = '是否重玩?';
msg_LevelPassed = '恭喜你,你过了这一关!';
msg_IfStartNextGame = '是否自动开始下一关?';
msg_GameOnIfExit = '有游戏正在进行,真的退出 3D贪食蛇 吗?';
msg_NoFileToShowScript = '没有地图文件被加裁,无法显示脚本信息!';
msg_NoFileToRestart = '没有地图文件可以重新开始。';
msg_NoFileToClose = '没有文件可以关闭!';
msg_NoLevelToBeNext = '这已经是最后一关了,无法打开下一关,想重新玩吗?';
msg_WantToRestart = '真的想重新开始这一关游戏吗?';
msg_WantToClose = '真的想关闭地图文件吗?';
BlockDataBeginLine = 10; //当地图文件中新增属性后可能导致障碍物语句(Block x1,y1,z1,x2,y2,z2)下移
BoxVertex: array[1..6, 1..4, 1..3] of PMinRange = (
((0, 1, 0), (0, 1, 1), (1, 1, 1), (1, 1, 0)),
((1, 0, 0), (1, 0, 1), (0, 0, 1), (0, 0, 0)),
((0, 1, 0), (0, 0, 0), (0, 0, 1), (0, 1, 1)),
((1, 1, 1), (1, 0, 1), (1, 0, 0), (1, 1, 0)),
((0, 1, 1), (0, 0, 1), (1, 0, 1), (1, 1, 1)),
((1, 1, 0), (1, 0, 0), (0, 0, 0), (0, 1, 0))
); //上下左右前后,外框的6个顶点
BoxNormals: array[1..6, 1..3] of MinRange = ((0, 1, 0), (0, -1, 0), (-1, 0, 0),
(1, 0, 0), (0, 0, 1), (0, 0, -1));
DrawGridLineFace: array[md_Up..md_Out, 1..4, 1..3] of PMinRange = (
((0, 0, 0), (1, 0, 0), (1, 0, 1), (0, 0, 1)),
((0, 1, 0), (1, 1, 0), (1, 1, 1), (0, 1, 1)),
((1, 0, 0), (1, 0, 1), (1, 1, 1), (1, 1, 0)),
((0, 0, 0), (0, 0, 1), (0, 1, 1), (0, 1, 0)),
((0, 0, 1), (1, 0, 1), (1, 1, 1), (0, 1, 1)),
((0, 0, 0), (1, 0, 0), (1, 1, 0), (0, 1, 0))
);
//见Unit2 TDrawEngine.DrawGridLine 过程
//这个数组记录了沿蛇运动方向看去,每个方块露出的那个面(是正方形)的四个点的坐标与方块原坐标的关系,以便计算出来
AidLineXYZWithSnake: array[md_Up..md_Out] of 1..3 = (3, 3, 2, 2, 1, 1);
AidLineToSetAxis: array[md_Up..md_Out] of 1..3 = (2, 2, 1, 1, 3, 3);
AidLineSetToWhat: array[md_Up..md_Out] of PMinRange = (1, 0, 0, 1, 0, 1);
//见Unit2效 TDrawEngine.DrawAidLine 过程
MoveDirection: array[md_Up..md_Out, 1..3] of MinRange = ((0, 1, 0), (0, -1, 0), (-1, 0, 0), (1, 0, 0), (0, 0, -1), (0, 0, 1));
//将移动方向转换为坐标的变换
SnakeDirectionID: array[1..3, False..True] of Directions = (
(md_Left, md_Right), (md_Down, md_Up), (md_In, md_Out));
//用于初始化蛇的方向,见Unit2 TDrawEngine.PrepareSnake过程 ,
//SnakeDirectionID[i,Aboolean],i取1、2、3,分别代表x、y、z
//SnakeDirectionID[1,True]代表蛇头和蛇尾方块坐标中x坐标不同,蛇头的x坐标大于蛇尾的x坐标为真时,蛇的方向
AbsoluteAxis: array[ep_Front..ep_Left] of 1..3 = (3, 1, 3, 1);
EyePosH: packed array[ep_Front..ep_Left, 1..3] of Single = (
(0.5, 0.5, 1.7), (1.3, 0.5, 0.5), (0.5, 0.5, -0.7), (-0.3, 0.5, 0.5));
EyePosV: packed array[eh_Low..eh_High] of Single = (-0.1, 0.5, 1.1);
WallDrawOrder: array[ep_Front..ep_Left, eh_Low..eh_High, 1..6] of Byte = (
((1, 3, 4, 6, 5, 2), (6, 3, 4, 1, 2, 5), (2, 3, 4, 6, 5, 1)),
((3, 1, 5, 6, 4, 2), (3, 5, 6, 1, 2, 4), (2, 3, 5, 6, 4, 1)),
((1, 5, 3, 4, 6, 2), (5, 3, 4, 1, 2, 6), (2, 5, 3, 4, 6, 1)),
((1, 4, 5, 6, 2, 3), (4, 1, 2, 5, 6, 3), (2, 4, 5, 6, 3, 1))
); //在不同视角下,墙壁的绘制顺序,以便绘制出透明效果,利用此数组可以省略距离远近的计算
//参见 Unit2 TDrawEngine.DrawWall过程
TurnedDirection: packed array[ep_Front..ep_Left, md_Up..md_Out, td_Up..td_Right] of Directions =
(
(
(md_In, md_Out, md_Left, md_Right), (md_In, md_Out, md_Left, md_Right),
(md_Up, md_Down, md_Out, md_In), (md_Up, md_Down, md_In, md_Out),
(md_Up, md_Down, md_Left, md_Right), (md_Up, md_Down, md_Left, md_Right)
),
(
(md_Left, md_Right, md_Out, md_In), (md_Left, md_Right, md_Out, md_In),
(md_Up, md_Down, md_Out, md_In), (md_Up, md_Down, md_Out, md_In),
(md_Up, md_Down, md_Left, md_Right), (md_Up, md_Down, md_Right, md_Left)
),
(
(md_Out, md_In, md_Right, md_Left), (md_Out, md_In, md_Right, md_Left),
(md_Up, md_Down, md_Out, md_In), (md_Up, md_Down, md_In, md_Out),
(md_Up, md_Down, md_Right, md_Left), (md_Up, md_Down, md_Right, md_Left)
),
(
(md_Right, md_Left, md_In, md_Out), (md_Right, md_Left, md_In, md_Out),
(md_Up, md_Down, md_In, md_Out), (md_Up, md_Down, md_In, md_Out),
(md_Up, md_Down, md_Left, md_Right), (md_Up, md_Down, md_Right, md_Left)
));
//TurnedDirection[i,t,k],该数组记录了当玩家的视野位置为i,蛇沿t方向移动,玩家按k键时蛇变化后的 "绝对" 移动方向
//参见Unit2 TDrawEngine.SnakeTurn 过程
KeyDirectorStr: array[md_Up..md_Out] of string = ('向上', '向下', '向左', '向右', '向里', '向外');
ViewDirection: packed array[ep_Front..ep_Left, md_Up..md_Out, td_Up..td_Right] of Directions =
(
(
(md_In, md_Out, md_Left, md_Right), (md_In, md_Out, md_Left, md_Right),
(md_Up, md_Down, md_Out, md_In), (md_Up, md_Down, md_In, md_Out),
(md_Up, md_Down, md_Left, md_Right), (md_Up, md_Down, md_Left, md_Right)
),
(
(md_In, md_Out, md_Left, md_Right), (md_In, md_Out, md_Left, md_Right),
(md_Up, md_Down, md_Left, md_Right), (md_Up, md_Down, md_Left, md_Right),
(md_Up, md_Down, md_In, md_Out), (md_Up, md_Down, md_Out, md_In)
),
(
(md_In, md_Out, md_Left, md_Right), (md_In, md_Out, md_Left, md_Right),
(md_Up, md_Down, md_In, md_Out), (md_Up, md_Down, md_Out, md_In),
(md_Up, md_Down, md_Left, md_Right), (md_Up, md_Down, md_Left, md_Right)
),
(
(md_Up, md_Down, md_Left, md_Right), (md_Up, md_Down, md_Left, md_Right),
(md_Up, md_Down, md_Left, md_Right), (md_Up, md_Down, md_Left, md_Right),
(md_Up, md_Down, md_Out, md_In), (md_Up, md_Down, md_In, md_Out)
));
////ViewDirection[i,t,k],该数组记录了当玩家的视野位置为i,蛇沿t方向(绝对的)移动,按下k键后蛇的 "视野" 移动方向(看上去的移动方向)
////见Unit2 TDrawEngine.ShowKeyDirector 过程
//键盘按键
kb_ASDW = [65, 68, 83, 87];
kb_Accelerate = 74; //'J' 加速按钮
kb_PauseOrResume = 75; //'K' 暂停
kb_ViewAngleH = 85; //'U' 水平视角变换
kb_ViewAngleV = 73; //'I' 垂直视角变换
kb_FarNear = 79; //'O' 远近调节
kb_Up = 87; //W
kb_Down = 83; //S
kb_Left = 65; //A
kb_Right = 68; //D
FarNearValue: array[1..3] of Single = (1.3, 1, 0.75);
var
CommaData: array[1..10] of Byte;
CommDataCou: Byte;
function ReadSpaceSection(s: string): string;
procedure DrawDataFromCommaExp(s: string); //从一连串逗号分隔的数据中读取
implementation
function ReadSpaceSection(s: string): string;
var i: Integer;
begin
i := pos(' ', s);
Delete(s, 1, i);
Result := s;
end;
procedure DrawDataFromCommaExp(s: string); //从一连串逗号分隔的数据中读取
var i: Byte;
begin //4,1,4,15,
s := s + ',';
CommDataCou := 0;
repeat
i := pos(',', s);
inc(CommDataCou);
CommaData[CommDataCou] := StrToInt(Copy(s, 1, i - 1));
Delete(s, 1, i);
until Length(s) = 0;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -