把我以前学习过的一个东西拿出来分享下~

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

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

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

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

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

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

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

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

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

  1. #pragma once
  2.  
  3. class CCoordinatePath
  4. {
  5. public:
  6. CCoordinatePath(void);
  7. ~CCoordinatePath(void);
  8.  
  9. public:
  10. // 更新行走路径
  11. void UpdatePath(COORDINATE_3D stopCoordinate3D);
  12. void UpdatePath(vector<COORDINATE_3DPATH> vtPath, COORDINATE_3D stopCoordinate3D, float nCompletePath = );
  13. // 开始行走(移动计算)
  14. void StartMove(DWORD dwStartTime);
  15. // 获取当前空间位置
  16. COORDINATE_3D GetCoordinate(DWORD dwNowTime);
  17. // 获取行走路径
  18. const vector<COORDINATE_3DPATH>* GetPath();
  19. // 获取停止位置
  20. COORDINATE_3D GetStopCoordinate();
  21. // 获取移动总距离(从开始行走到现在的行走总距离)
  22. float GetCompletePath(DWORD dwNowTime);
  23. // 更新玩家速度
  24. void UpdateSpeed(unsigned short wSpeed, DWORD dwNowTime);
  25. // 获取当前速度
  26. unsigned short GetSpeed();
  27. // 玩家是否正在移动
  28. bool IsMoving(DWORD dwNowTime);
  29.  
  30. private:
  31. // 行走路径
  32. vector<COORDINATE_3DPATH> m_vtPath;
  33. // 停止点
  34. COORDINATE_3D m_stopCoordinate3D;
  35.  
  36. // 已完成路径
  37. float m_nCompletePath;
  38. // 玩家当前速度
  39. unsigned short m_wCurSpeed;
  40. // 行走路径开始时间
  41. DWORD m_dwStartMoveTime;
  42.  
  43. };
  44.  
  45. #include "StdAfx.h"
  46. #include "CoordinatePath.h"
  47.  
  48. CCoordinatePath::CCoordinatePath(void)
  49. {
  50. m_wCurSpeed = ;
  51. }
  52.  
  53. CCoordinatePath::~CCoordinatePath(void)
  54. {
  55. }
  56.  
  57. void CCoordinatePath::UpdatePath( COORDINATE_3D stopCoordinate3D )
  58. {
  59. m_vtPath.clear();
  60. m_stopCoordinate3D = stopCoordinate3D;
  61. m_nCompletePath = ;
  62. }
  63.  
  64. void CCoordinatePath::UpdatePath( vector<COORDINATE_3DPATH> vtPath, COORDINATE_3D stopCoordinate3D, float nCompletePath /*= 0*/ )
  65. {
  66. m_vtPath = vtPath;
  67. m_stopCoordinate3D = stopCoordinate3D;
  68. m_nCompletePath = nCompletePath;
  69. }
  70.  
  71. void CCoordinatePath::StartMove( DWORD dwStartTime )
  72. {
  73. m_dwStartMoveTime = dwStartTime;
  74. }
  75.  
  76. COORDINATE_3D CCoordinatePath::GetCoordinate(DWORD dwNowTime)
  77. {
  78. if (m_vtPath.size() == )
  79. {
  80. return m_stopCoordinate3D;
  81. }
  82.  
  83. float nTotalDistance = GetCompletePath(dwNowTime);
  84.  
  85. if (nTotalDistance < )
  86. {
  87. cout << "计算玩家移动距离错误" << endl;
  88. return m_stopCoordinate3D;
  89. }
  90.  
  91. // ceshi
  92. //cout << "距离:" << nTotalDistance << "时间" << (dwNowTime-m_dwStartMoveTime) << endl;
  93.  
  94. COORDINATE_3D coordinate3D;
  95.  
  96. // 上面已经计算出玩家行走总距离,计算玩家位置
  97. vector<COORDINATE_3DPATH>::iterator itPath = m_vtPath.begin();
  98. for (; itPath!=m_vtPath.end(); ++itPath)
  99. {
  100. if (itPath->allDistance > nTotalDistance)
  101. {
  102. // 角色当前位置在当前path中,计算当前位置
  103. float nCurDistance = nTotalDistance - (itPath->allDistance - itPath->curDistance);
  104.  
  105. if (nCurDistance < )
  106. {
  107. cout << "[严重错误]获取坐标" << endl;
  108. return m_stopCoordinate3D;
  109. }
  110.  
  111. coordinate3D.x = itPath->x + itPath->dFormula*itPath->xDistance*nCurDistance;
  112. coordinate3D.y = itPath->y + itPath->dFormula*itPath->yDistance*nCurDistance;
  113. coordinate3D.z = itPath->z + itPath->dFormula*itPath->zDistance*nCurDistance;
  114. coordinate3D.dir = itPath->dir;
  115.  
  116. if (coordinate3D.x == && coordinate3D.y== && coordinate3D.z == )
  117. {
  118. int i = ;
  119. }
  120. ///yang
  121. //cout << "当前移动坐标:x:" << coordinate3D.x << ",y:" << coordinate3D.y << ",z:" << coordinate3D.z << endl;
  122. ///yang
  123. return coordinate3D;
  124. }
  125. }
  126.  
  127. // 到达目标点做先前点路径的清理工作
  128. m_vtPath.clear();
  129.  
  130. return m_stopCoordinate3D;
  131. }
  132.  
  133. const vector<COORDINATE_3DPATH>* CCoordinatePath::GetPath()
  134. {
  135. return &m_vtPath;
  136. }
  137.  
  138. COORDINATE_3D CCoordinatePath::GetStopCoordinate()
  139. {
  140. return m_stopCoordinate3D;
  141. }
  142.  
  143. float CCoordinatePath::GetCompletePath( DWORD dwNowTime )
  144. {
  145. // 无变速的移动距离计算
  146. DWORD dwMoveTime = dwNowTime-m_dwStartMoveTime;
  147.  
  148. return (m_nCompletePath + m_wCurSpeed*dwMoveTime/1000.0f);
  149. }
  150.  
  151. void CCoordinatePath::UpdateSpeed( unsigned short wSpeed, DWORD dwNowTime )
  152. {
  153. // 计算已经完成路径
  154. m_nCompletePath += GetCompletePath(dwNowTime);
  155. m_dwStartMoveTime = dwNowTime;
  156.  
  157. m_wCurSpeed = wSpeed; //当前速度
  158. }
  159.  
  160. unsigned short CCoordinatePath::GetSpeed()
  161. {
  162. return m_wCurSpeed;
  163. }
  164.  
  165. bool CCoordinatePath::IsMoving( DWORD dwNowTime )
  166. {
  167. GetCoordinate(dwNowTime);
  168.  
  169. if (m_vtPath.size() > )
  170. {
  171. return true;
  172. }
  173. else
  174. {
  175. return false;
  176. }
  177. }

3D 服务器端以向量计算为主的角色位置的算法的更多相关文章

  1. Python之find命令中的位置的算法

    find("s",a,b)    #s表示的是一个子序列,a表示的是检索的起始位置,b表示的是检索的终止位置,ab可有可无 test = "abcdefgh" ...

  2. 3D空间中射线与三角形的交叉检测算法【转】

    引言 射线Ray,在3D图形学中有很多重要的应用.比如,pick操作就是使用射线Ray来实现的,还有诸如子弹射线的碰撞检测等等都可以使用射线Ray来完成.所以,在本次博客中,将会简单的像大家介绍下,如 ...

  3. js数组插入指定位置元素,删除指定位置元素,查找指定位置元素算法

    将元素x插入到顺序表L(数组)的第i个数据元素之前 function InsertSeqlist(L, x, i) { // 将元素x插入到顺序表L的第i个数据元素之前 if(L.length == ...

  4. C++ 递归位置排列算法及其应用

    废话不多说,我们先看一下位置排序的算法: #include <iostream> using namespace std; int n = 0; int m = 2; int l = 0; ...

  5. [转] MMO即时战斗:地图角色同步管理和防作弊实现

    一.前言 无论是端游.页游.手游如果是采用了MMO即时战斗游戏模式,基本都会遇到同屏多角色实时移动.释放技能.战斗等场景,于是自然也需要实现如何管理同屏内各种角色的信息同步:例如角色的位置.以及角色身 ...

  6. 【转】MMO即时战斗:地图角色同步管理和防作弊实现

    ---转自CSDN 一.前言 无论是端游.页游.手游如果是采用了MMO即时战斗游戏模式,基本都会遇到同屏多角色实时移动.释放技能.战斗等场景,于是自然也需要实现如何管理同屏内各种角色的信息同步:例如角 ...

  7. 【Unity 3D 游戏开发】Unity3D 入门 - 工作区域介绍 与 入门示例

    一. 工作区域详解 1. Scence视图 (场景设计面板) scence视图简介 : 展示创建的游戏对象, 可以对所有的游戏对象进行 移动, 操作 和 放置; -- 示例 : 创建一个球体, 控制摄 ...

  8. 关于Unity中3D声音的使用

    3D声音 3D立体声和2D声不同的地方是它是会随着距离衰减的,距离越近声音越大,距离越远声音越小. 1: 声音: 背景音乐和音效; 2: 声音文件支持的格式: ogg, mp3, wave, AIFF ...

  9. 【Unity 3D 游戏开发】Unity3D 入门 - 工作区域介绍 与 入门演示样例

    一. 工作区域具体解释 1. Scence视图 (场景设计面板) scence视图简单介绍 : 展示创建的游戏对象, 能够对全部的游戏对象进行 移动, 操作 和 放置; -- 演示样例 : 创建一个球 ...

随机推荐

  1. Python递归遍历目录下所有文件

    #自定义函数: import ospath="D:\\Temp_del\\a"def gci (path): """this is a stateme ...

  2. Eclipse开发PHP环境配置

    首先准备好软件: 1. Apache,到这里找个最新版本 2. PHP,到这里下载 3. Eclipse IDE for Java EE Developers,到这里下载 4. DLTK Core F ...

  3. Linux select TCP并发服务器与客户端编程

    介绍:运行在ubuntu linux系统,需要先打开一个终端运行服务端代码,这时,可以打开多个终端同时运行多个客户端代码(注意客户端数目要小于MAX_FD);在客户端输入数据后回车,可以看见服务器收到 ...

  4. iOS中的字符串扫描类NSScanner

    新建一个Category,命名为UIColor+Hex,表示UIColor支持十六进制Hex颜色设置. UIColor+Hex.h文件, #import <UIKit/UIKit.h> # ...

  5. 前端JS开发框架-DHTMLX--dhtmlXTree

    介绍 dhtmlxTree是一个功能丰富的JavaScript树菜单  它允许您快速添加一个好看的,基于ajax的web页面的分层树. treeview支持在线节点编辑.先进的拖放,三态复选框等等.由 ...

  6. Offer是否具有法律效力?

    版权声明:原创作品,同意转载,转载时请务必以超链接形式标明文章原始出版.作者信息和本声明.否则将追究法律责任.本文地址: http://blog.csdn.net/jobchanceleo/archi ...

  7. 【转】Mac和iOS开发资源汇总—更新于2013-07-19

    小引 本文主要汇集一些苹果开发的资源,会经常更新,建议大家把这篇文章单独收藏(在浏览器中按command+D). 今天(2013年7月19日)收录了许多中文网站和博客.大家一定要去感受一下哦. 如果大 ...

  8. (转)ASP.NET禁用刷新重复提交Backspace键

    在网页制作中,由于Backspace键可以回退到上一个网页,利用了缓存的数据,从而导致一些错误发生.浏览器的后退按钮使得我们能够方便地返回以前访问过的页面,它无疑非常有用.但有时候我们不得不关闭这个功 ...

  9. Visual C++ 打印编程技术-编程基础-获取打印机

    标准方法是用: EnumPrinters() 函数获取 #define PRINTER_ENUM_DEFAULT 0x00000001 #define PRINTER_ENUM_LOCAL 0x000 ...

  10. ios 从微信返回自己的app

    有这样一个需求.从我们自己的app分享内容到微信.点击分享内容返回到我们自己的app.(新浪微博的内容分享到微信就是这样的) 前面一直百度,谷歌都没用.可能我用的方法跟他们不一样吧.而且他们的方法都比 ...