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

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

?? unit2.pas

?? 3d snake 游戲編程源碼
?? PAS
?? 第 1 頁 / 共 3 頁
字號:
               Pre := SnakeTail;
               OriPos := oldTailPos;
               _3DPointB_To_3DPoint(CenterPos, OriPos);
               MakeItToSphereCenter(CenterPos);
               Next := nil;
               BlockState[OriPos[1], OriPos[2], OriPos[3]] := bs_SnakeBody;
            end;
            SnakeTail := SnakeTail^.Next;
            inc(SnakeLength);
         end;
      se_DecApple: begin //在尾部減少一節身體
            BlockState[SnakeTail^.OriPos[1], SnakeTail^.OriPos[2], SnakeTail^.OriPos[3]] := bs_Empty;
            Old := SnakeTail.Pre;
            Dispose(SnakeTail);
            SnakeTail := Old;
            SnakeTail^.Next := nil;
            Dec(SnakeLength);
         end;
      se_Exit: begin
            _GameCtrl^.LevelPassed;
            Exit;
         end;
   end;

   ShowSnakePosLengthInLabel;
   DrawScene; //重新繪制場景
end;

procedure TDrawEngine.CreateApple;
var i: Byte; tmps: string;
begin
   with NowApple do begin
      OriPos := ReturnAnEmptyBlock();
      _3DPointB_To_3DPoint(CenterPos, OriPos);
      MakeItToSphereCenter(CenterPos);

      i := pos(')', MapProperty.AppleList);
      tmps := Copy(MapProperty.AppleList, 2, i - 2);
      Delete(MapProperty.AppleList, 1, i);

      i := pos(',', tmps);
      if StrToInt(Copy(tmps, 1, i - 1)) = 1 then
         _Type := obj_IncApple
      else
         _Type := obj_DecApple;

      Delete(tmps, 1, i);
      _Interval := StrToInt(tmps);

      BlockState[OriPos[1], OriPos[2], OriPos[3]] := AppleToBlockState[_Type];
      if _Interval <> 0 then begin //此蘋果可以移動
         Moveable := True;
         AppleMoveTimer.Enabled := True;
         MoveTickCount := 0;
         SetAppleTimeLableVisible(True);
      end else
         SetAppleTimeLableVisible(False);

      ShowApplePos;
   end;
end;

procedure TDrawEngine.PickApple;
begin
   inc(EatAppleCount);
   if MapProperty.AppleList = '' then begin
      AppleMoveTimer.Enabled := False;
      SetAppleTimeLableVisible(False);
      CreateExit;
   end else begin
      AppleMoveTimer.Enabled := False;
      CreateApple;
   end;
end;

procedure TDrawEngine.DrawApple;
begin
   with NowApple do begin
      SetGLColor(_Type);
      gluDeleteQuadric(qObj);
      qObj := gluNewQuadric;
      gluQuadricDrawStyle(qObj, GLU_FILL);
      gluQuadricNormals(qObj, GLU_SMOOTH);
      glPushMatrix;
      glTranslate(CenterPos[1], CenterPos[2], CenterPos[3]); //在這一點畫球
      gluSphere(qObj, 0.5, 10, 10);
      glPopMatrix;
   end;
end;

procedure TDrawEngine.AppleMoveTimerTick(Sender: TObject);
begin
   inc(NowApple.MoveTickCount);
   if NowApple.MoveTickCount = NowApple._Interval + 1 then
      with NowApple do begin
         MoveTickCount := 0;
         BlockState[OriPos[1], OriPos[2], OriPos[3]] := bs_Empty;
         OriPos := ReturnAnEmptyBlock();
         _3DPointB_To_3DPoint(CenterPos, OriPos);
         MakeItToSphereCenter(CenterPos);
         BlockState[OriPos[1], OriPos[2], OriPos[3]] := AppleToBlockState[_Type];
         ShowApplePos;
      end;
   MainForm.lblShowTime.Caption := IntToStr(NowApple._Interval - NowApple.MoveTickCount) + '秒';
   DrawScene;
end;

procedure TDrawEngine.CreateExit;
begin
   ExitShow := True;
   ExitPos := ReturnAnEmptyBlock();
   BlockState[ExitPos[1], ExitPos[2], ExitPos[3]] := bs_Exit;
end;

procedure TDrawEngine.DrawExit;
begin
   SetGLColor(obj_Exit);
   DrawCube(ExitPos, ExitPos, gl_Line_Loop);
end;

procedure TDrawEngine.DrawScene; //游戲中實時刷新場景
var i: Byte; tmp: PTSnakeBody;
begin
   if GameOption.LightOn = True then
      glEnable(GL_LIGHTING)
   else
      glDisable(GL_LIGHTING);

   glEnable(GL_DEPTH_TEST); //打開深度探測
   glDepthFunc(GL_LEQUAL);
   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //清空
   glLoadIdentity;
   glClearColor(0, 0, 0, 1); //背景為黑色

   //繪制障礙物
   if BlockCount <> 0 then //?? 偶覺得不用這句也可以,不知為什么為出錯
      for i := 0 to BlockCount - 1 do
         with Blocks[i] do begin
            if _Type = bt_Block then
               SetGLColor(obj_Block)
            else
               glColor3ub(0, 0, 0);
            DrawCube(Blocks[i].LeftBackBottom, Blocks[i].RightFrontTop);
         end;

   if ExitShow then begin
      DrawExit; //繪制出口
      if GameOption.ShowAidLine then
         DrawAidLine(ExitPos);
   end else begin
      DrawApple; //繪制蘋果
      if GameOption.ShowAidLine then
         DrawAidLine(NowApple.OriPos); //繪制蘋果輔助線
   end;

   //繪制蛇身
   SetGLColor(obj_SnakeHead); //先繪制蛇頭
   DrawSphere(SnakeHead);
   SetGLColor(obj_SnakeBody);
   tmp := SnakeHead^.Next;
   while tmp <> nil do begin
      DrawSphere(tmp);
      tmp := tmp^.Next;
   end;

   //繪制網格線,輔助觀察
   if GameOption.ShowGrid then
      DrawGridLine;

   //繪制圍墻,實現半透明效果
   DrawWall;

   //將繪制的圖形投射到窗體上
   SwapBuffers(DrawDC);
end;

procedure TDrawEngine.NextViewAngelV;
begin
   case ViewAngleV of
      eh_High: begin
            ViewAngleV := eh_Middle;
            ViewAngleVMoveUp := False;
         end;
      eh_Low: begin
            ViewAngleV := eh_Middle;
            ViewAngleVMoveUp := True;
         end;
      eh_Middle: begin
            if ViewAngleVMoveUp then
               ViewAngleV := eh_High
            else
               ViewAngleV := eh_Low
         end;
   end;
   SetEye;
   DrawScene;
   ShowKeyDirectors;
end;

procedure TDrawEngine.NextViewAngelH;
begin
   if ViewAngleH = ep_Left then
      ViewAngleH := ep_Front
   else
      ViewAngleH := Succ(ViewAngleH); //求后繼
   SetEye;
   DrawScene;
   ShowKeyDirectors;
end;

procedure TDrawEngine.ChangeFarNear;
begin
   case ViewDistance of
      3: begin
            ViewDistanceMoveUp := False;
            ViewDistance := 2;
         end;
      1: begin
            ViewDistanceMoveUp := True;
            ViewDistance := 2;
         end;
      2: begin
            if ViewDistanceMoveUp = True then
               ViewDistance := 3
            else
               ViewDistance := 1;
         end;
   end;
   SetEye;
   DrawScene;
end;

procedure TDrawEngine.OutputGameProperties;
begin
   with MainForm.MemoMap.Lines do
      with MapProperty do begin
         Clear;
         Add(str_DrawEngine + IntToStr(UseEngineVersion));
         Add(str_MapName + MapName);
         Add(str_MapAppleCount + IntToStr(AppleCount));
         Add(str_SnakeSpeed + IntToStr(SnakeSpeed) + '格/秒');
         Add('');
         Add(MapDescription);
      end;
end;

procedure TDrawEngine.ShowSnakePosLengthInLabel;
begin
   with SnakeHead^ do begin
      MainForm.lblSnakeHead.Caption := str_SnakeHeadPos + IntToStr(OriPos[1]) + ',' + IntToStr(OriPos[2]) + ',' + IntToStr(OriPos[3]);
      MainForm.lblSnakeLength.Caption := str_SnakeLength + IntToStr(SnakeLength);
   end;
end;

procedure TDrawEngine.ShowApplePos;
begin
   with NowApple do begin
      MainForm.lblApplePos.Caption := str_ApplePos + IntToStr(OriPos[1]) + ',' + IntToStr(OriPos[2]) + ',' + IntToStr(OriPos[3]);
      MainForm.lblAppleCount.Caption := Format(str_AppleRemains, [MapProperty.AppleCount - EatAppleCount]);
   end;
end;

procedure TDrawEngine.ShowKeyDirectors;
begin
   with MainForm do begin
      lblUp.Caption := KeyDirectorStr[ViewDirection[ViewAngleH, SnakeDirection, td_Up]];
      lblDown.Caption := KeyDirectorStr[ViewDirection[ViewAngleH, SnakeDirection, td_Down]];
      lblLeft.Caption := KeyDirectorStr[ViewDirection[ViewAngleH, SnakeDirection, td_Left]];
      lblRight.Caption := KeyDirectorStr[ViewDirection[ViewAngleH, SnakeDirection, td_Right]];
   end;
end;

procedure TDrawEngine.SetAppleTimeLableVisible(b: Boolean);
begin
   MainForm.Label2.Visible := b;
   MainForm.Label3.Visible := b;
   MainForm.lblShowTime.Visible := b;
end;

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

constructor TGameCtrl.Create;
begin
   MoveTimer := TTimer.Create(nil);
   MoveTimer.Enabled := False;
   MoveTimer.OnTimer := MoveTimerTick;

   AMapLoaded := False;
end;

destructor TGameCtrl.Destroy;
begin
   MoveTimer.Free;
end;

procedure TGameCtrl.NewGame(FileName: string);
begin
   if FileExists(FileName) = False then begin
      MessageDlg(msg_FileMissing + ': ' + FileName, mtError, [mbOK], 0);
      Exit;
   end;
   with _Engine^ do begin
      SetAppleTimeLableVisible(False);
      MapFileName := FileName;
      MapScript.Clear;
      MapScript.LoadFromFile(FileName);
      ReadScript;
      DrawScene;
      MoveTimer.Interval := 1000 div MapProperty.SnakeSpeed;
   end;
   AMapLoaded := True;
   GameEnd := False;
   GameStarted := False;
   GamePaused := False;
end;

procedure TGameCtrl.Game_Start(Turn: TurnDirection);
begin
   _Engine^.SnakeTurn(Turn);
   MoveTimer.Enabled := True;
   GameStarted := True;
end;

procedure TGameCtrl.Game_Pause;
begin
   GamePaused := True;
   MoveTimer.Enabled := False;
   _Engine^.AppleMoveTimer.Enabled := False;
end;

procedure TGameCtrl.Game_Restart; //實際就是重新裝載一下地圖
begin
   NewGame(_Engine^.MapFileName);
end;

procedure TGameCtrl.Game_Resume;
begin
   GamePaused := False;
   MoveTimer.Enabled := True;
   if _Engine^.NowApple._Interval <> 0 then
      _Engine^.AppleMoveTimer.Enabled := True;
end;

function TGameCtrl.AskIfGameEnd: Boolean;
begin
   if (AMapLoaded = False) or (GameEnd = True) then begin
      Result := True;
      Exit;
   end;
   Game_Pause;
   Result := False;
   if MessageDlg(msg_WantEndNowGame, mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
      Result := True;
      Exit;
   end;
end;

procedure TGameCtrl.Game_End;
begin
   MoveTimer.Enabled := False;
   _Engine^.AppleMoveTimer.Enabled := False;

   GameEnd := True;
   //_Engine^.GameEndFreeMem;
end;

procedure TGameCtrl.MoveTimerTick(Sender: TObject);
begin
   _Engine^.SnakeMove;
end;

function TGameCtrl.AskNextStep(msg: string): Boolean;
begin
   if MessageDlg(msg, mtConfirmation, [mbYes, mbNo], 0) = mrYes then
      Result := True
   else
      Result := False;
end;

procedure TGameCtrl.SnakeCollision(t: SnakeCollisionType);
begin
   Game_End;
   if AskNextStep(msg_SnakeCollision[t] + msg_GameEnd + Chr10Chr13 + msg_GameEngToDo + msg_IfPlayAgain) = True then
      Game_Restart;
end;

procedure TGameCtrl.StartNextLevel;
begin
   if NowLevelIdx = MapCtrl.MapCount then begin
      if AskNextStep(msg_NoLevelToBeNext) = True then
         Game_Restart;
   end else begin
      inc(NowLevelIdx);
      NewGame(MapCtrl.MapFileName(NowLevelIdx));
      MainForm.MenuOpenGame.Items[NowLevelIdx - 1].Checked := True;
   end;
end;

procedure TGameCtrl.LevelPassed;
begin
   Game_End;
   if AskNextStep(msg_LevelPassed + Chr10Chr13 + msg_IfStartNextGame) = True then
      StartNextLevel;
end;

procedure TGameCtrl.CloseMap;
begin
   Game_End;
   _Engine^.CloseMap;
   AMapLoaded := False;
end;


end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99国产欧美另类久久久精品| 黄一区二区三区| 精品处破学生在线二十三| 欧美日韩情趣电影| 欧美日韩国产在线播放网站| 97se亚洲国产综合自在线| va亚洲va日韩不卡在线观看| 高清国产一区二区| 97aⅴ精品视频一二三区| av在线不卡网| 91极品美女在线| 欧美日韩大陆在线| 欧美顶级少妇做爰| 欧美精品一区二区三区在线| 久久久久久久久久电影| 中文字幕国产一区二区| 亚洲女人****多毛耸耸8| 亚洲男帅同性gay1069| 亚洲丝袜自拍清纯另类| 亚洲一区影音先锋| 六月丁香婷婷色狠狠久久| 国内久久精品视频| 99热99精品| 91精品国产综合久久国产大片| 欧美一级精品在线| 国产欧美一区二区精品久导航 | 日本道在线观看一区二区| 欧美日韩高清一区二区不卡| 日韩欧美一区在线| 国产亚洲欧洲一区高清在线观看| 中文字幕亚洲欧美在线不卡| 亚洲国产视频a| 国产麻豆成人精品| 在线观看国产日韩| 久久久精品中文字幕麻豆发布| 中文字幕在线一区二区三区| 日韩成人免费电影| 99视频在线观看一区三区| 欧美精品v日韩精品v韩国精品v| 精品国产精品网麻豆系列| 亚洲人成7777| 国产另类ts人妖一区二区| 在线视频国产一区| 欧美精品一区二区久久久| 亚洲在线视频一区| 成人免费高清在线| 日韩欧美你懂的| 亚洲一区二区视频| 成人免费观看av| 26uuu久久综合| 国产香蕉久久精品综合网| 日本一区二区三区视频视频| 日韩视频在线永久播放| ...xxx性欧美| 国产盗摄一区二区三区| 日韩欧美国产精品一区| 一区二区成人在线| 91在线精品秘密一区二区| 精品日韩av一区二区| 亚洲成人自拍网| 91精品福利在线| 亚洲欧美经典视频| 99久久婷婷国产| √…a在线天堂一区| 高清国产一区二区| 国产欧美一区二区在线| 国产激情偷乱视频一区二区三区| 欧美一区二区免费视频| 免费在线观看精品| 欧美精品一二三四| 日日夜夜免费精品| 欧美日本在线看| 亚洲国产精品视频| 7777精品久久久大香线蕉| 艳妇臀荡乳欲伦亚洲一区| 日本高清免费不卡视频| 亚洲免费在线看| 在线观看不卡一区| 日本中文字幕不卡| 日韩欧美www| 国产乱淫av一区二区三区 | 精品无人码麻豆乱码1区2区| 欧美久久久久免费| 日本va欧美va欧美va精品| 日韩欧美综合一区| 国产一区二区三区四区五区入口 | 成人免费va视频| 国产精品私房写真福利视频| 成人黄色电影在线| 亚洲午夜一区二区三区| 91精品国产麻豆| 国产美女精品人人做人人爽| 国产亚洲精品超碰| 91一区二区在线| 天堂在线亚洲视频| 国产亚洲成av人在线观看导航 | 亚洲综合久久久| 欧美老女人第四色| 国产一区二区三区不卡在线观看| 国产精品天天摸av网| 91亚洲国产成人精品一区二三| 亚洲国产综合人成综合网站| 欧美成人激情免费网| 99国产精品一区| 久久精品久久99精品久久| 久久亚洲精品小早川怜子| 成人av先锋影音| 青草av.久久免费一区| 国产精品大尺度| 日韩视频一区二区| 91美女片黄在线观看| 日韩不卡在线观看日韩不卡视频| 日本一区二区三区四区| 91精品国产高清一区二区三区 | 亚洲国产一区二区视频| 日韩三级伦理片妻子的秘密按摩| 成人午夜在线免费| 奇米精品一区二区三区在线观看一| 26uuuu精品一区二区| 欧美情侣在线播放| 97se亚洲国产综合在线| 国产一区二区三区在线看麻豆| 一区二区三区美女| 亚洲欧洲日产国码二区| 日韩你懂的在线观看| 欧美性大战久久久| 色综合天天综合色综合av | 亚洲va韩国va欧美va精品 | 91黄色小视频| 丁香六月久久综合狠狠色| 日本欧洲一区二区| 亚洲综合区在线| 国产精品精品国产色婷婷| www久久久久| 欧美成人女星排行榜| 欧美亚洲一区二区在线观看| 成人免费视频视频在线观看免费 | 日本成人在线电影网| 亚洲最色的网站| 中文字幕在线不卡视频| 欧美国产乱子伦 | 91老师国产黑色丝袜在线| 国产成人综合在线| 国产精品亚洲视频| 国产在线视频一区二区三区| 蜜桃视频一区二区三区在线观看| 亚洲线精品一区二区三区| 一区二区三区欧美| 亚洲综合精品久久| 亚洲综合色区另类av| 亚洲国产日日夜夜| 洋洋av久久久久久久一区| 亚洲一区二区三区四区五区黄| 中文字幕佐山爱一区二区免费| 国产精品久久久久久一区二区三区 | 国产一区二区三区久久久| 亚洲乱码国产乱码精品精的特点 | 久久国产欧美日韩精品| 蜜桃av噜噜一区二区三区小说| 日本va欧美va精品发布| 日韩精品91亚洲二区在线观看| 日韩中文字幕区一区有砖一区| 天堂久久一区二区三区| 久久精品国产网站| 国产精品原创巨作av| 成人高清视频免费观看| 在线日韩一区二区| 欧美性猛交一区二区三区精品| 884aa四虎影成人精品一区| 精品日韩欧美在线| 国产精品国产三级国产普通话99 | 日韩欧美一二三四区| 久久久久久久网| 国产精品卡一卡二卡三| 亚洲图片欧美视频| 另类小说欧美激情| 99精品视频免费在线观看| 欧美唯美清纯偷拍| 欧美www视频| 亚洲乱码一区二区三区在线观看| 日日摸夜夜添夜夜添精品视频| 韩国一区二区在线观看| 91在线观看视频| 91精品午夜视频| 中文久久乱码一区二区| 婷婷国产在线综合| 粉嫩av一区二区三区在线播放| 色哟哟精品一区| 精品国产乱码91久久久久久网站| 亚洲欧美一区二区三区国产精品| 日韩黄色小视频| 不卡电影免费在线播放一区| 欧美精品粉嫩高潮一区二区| 欧美激情一区二区在线| 日韩中文字幕亚洲一区二区va在线 | 欧美日韩国产123区| 久久这里只有精品6| 亚洲超碰97人人做人人爱| 国产一区二区三区在线看麻豆 | 蜜臀av一区二区三区|