亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? unit2.pas

?? 3d snake 游戲編程源碼
?? PAS
?? 第 1 頁 / 共 3 頁
字號:
unit Unit2; //系統核心單元

interface
uses Windows, OpenGL, Graphics, SysUtils, Dialogs, Math, ExtCtrls, Classes,
   Menus, Controls, Unit3;

type
   ObjNames = (obj_Wall, obj_Block, obj_GridLine, obj_AidLine, obj_HighlightedAidLine, obj_SnakeBody, obj_SnakeHead, obj_IncApple, obj_DecApple, obj_Exit);
   BlockStates = (bs_Empty, bs_Wall, bs_Obstacle, bs_SnakeBody, bs_IncApple, bs_DecApple, bs_Exit);
   BlockType = (bt_Block, bt_AntiBlock);
   GameOptionColors = array[obj_Wall..obj_Exit] of TColor;
   SnakeExtraState = (se_None, se_IncApple, se_DecApple, se_Exit);

const
   AppleToBlockState: array[obj_IncApple..obj_DecApple] of BlockStates = (bs_IncApple, bs_DecApple);

type
   TGameOption = record
      Colors: GameOptionColors; //
      ColorsRGB: array[obj_Wall..obj_Exit, 1..3] of Byte;
      WallColor: array[1..6, 1..3] of Byte;
      WallAlpha: Byte;
      ShowGrid: Boolean;
      ShowAidLine: Boolean;
      LightOn: Boolean;
   end;

   TMapCtrl = class
      MapDir: string;
      MapCount: Byte;
      MapsName: array of string[20];

      AFile: TextFile;
      GeneratedMapScript: TStringList;

      constructor Create;
      destructor Destroy; override;

      function MapFileName(idx: Byte): string;
      procedure LoadMaps;
   end;

   TMapProperty = record
      MapName: string;
      MapDescription: string;
      Ori_SnakeHead, OriSnakeTail: T3DPointB;
      MapValue: Byte;
      AppleCount: Byte;
      SnakeSpeed: Byte;
      AppleList: string;
      UseEngineVersion: Byte;
   end;

   PTSnakeBody = ^TSnakeBody;
   TSnakeBody = record
      Pre, Next: PTSnakeBody; //分別存儲上一塊和下一個身體
      OriPos: T3DPointB; //記錄這個球所在的方塊
      CenterPos: T3DPoint; //記錄球心的位置
      qObj: gluQuadricObj;
   end;

   TBlock = record
      _Type: BlockType;
      LeftBackBottom, RightFrontTop: T3DPointB; //左后下頂點和右上前頂點
   end;

   TApple = record
      _Interval: Byte;
      _Type: ObjNames; //只有 obj_IncApple, obj_DecApple
      OriPos: T3DPointB;
      CenterPos: T3DPoint;
      qObj: gluQuadricObj;
      Moveable: Boolean;
      MoveTickCount: Byte;
   end;

   PTDrawEngine = ^TDrawEngine;
   PTGameCtrl = ^TGameCtrl;

   TDrawEngine = class //繪圖引擎
      _GameCtrl: PTGameCtrl;
      AppleMoveTimer: TTimer; //控制蘋果移動的時鐘控件

      DrawDC: HDC;
      HRC: HGLRC;
      ViewWidth, ViewHeight: Word;
      ViewAngleH: EyePos;
      ViewAngleV: EyeHeight;
      ViewAngleVMoveUp: Boolean;
      ViewDistance: Byte;
      ViewDistanceMoveUp: Boolean;

      MapScript: TStringList; //地圖腳本
      MapFileName: string;
      MapProperty: TMapProperty; //地圖的一些屬性
      MapSize: T3DPointB; //經常使用,把它從MapProperty中提出來
      BoxCenter: T3DPoint; //場景中心

      SnakeHead, SnakeTail: PTSnakeBody; //用鏈表存儲蛇身,這樣蛇的移動就可以轉化為把蛇尾的方塊移到蛇頭,速度很快
      SnakeDirection: Directions;
      SnakeLength: Byte;

      Blocks: array of TBlock;
      BlockCount: Byte;

      WallLists: array[1..6] of GLuint; //繪制墻壁的glList

      //將場景中的每個方塊的狀態記錄下來,可以完成碰撞檢測
      BlockState: packed array[-1..MaxLength, -1..MaxLength, -1..MaxLength] of BlockStates;

      NowApple: TApple;
      EatAppleCount: Byte;

      ExitShow: Boolean;
      ExitPos: T3DPointB;

      ///////OpenGl
      procedure IniOpenGl;
      procedure IniLighting;
      procedure IniScene; //場景初始化
      procedure FreeOpenGl;
      procedure DrawCube(p1, p2: T3DPointB; _Type: Integer = GL_QUADS); //繪制以p1為左后下頂點,p2為右前上頂點的長方體
      procedure DrawSphere(Part: PTSnakeBody); //實際為繪制蛇身的一節一節
      procedure SetGLColor(idx: ObjNames); //設置繪圖顏色
      procedure SetEye; //設置眼睛的位置
      procedure NextViewAngelV; //轉換水平視角
      procedure NextViewAngelH; //轉換垂直視角
      procedure ChangeFarNear;

      ////////////////////////////
      procedure CloseMap;
      procedure SnakeTurn(Turn: TurnDirection); //蛇轉向
      procedure SnakeMove; //蛇移動控制過程
      procedure ReadScript; //讀取腳本
      procedure LoadBlocks; //讀取障礙物的位置
      procedure MakeWallDrawLists; //生成繪制墻壁的glList
      procedure DrawGridLine; //繪制網格線,圍繞蛇頭的,以便玩家觀察是否接近障礙物
      procedure DrawAidLine(posi: T3DPointB); //繪制輔助觀察線
      procedure DrawWall; //繪制墻壁
      procedure CreateApple; //生成一個蘋果
      procedure DrawApple; //繪制當前蘋果
      procedure CreateExit; //生成出口
      procedure DrawExit; //繪制出口
      procedure IniBlockState; //初始化每個方塊的狀態
      procedure PrepareSnake; //準備蛇的各個身體組成方塊,同時計算出蛇的初始方向
      procedure DrawScene; //游戲中實時刷新場景
      procedure PickApple; //吃到增長蘋果
      procedure AppleMoveTimerTick(Sender: TObject);

      function ReturnAnEmptyBlock: T3DPointB; //返回一個空的格子

      procedure OutputGameProperties; //輸出游戲屬性到MainForm.MemoMap
      procedure ShowSnakePosLengthInLabel; //輸出蛇的位置和長度信息
      procedure ShowApplePos; //顯示蘋果的位置
      procedure SetAppleTimeLableVisible(b: Boolean); //設置蘋果時間的Lable是否可見
      procedure ShowKeyDirectors; //顯示方向鍵提示信息

      constructor Create(hnd: THandle; aW, aH: Word);
      destructor Destroy; override;
   end;

   TGameCtrl = class
      _Engine: PTDrawEngine; //繪圖引擎

      MoveTimer: TTimer; //控制蛇移動的Timer

      NowLevelIdx: Byte;

      AMapLoaded: Boolean;
      GameEnd: Boolean;
      GameStarted: Boolean;
      GamePaused: Boolean;

      /////////GameCtrl
      procedure NewGame(FileName: string);
      procedure Game_Start(Turn: TurnDirection);
      procedure Game_End; //游戲結束
      procedure Game_Pause; //游戲暫停
      procedure Game_Resume; //恢復暫停的游戲
      procedure Game_Restart; //重新開始游戲
      procedure CloseMap;
      procedure LevelPassed; //本關通過
      procedure StartNextLevel; //開啟下一關
      procedure MoveTimerTick(Sender: TObject);
      procedure SnakeCollision(t: SnakeCollisionType); //蛇碰障礙物了
      function AskIfGameEnd: Boolean; //訊問是否結束游戲
      function AskNextStep(msg: string): Boolean; //訊問游戲結束后怎么辦


      constructor Create;
      destructor Destroy; override;

   end;

function Make_3DPointB(x, y, z: Byte): T3DPointB;
procedure RGBGameColors;
procedure LoadWallColors;
procedure MakeItToSphereCenter(var P: T3DPoint);
procedure _3DPointB_To_3DPoint(var _3DPoint: T3DPoint; _3DPointB: T3DPointB);

implementation
uses Unit1;

procedure LoadWallColors;
begin
   fillChar(GameOption.WallColor, sizeof(GameOption.WallColor), 0);
   GameOption.WallColor[1, 1] := 255;
   GameOption.WallColor[2, 1] := 255;

   GameOption.WallColor[3, 2] := 255;
   GameOption.WallColor[4, 2] := 255;

   GameOption.WallColor[5, 3] := 255;
   GameOption.WallColor[6, 3] := 255;
end;

function Make_3DPointB(x, y, z: Byte): T3DPointB;
begin
   Result[1] := x;
   Result[2] := y;
   Result[3] := z;
end;

procedure _3DPointB_To_3DPoint(var _3DPoint: T3DPoint; _3DPointB: T3DPointB);
begin
   _3DPoint[1] := _3DPointB[1];
   _3DPoint[2] := _3DPointB[2];
   _3DPoint[3] := _3DPointB[3];
end;

procedure RGBGameColors;
var i: ObjNames;
begin
   with GameOption do
      for i := obj_Wall to obj_Exit do begin
         ColorsRGB[i, 1] := GetRValue(Colors[i]);
         ColorsRGB[i, 2] := GetGValue(Colors[i]);
         ColorsRGB[i, 3] := GetBValue(Colors[i]);
      end;
end;

procedure MakeItToSphereCenter(var P: T3DPoint);
begin
   P[1] := P[1] + 0.5;
   P[2] := P[2] + 0.5;
   P[3] := P[3] + 0.5;
end;

/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////

constructor TMapCtrl.Create;
begin
   GeneratedMapScript := TStringList.Create;
end;

destructor TMapCtrl.Destroy;
begin
   GeneratedMapScript.Free;
end;

procedure TMapCtrl.LoadMaps;
var i: Byte; fn: string; s: string;
   Item: TMenuItem;
begin
   SetLength(MapsName, MapCount);
   for i := 0 to MapCount - 1 do begin
      fn := 'Map' + IntToStr(i + 1) + '.map';
      AssignFile(AFile, MapDir + fn);
      Reset(AFile);
      Readln(AFile, s);
      Readln(AFile, s);
      MapsName[i] := ReadSpaceSection(s);
      CloseFile(AFile);
      Item := TMenuItem.Create(nil);
      Item.Caption := MapsName[i] + ' @ ' + fn;
      Item.Tag := i + 1;
      Item.OnClick := MainForm.MapClick;
      Item.AutoCheck := True;
      Item.RadioItem := True;
      MainForm.MenuOpenGame.Add(Item);
   end;
end;

function TMapCtrl.MapFileName(idx: Byte): string;
begin
   Result := MapDir + 'Map' + IntToStr(idx) + '.map';
end;

////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////

constructor TDrawEngine.Create(hnd: THandle; aW, aH: Word);
begin
   DrawDC := GetDC(hnd);
   ViewWidth := aW;
   ViewHeight := aH;
   MapScript := TStringList.Create;
   AppleMoveTimer := TTimer.Create(nil);
   AppleMoveTimer.Enabled := False;
   AppleMoveTimer.Interval := 1000;
   AppleMoveTimer.OnTimer := AppleMoveTimerTick;
   IniOpenGl;
end;

destructor TDrawEngine.Destroy;
begin
   MapScript.Free;
end;

procedure TDrawEngine.IniOpenGl;
var pfd: TPIXELFORMATDESCRIPTOR; pixelFormat: Integer;
begin
   with pfd do
   begin
      nSize := sizeof(TPIXELFORMATDESCRIPTOR); // 此結構尺寸
      nVersion := 1;
      dwFlags := PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or PFD_DOUBLEBUFFER; // 使用雙緩沖區
      iPixelType := PFD_TYPE_RGBA; //使用RGBA顏色空間
      cColorBits := 16;
      cRedBits := 0;
      cRedShift := 0;
      cGreenBits := 0;
      cGreenShift := 0;
      cBlueBits := 0;
      cBlueShift := 0;
      cAlphaBits := 0;
      cAlphaShift := 0;
      cAccumBits := 0;
      cAccumRedBits := 0;
      cAccumGreenBits := 0;
      cAccumBlueBits := 0;
      cAccumAlphaBits := 0;
      cDepthBits := 16;
      cStencilBits := 0;
      cAuxBuffers := 0;
      iLayerType := PFD_MAIN_PLANE;
      bReserved := 0;
      dwLayerMask := 0;
      dwVisibleMask := 0;
      dwDamageMask := 0;
   end;
   pixelFormat := ChoosePixelFormat(DrawDC, @pfd);
   SetPixelFormat(DrawDC, pixelFormat, @pfd);
   HRC := wglCreateContext(DrawDC);
   wglMakeCurrent(DrawDC, HRC);
end;

procedure TDrawEngine.FreeOpenGl;
begin

end;

procedure TDrawEngine.CloseMap;
begin
   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
   glLoadIdentity;
   glClearColor(0, 0, 0, 1);
   SwapBuffers(DrawDC);
end;

procedure TDrawEngine.IniScene;
begin
   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
   glLoadIdentity;
   glClearColor(0, 0, 0, 1);

   glViewPort(0, 0, ViewWidth, ViewHeight); //指定OpenGL在此區域內繪圖。

   glEnable(GL_CULL_FACE);
   glCullFace(GL_BACK);
   glEnable(GL_DEPTH_TEST); //無論繪制的先后,讓距離遠的物體總在距離近的物體后面。

   ViewAngleH := ep_Front; //正面
   ViewAngleV := eh_Middle; //中間
   ViewAngleVMoveUp := True; //視角先向上移動
   ViewDistance := 2;
   ViewDistanceMoveUp := False;

   SetEye;
end;

procedure TDrawEngine.IniLighting;
var
   MaterialAmbient: array[1..4] of GLfloat;
   MaterialDiffuse: array[1..4] of GLfloat;
   MaterialSpecular: array[1..4] of GLfloat;
   AmbientLightPosition: array[1..4] of GLfloat;
   LightAmbient: array[1..4] of GLfloat;
   MaterialShininess: GLfloat;
begin
   MaterialAmbient[1] := 0.5;
   MaterialAmbient[2] := 0.8;
   MaterialAmbient[3] := 0.2;
   MaterialAmbient[4] := 1.0;

   MaterialDiffuse[1] := 0.4;
   MaterialDiffuse[2] := 0.8;
   MaterialDiffuse[3] := 0.1;
   MaterialDiffuse[4] := 1.0;

   MaterialSpecular[1] := 1.0;
   MaterialSpecular[2] := 0.5;
   MaterialSpecular[3] := 0.1;
   MaterialSpecular[4] := 1.0;

   MaterialShininess := 40; //可設置

   AmbientLightPosition[1] := 0.5;
   AmbientLightPosition[2] := 1.0;
   AmbientLightPosition[3] := 0;
   AmbientLightPosition[4] := 0.0;

   LightAmbient[1] := 0.4;
   LightAmbient[2] := 0.2;
   LightAmbient[3] := 0.2;
   LightAmbient[4] := 1.0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品18久久久久久久久| 亚洲午夜电影在线| 欧洲av在线精品| 91蝌蚪porny| 91丝袜美腿高跟国产极品老师| 国产成人午夜片在线观看高清观看| 免费久久99精品国产| 日本强好片久久久久久aaa| 五月婷婷激情综合| 久久精品噜噜噜成人av农村| 久久国产夜色精品鲁鲁99| 国产精品自拍在线| 成人国产视频在线观看| 91啦中文在线观看| 3751色影院一区二区三区| 日韩欧美国产午夜精品| 国产欧美日韩不卡免费| 亚洲人成精品久久久久| 亚洲超丰满肉感bbw| 美国欧美日韩国产在线播放| 亚洲靠逼com| 中文字幕亚洲综合久久菠萝蜜| 亚洲免费高清视频在线| 天天av天天翘天天综合网色鬼国产| 亚洲永久免费视频| 国内久久精品视频| 99久久精品久久久久久清纯| 欧美性欧美巨大黑白大战| 在线播放一区二区三区| 国产精品污网站| 一区二区三区中文在线| 男人的天堂久久精品| 国产成人在线视频网站| 91久久线看在观草草青青| 欧美一区二区三区系列电影| 久久久久久免费网| 亚洲.国产.中文慕字在线| 国产老肥熟一区二区三区| 欧美在线制服丝袜| 久久伊人中文字幕| www激情久久| 亚洲电影欧美电影有声小说| 国产福利一区二区| 欧美精品在线一区二区三区| 欧美国产精品一区| 日韩主播视频在线| 成人小视频免费在线观看| 欧美午夜电影在线播放| 久久久国产精品午夜一区ai换脸| 亚洲成人综合网站| proumb性欧美在线观看| 欧美精品一区二区精品网| 亚洲伦在线观看| 成人va在线观看| 久久一区二区视频| 免费观看成人鲁鲁鲁鲁鲁视频| 一本在线高清不卡dvd| 欧美激情中文字幕一区二区| 麻豆专区一区二区三区四区五区| 在线视频欧美精品| 亚洲日本护士毛茸茸| 国产成人精品在线看| 精品国产不卡一区二区三区| 日韩国产欧美三级| 欧美乱妇15p| 亚洲午夜精品一区二区三区他趣| 99久久99久久精品免费观看| 国产婷婷色一区二区三区 | 国产福利精品导航| 日韩欧美高清一区| 精品在线免费观看| 欧美大度的电影原声| 免费成人美女在线观看.| 欧美伦理视频网站| 日本不卡不码高清免费观看| 制服.丝袜.亚洲.中文.综合| 亚洲图片欧美一区| 欧美日韩不卡在线| 人妖欧美一区二区| 日韩欧美一区二区不卡| 激情综合网天天干| 国产视频一区不卡| 成人综合激情网| 国产精品久久免费看| 99久久99久久综合| 亚洲一区二区三区国产| 欧美日韩成人综合| 久久99最新地址| 国产精品免费视频网站| av一区二区三区在线| 亚洲国产中文字幕| 日韩欧美在线不卡| 国产成人精品在线看| 亚洲日穴在线视频| 欧美一区二区三区小说| 国产福利不卡视频| 亚洲制服丝袜一区| 精品日韩在线观看| 成人97人人超碰人人99| 亚洲精品高清视频在线观看| 欧美丰满高潮xxxx喷水动漫| 精品一区二区三区的国产在线播放| 久久久亚洲综合| 在线中文字幕一区| 国产专区综合网| 亚洲欧美另类久久久精品2019| 欧美精品三级日韩久久| 国产不卡一区视频| 亚洲午夜日本在线观看| 久久综合九色综合97婷婷| 色综合欧美在线| 韩国成人福利片在线播放| 亚洲人吸女人奶水| 久久综合九色综合欧美98| 欧美怡红院视频| 国产电影一区在线| 人人狠狠综合久久亚洲| 综合精品久久久| 欧美mv日韩mv国产网站app| av中文字幕不卡| 久久99蜜桃精品| 亚洲综合一二区| 国产亚洲精品aa午夜观看| 在线播放国产精品二区一二区四区| 国产成人啪午夜精品网站男同| 亚洲午夜一区二区| 亚洲色图在线播放| 国产欧美日韩视频一区二区| 日韩欧美一级精品久久| 欧美中文字幕不卡| 91免费观看国产| 国产成人av影院| 久久99深爱久久99精品| 日韩 欧美一区二区三区| 亚洲免费视频成人| 亚洲国产精品成人综合| 久久色成人在线| 欧美一二三四区在线| 欧美性xxxxxx少妇| 日本精品视频一区二区| aaa亚洲精品一二三区| 国产精品77777| 久久99国产精品久久99果冻传媒| 亚洲自拍偷拍图区| 一区二区久久久久| 一区二区在线观看免费| 亚洲人精品午夜| 中文字幕日韩一区| 亚洲激情自拍偷拍| 一区二区三国产精华液| 一区二区三区在线影院| 亚洲欧美电影院| 亚洲一区二区三区免费视频| 亚洲一区在线看| 性做久久久久久久免费看| 亚洲成a人片在线不卡一二三区 | 欧美videos大乳护士334| 欧美久久婷婷综合色| 欧美另类一区二区三区| 91精品国产综合久久国产大片| 欧美少妇一区二区| 91精品国产美女浴室洗澡无遮挡| 在线观看91av| 精品福利视频一区二区三区| 久久亚洲综合色一区二区三区| xfplay精品久久| 国产精品第一页第二页第三页| 中文字幕亚洲视频| 亚洲6080在线| 国内精品在线播放| 9l国产精品久久久久麻豆| 99re视频精品| 337p亚洲精品色噜噜噜| 亚洲精品一区二区三区99| 国产精品久久久久久久久图文区| 综合久久久久久久| 日韩av一二三| 粉嫩嫩av羞羞动漫久久久| 欧洲人成人精品| 久久一留热品黄| 亚洲精品欧美专区| 久久福利视频一区二区| 不卡av在线网| 91精品一区二区三区久久久久久 | 亚洲欧美一区二区三区久本道91| 亚洲一区中文日韩| 国产美女av一区二区三区| 色婷婷av一区二区三区之一色屋| 欧美一区中文字幕| 国产精品欧美久久久久无广告| 亚洲二区在线视频| 国产精品亚洲第一区在线暖暖韩国 | 欧美日韩日日摸| 国产免费久久精品| 日韩成人免费电影| 91捆绑美女网站| 久久久99精品免费观看| 亚洲va欧美va人人爽| 成人国产精品免费观看| 日韩免费看网站|