郁金香外挂技术-郁金香灬老师

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

郁金香终身VIP管理员QQ150330575项目合作(有实力的+)视频教程+每月更新+QQ群
飞郁视频分享(每周更新)
查看: 2484|回复: 0

039-魔兽怀旧 寻路 算法 c++ 代码

[复制链接]
发表于 2020-4-25 13:21:34 | 显示全部楼层 |阅读模式


  1. 郁金香灬老师
  2. QQ 150330575
  3. 准备工具
  4. 64位的CE
  5. X64DBG调试器

  6. WowClassic

  7. queue:
  8. C++队列Queue类成员函数如下:
  9. back()返回最后一个元素
  10. empty()如果队列空则返回真
  11. front()返回第一个元素
  12. pop()删除第一个元素
  13. push()在末尾加入一个元素
  14. size()返回队列中元素的个数

  15. //判断队列是否为空 寻路结束
  16. //当前坐标点 与队列第一个坐标点 距离  
  17. //如果与第一个坐标点距离<10 那删除第一个坐标点 继续移到下一个坐标点


  18. 用AfxBeginThread()函数来创建一个新线程来执行任务,工作者线程的AfxBeginThread的原型如下:
  19. CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,
  20.   LPVOID lParam,
  21.   int nPriority = THREAD_PRIORITY_NORMAL,
  22.   UINT nStackSize = 0,
  23.   DWORD dwCreateFlags = 0,
  24.   LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
  25.   );//用于创建工作者线程
  26. 返回值: 成功时返回一个指向新线程的线程对象的指针,否则NULL。
  27. pfnThreadProc : 线程的入口函数,声明一定要如下: UINT MyThreadFunction(LPVOID pParam),不能设置为NULL;
  28. pParam : 传递入线程的参数,注意它的类型为:LPVOID,所以我们可以传递一个结构体入线程.
  29. nPriority : 线程的优先级,一般设置为 0 .让它和主线程具有共同的优先级.
  30. nStackSize : 指定新创建的线程的栈的大小.如果为 0,新创建的线程具有和主线程一样的大小的栈
  31. dwCreateFlags : 指定创建线程以后,线程有怎么样的标志.可以指定两个值:
  32. CREATE_SUSPENDED : 线程创建以后,会处于挂起状态,直到调用:ResumeThread
  33. 0 : 创建线程后就开始运行.
  34. lpSecurityAttrs : 指向一个 SECURITY_ATTRIBUTES 的结构体,用它来标志新创建线程的安全性.如果为 NULL,
  35. 那么新创建的线程就具有和主线程一样的安全性.
  36. 如果要在线程内结束线程,可以在线程内调用 AfxEndThread.

  37. //TFindWay.h
  38. #pragma once
  39. #include<stdio.h>
  40. #include<queue>
  41. typedef  struct TPOINT2POS
  42. {
  43. float x;
  44. float y;

  45. }TPOINT2POS;

  46. typedef  struct TPOINT3POS
  47. {
  48. float x;
  49. float y;
  50. float z;
  51. }TPOINT3POS;

  52. class TFindWay
  53. {
  54. public:
  55.         TFindWay(void);
  56.         ~TFindWay(void);

  57.         static float 获取距离(); //计算当前角色与第一个坐标点距离
  58.         static UINT32 m寻路状态;//0表示寻路结束,1表示寻路中,2
  59.         static std::queue<TPOINT2POS> m_posqueue;
  60.         static void TFindWay::正向初始化坐标(TPOINT2POS* arrayPos,SIZE_T n);
  61.         static void TFindWay::反向初始化坐标(TPOINT2POS* arrayPos,SIZE_T n);
  62.     static        UINT AFX_CDECL TFindWay::寻路线程回调(LPVOID arg1);
  63.         static  CWinThread *mpStartThread;
  64.         static int TFindWay::多点反向寻路(TPOINT2POS* arrayPos,SIZE_T n);
  65.         static int 多点正向寻路(TPOINT2POS* arrayPos,SIZE_T n);
  66.         static int TFindWay::遍历坐标();
  67.         static int 退出清理();
  68. };




  69. #include "StdAfx.h"
  70. #include "TFindWay.h"

  71. std::queue<TPOINT2POS> TFindWay::m_posqueue;
  72. CWinThread * TFindWay::mpStartThread=NULL;

  73. TFindWay::TFindWay(void)
  74. {
  75. }


  76. TFindWay::~TFindWay(void)
  77. {
  78. }

  79. //计算当前角色与第一个坐标点距离
  80. float TFindWay::获取距离()
  81. {
  82.         float        x=GameBase::GetRolePos()[0];//
  83.         float        y=GameBase::GetRolePos()[1];//
  84.         float   x2=m_posqueue.front().x;
  85.         float   y2=m_posqueue.front().y;
  86.         //勾股定理
  87.         float a=fabs(x2-x);
  88.         float b=fabs(y2-y);
  89.         //求C边 即距离
  90.         float c=sqrt(a*a+b*b);//C边=开平方(a平方+b平方)
  91.         return c;
  92. }
  93. void TFindWay::反向初始化坐标(TPOINT2POS* arrayPos,SIZE_T n)
  94. {
  95.         //清空队列
  96.         {
  97.         std::queue<TPOINT2POS>clearQueue;
  98.         m_posqueue.swap(clearQueue);
  99.         }
  100.         //重建队列
  101.         for (int i=n-1;i>=0;i--)
  102.         {
  103.                 m_posqueue.push(arrayPos[i]);
  104.         }
  105. };
  106. void TFindWay::正向初始化坐标(TPOINT2POS* arrayPos,SIZE_T n)
  107. {
  108.          
  109.         //清空队列
  110.         {
  111.         std::queue<TPOINT2POS>clearQueue;
  112.         m_posqueue.swap(clearQueue);
  113.         }
  114.         //重建队列
  115.         for (SIZE_T i=0;i<n;i++)
  116.         {  //按0,1,2,3 次序排队压栈
  117.                 m_posqueue.push(arrayPos[i]);
  118.         }

  119. };

  120. int TFindWay::退出清理()
  121. {
  122.         if (mpStartThread)
  123.         {
  124.                  mpStartThread->ExitInstance();
  125.         }

  126.         return 1;
  127. };
  128. int TFindWay::多点正向寻路(TPOINT2POS* arrayPos,SIZE_T n)
  129. {
  130.         正向初始化坐标(arrayPos,n);
  131.         //return 0;
  132.         if (mpStartThread==NULL)
  133.         {
  134.                 mpStartThread=::AfxBeginThread(寻路线程回调,NULL);
  135.         }else
  136.         {
  137.           // mpStartThread->ResumeThread();
  138.         }
  139.         return 1;
  140. };

  141. int TFindWay::多点反向寻路(TPOINT2POS* arrayPos,SIZE_T n)
  142. {
  143.         反向初始化坐标(arrayPos,n);
  144.         //return 0;
  145.         if (mpStartThread==NULL)
  146.         {
  147.                 mpStartThread=::AfxBeginThread(寻路线程回调,NULL);
  148.         }else
  149.         {
  150.           // mpStartThread->ResumeThread();
  151.         }
  152.         return 1;
  153. };

  154. int TFindWay::遍历坐标()
  155. {
  156.         char buf[1024];
  157.         while(!m_posqueue.empty())
  158.         {
  159.                 float x=m_posqueue.front().x;
  160.                 float y=m_posqueue.front().y;
  161.                 sprintf_s(buf,"yjx:到达节点(%f,%f),删除此节点 继续移动到下一个结点",x,y);
  162.                 OutputDebugStringA(buf);
  163.                 m_posqueue.pop();
  164.         }
  165.         return 1;
  166. }

  167. //typedef UINT (AFX_CDECL *AFX_THREADPROC)(LPVOID);
  168. UINT AFX_CDECL TFindWay::寻路线程回调(LPVOID arg1)
  169. {
  170.         //还有多少个坐标点 待寻路
  171.         SIZE_T n=m_posqueue.size();
  172.          char buf[1024]={0};
  173.         while(TRUE)
  174.         {

  175.          if (m_posqueue.empty())
  176.          {
  177.                 //如果队列为空 则继续等待
  178.                  OutputDebugStringA("yjx:所有寻路已经完成...等待主人下一次寻路...");
  179.                  //可以考虑寻路完成后 break 跳出循环
  180.                  Sleep(1000);
  181.                  continue;
  182.          }

  183.          //只要队列不为空 就一直寻路
  184.          //移动到
  185.          float x=m_posqueue.front().x;
  186.          float y=m_posqueue.front().y;
  187.          GameBase::MoveRole(x,y);
  188.          //等待0.2秒
  189.          Sleep(200);
  190.          //等待角色 移动到 坐标位置
  191.          //计算角色与坐标点距离
  192.          float 距离=获取距离();
  193.          if (距离<2)
  194.          {
  195.                  //如果 距离小于10 视为到达目标点 继续移动到下一个点
  196.                  //到达了一个点 则删除一个点
  197.                
  198.                
  199.                  sprintf_s(buf,"yjx:到达节点(%f,%f),删除此节点 继续移动到下一个结点",x,y);
  200.                  OutputDebugStringA(buf);
  201.                  m_posqueue.pop();//删除此节点
  202.                  continue;
  203.          }else
  204.          {
  205.                  sprintf_s(buf,"yjx: 与坐标(%f,%f),相距=%f,继续移动到此节点",x,y,距离);
  206.                  OutputDebugStringA(buf);
  207.           Sleep(1000);//如果距离大于10则等0.2秒时间  继续调用寻路
  208.           continue;
  209.          }

  210.         }

  211. };


复制代码


郁金香外挂教程,学习中...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

限时限量优惠

QQ|小黑屋|手机版|郁金香外挂技术-郁金香灬老师 ( 苏ICP备10059359号 )

GMT+8, 2020-9-25 07:19 , Processed in 0.039559 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表