Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5096606
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类: C/C++

2015-09-25 10:56:51

3D服务器端玩家行走处理是服务器端根据客户端行走路径、玩家行走时间以及速度(包括变化速度)计算得出玩家的当前位置。

由于客户端行走是一条路径,不使用2D中的格子计算算法,未能高效的获取角色的当前位置,运用玩家行走路径,行走速度,行走时间这些已量,进行计算玩家的当前精确位置。由于3D游戏中的点为xyz的空间点,所以牵连的计算为3维向量计算。




空间两点距离计算公式为:



玩家在某条线段上的坐标x:



玩家在某条线段上的坐标y:



玩家在某条线段上的坐标z:



角色当前位置计算原理分析:

角色行走是一条路径,这条路径使用点序列表示,角色开始行走记录当前时间TimeStart,获取觉得当前位置的计算,首先获取当前时间TimeNow,根据TimeNow-TimeStart的时间差与角色的行走速度,获取角色已经行走过的距离distance,计算每两点的距离,判定角色当前时间所处在哪一条路径上,及角色在哪两点之间。然后使用向量计算公式计算当前角色处于的坐标点位置。


角色位置位置计算的类封装实现代码:


  1. #pragma once

  2. class CCoordinatePath
  3. {
  4. public:
  5.     CCoordinatePath(void);
  6.     ~CCoordinatePath(void);

  7. public:
  8.     // 更新行走路径
  9.     void UpdatePath(COORDINATE_3D stopCoordinate3D);
  10.     void UpdatePath(vector<COORDINATE_3DPATH> vtPath, COORDINATE_3D stopCoordinate3D, float nCompletePath = 0);
  11.     // 开始行走(移动计算)
  12.     void StartMove(DWORD dwStartTime);
  13.     // 获取当前空间位置
  14.     COORDINATE_3D GetCoordinate(DWORD dwNowTime);
  15.     // 获取行走路径
  16.     const vector<COORDINATE_3DPATH>* GetPath();
  17.     // 获取停止位置
  18.     COORDINATE_3D GetStopCoordinate();
  19.     // 获取移动总距离(从开始行走到现在的行走总距离)
  20.     float GetCompletePath(DWORD dwNowTime);
  21.     // 更新玩家速度
  22.     void UpdateSpeed(unsigned short wSpeed, DWORD dwNowTime);
  23.     // 获取当前速度
  24.     unsigned short GetSpeed();
  25.     // 玩家是否正在移动
  26.     bool IsMoving(DWORD dwNowTime);

  27. private:
  28.     // 行走路径
  29.     vector<COORDINATE_3DPATH> m_vtPath;
  30.     // 停止点
  31.     COORDINATE_3D m_stopCoordinate3D;

  32.     // 已完成路径
  33.     float m_nCompletePath;
  34.     // 玩家当前速度
  35.     unsigned short m_wCurSpeed;
  36.     // 行走路径开始时间
  37.     DWORD m_dwStartMoveTime;
  38.     
  39. };

  1. #include "StdAfx.h"
  2. #include "CoordinatePath.h"

  3. CCoordinatePath::CCoordinatePath(void)
  4. {
  5.     m_wCurSpeed = 4;
  6. }

  7. CCoordinatePath::~CCoordinatePath(void)
  8. {
  9. }

  10. void CCoordinatePath::UpdatePath( COORDINATE_3D stopCoordinate3D )
  11. {
  12.     m_vtPath.clear();
  13.     m_stopCoordinate3D = stopCoordinate3D;
  14.     m_nCompletePath = 0;
  15. }

  16. void CCoordinatePath::UpdatePath( vector<COORDINATE_3DPATH> vtPath, COORDINATE_3D stopCoordinate3D, float nCompletePath /*= 0*/ )
  17. {
  18.     m_vtPath = vtPath;
  19.     m_stopCoordinate3D = stopCoordinate3D;
  20.     m_nCompletePath = nCompletePath;
  21. }

  22. void CCoordinatePath::StartMove( DWORD dwStartTime )
  23. {
  24.     m_dwStartMoveTime = dwStartTime;
  25. }

  26. COORDINATE_3D CCoordinatePath::GetCoordinate(DWORD dwNowTime)
  27. {
  28.     if (m_vtPath.size() == 0)
  29.     {
  30.         return m_stopCoordinate3D;
  31.     }

  32.     float nTotalDistance = GetCompletePath(dwNowTime);

  33.     if (nTotalDistance < 0)
  34.     {
  35.         cout << "计算玩家移动距离错误" << endl;
  36.         return m_stopCoordinate3D;
  37.     }

  38.     // ceshi
  39.     //cout << "距离:" << nTotalDistance << "时间" << (dwNowTime-m_dwStartMoveTime) << endl;

  40.     COORDINATE_3D coordinate3D;

  41.     // 上面已经计算出玩家行走总距离,计算玩家位置
  42.     vector<COORDINATE_3DPATH>::iterator itPath = m_vtPath.begin();
  43.     for (; itPath!=m_vtPath.end(); ++itPath)
  44.     {
  45.         if (itPath->allDistance > nTotalDistance)
  46.         {
  47.             // 角色当前位置在当前path中,计算当前位置
  48.             float nCurDistance = nTotalDistance - (itPath->allDistance - itPath->curDistance);

  49.             if (nCurDistance < 0)
  50.             {
  51.                 cout << "[严重错误]获取坐标" << endl;
  52.                 return m_stopCoordinate3D;
  53.             }

  54.             coordinate3D.x = itPath->x + itPath->dFormula*itPath->xDistance*nCurDistance;
  55.             coordinate3D.y = itPath->y + itPath->dFormula*itPath->yDistance*nCurDistance;
  56.             coordinate3D.z = itPath->z + itPath->dFormula*itPath->zDistance*nCurDistance;
  57.             coordinate3D.dir = itPath->dir;

  58.             if (coordinate3D.x ==1 && coordinate3D.y==1 && coordinate3D.z == 1)
  59.             {
  60.                 int i = 0;
  61.             }
  62.             ///yang
  63.             //cout << "当前移动坐标:x:" << coordinate3D.x << ",y:" << coordinate3D.y << ",z:" << coordinate3D.z << endl;
  64.             ///yang
  65.             return coordinate3D;
  66.         }
  67.     }

  68.     // 到达目标点做先前点路径的清理工作
  69.     m_vtPath.clear();

  70.     return m_stopCoordinate3D;
  71. }

  72. const vector<COORDINATE_3DPATH>* CCoordinatePath::GetPath()
  73. {
  74.     return &m_vtPath;
  75. }

  76. COORDINATE_3D CCoordinatePath::GetStopCoordinate()
  77. {
  78.     return m_stopCoordinate3D;
  79. }

  80. float CCoordinatePath::GetCompletePath( DWORD dwNowTime )
  81. {
  82.     // 无变速的移动距离计算
  83.     DWORD dwMoveTime = dwNowTime-m_dwStartMoveTime;

  84.     return (m_nCompletePath + m_wCurSpeed*dwMoveTime/1000.0f);
  85. }

  86. void CCoordinatePath::UpdateSpeed( unsigned short wSpeed, DWORD dwNowTime )
  87. {
  88.     // 计算已经完成路径
  89.     m_nCompletePath += GetCompletePath(dwNowTime);
  90.     m_dwStartMoveTime = dwNowTime;

  91.     m_wCurSpeed = wSpeed;    //当前速度
  92. }

  93. unsigned short CCoordinatePath::GetSpeed()
  94. {
  95.     return m_wCurSpeed;
  96. }

  97. bool CCoordinatePath::IsMoving( DWORD dwNowTime )
  98. {
  99.     GetCoordinate(dwNowTime);

  100.     if (m_vtPath.size() > 0)
  101.     {
  102.         return true;
  103.     }
  104.     else
  105.     {
  106.         return false;
  107.     }
  108. }


原文链接


阅读(2008) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

2015nowlaw2015-11-02 16:15:41

<p>很多公司仍在努力探索怎樣才能最明智地利用雲端,特別是將哪一些基礎結構元素遷移到公司外部,哪一些留在內部。&nbsp;事實上,根據最近的&nbsp;<span style=\"font-family:Times New Roman;\">SolarWinds&nbsp;</span><span style=\"font-family:宋体;\">調查顯示,目前有五分之三的公司選擇將不超過&nbsp;</span><span style=\"font-family:Times New Roman;\">255&nbsp;</span><span style=\"font-family:宋体;\">的基礎結構遷移到雲端,十分之一公司尚未執行任何遷移,雖然一旦他們明白要遷移哪些基礎結構以及如何遷移後,就會開始大展拳腳。</span></p><p>&nbsp;對於這一點,談到雲端遷移時,其中一個最具爭議性的基礎結構元素就是數據庫,根據另一份調查顯示,有