LyDrawingClass 库是一个运用D3Dx9绘图引擎封装实现的外部透视图形绘制模块,其功能参考了多个易语言版ImGUI绘制模块,并将其以C语言进行了重写,在重写过程中也封装了一些自己实现的较为通用的绘图方式,运用此库将使C/C++开发透视功能效率更高无需自己封装一遍,此处只做应用笔记源码暂不发布。

绘制矩形有四种,实心矩形,空心矩形,半角矩形,以及带有血量条的矩形。

#include "LyDrawingClass.h"int w = 0;
int h = 0;// 函数功能实现
void Function()
{}// 菜单绘制部分
void Draw()
{// 实心矩形DrawingClass::Start()->DrawFilledRectangle(10, 20, 90, 150, D3DCOLOR_RGBA(254, 0, 0, 184));// 实心矩形 半透明DrawingClass::Start()->DrawFilledRectangleB(160 , 20, 90, 150, D3DCOLOR_RGBA(254, 0, 0, 184));// 空心矩形DrawingClass::Start()->DrawBorderRectangle(300, 20, 90, 150, 2, D3DCOLOR_RGBA(15, 44, 0, 25));// 绘制四角方框DrawingClass::Start()->DrawFourCornersBox(450, 20, 90, 150, 2, D3DCOLOR_RGBA(254, 0, 0, 25));// 绘制角框DrawingClass::Start()->DrawCornerFrame(10, 200, 90, 150, 2, D3DCOLOR_RGBA(254, 0, 0, 25));// 封装血条DrawingClass::Start()->DrawPerspectiveRect(93, 160, 200, 90, 160);DrawingClass::Start()->DrawPerspectiveRect(65, 300, 200, 60, 120);DrawingClass::Start()->DrawPerspectiveRect(10, 450, 200, 90, 160);
}void Ptr()
{Function();Draw();
}int main(int argc, char *argv[])
{// 运行线程const char* class_name = "LyShark ClassName";// 通过进程名得到进程PIDDWORD pid = DrawingClass::Start()->GetProcessIdByName(L"Win32Project.exe");printf("进程PID = %d \n", pid);// 获取进程句柄HANDLE hwnd = DrawingClass::Start()->GetProcessHandle(pid);printf("进程句柄 = %d \n", hwnd);w = DrawingClass::Start()->GetWindowWidth(class_name, class_name);h = DrawingClass::Start()->GetWindowHeight(class_name, class_name);DrawingClass::Start()->createWindow(class_name, class_name, "黑体", Ptr);return 0;
}

效果图如下:

绘制血条有三种,横向血条,竖向血条,中心血条。

#include "LyDrawingClass.h"int w = 0;
int h = 0;// 函数功能实现
void Function()
{}// 菜单绘制部分
void Draw()
{// 普通血块(空块)DrawingClass::Start()->DrawBloodFrame(10, 20, 100, 15, 2, D3DCOLOR_RGBA(254, 0, 0, 184));// 竖向血条(基础)DrawingClass::Start()->DrawBlood_Vertical(100, 100, 200, 100, 55, D3DCOLOR_RGBA(254, 0, 0, 184));// 竖向血条(封装) style = 0 从下往上减血  style = 1 从上往下减血DrawingClass::Start()->DrawBlood_Horizontal(67, 200, 300, 22, 100, D3DCOLOR_RGBA(254, 0, 0, 184), 1);// 中心血条DrawingClass::Start()->DrawCenterBlood(300, 55, 100, 25, 98, 0);// 横向血条DrawingClass::Start()->DrawBlood_Transverse(83, 360, 200, 100, 22, D3DCOLOR_RGBA(254, 0, 0, 184), D3DCOLOR_RGBA(44, 0, 0, 10));DrawingClass::Start()->DrawBlood_Transverse(99, 400, 200, 22, 100, D3DCOLOR_RGBA(254, 0, 0, 184), D3DCOLOR_RGBA(44, 0, 0, 10));
}void Ptr()
{Function();Draw();
}int main(int argc, char *argv[])
{// 运行线程const char* class_name = "LyShark ClassName";// 通过进程名得到进程PIDDWORD pid = DrawingClass::Start()->GetProcessIdByName(L"Win32Project.exe");printf("进程PID = %d \n", pid);// 获取进程句柄HANDLE hwnd = DrawingClass::Start()->GetProcessHandle(pid);printf("进程句柄 = %d \n", hwnd);w = DrawingClass::Start()->GetWindowWidth(class_name, class_name);h = DrawingClass::Start()->GetWindowHeight(class_name, class_name);DrawingClass::Start()->createWindow(class_name, class_name, "黑体", Ptr);return 0;
}

绘制效果如下:

绘制圆形与各种准星图形,以及透视雷达。

#include "LyDrawingClass.h"int w = 0;
int h = 0;// 函数功能实现
void Function()
{}// 菜单绘制部分
void Draw()
{// 画圆形DrawingClass::Start()->DrawCircle(100, 200, 55, 3, D3DCOLOR_RGBA(255, 0, 0, 255));// 画圆点DrawingClass::Start()->DrawPoint(55, 67, 2, D3DCOLOR_RGBA(255, 0, 0, 255));// 画十字准星DrawingClass::Start()->DrawCollimation(255, 44, D3DCOLOR_RGBA(255, 0, 0, 255), 1);DrawingClass::Start()->DrawCollimation(280, 44, D3DCOLOR_RGBA(255, 0, 0, 255), 2);DrawingClass::Start()->DrawCollimation(350, 44, D3DCOLOR_RGBA(255, 0, 0, 255), 3);// 超级准星DrawingClass::Start()->DrawSuperCollimation(255, 100, D3DCOLOR_RGBA(255, 0, 0, 255), 1);DrawingClass::Start()->DrawSuperCollimation(300, 100, D3DCOLOR_RGBA(255, 0, 0, 255), 2);DrawingClass::Start()->DrawSuperCollimation(350, 100, D3DCOLOR_RGBA(255, 0, 0, 255), 3);// 绘制雷达DrawingClass::Start()->DrawRadar(400, 200);
}void Ptr()
{Function();Draw();
}int main(int argc, char *argv[])
{// 运行线程const char* class_name = "LyShark ClassName";// 通过进程名得到进程PIDDWORD pid = DrawingClass::Start()->GetProcessIdByName(L"Win32Project.exe");printf("进程PID = %d \n", pid);// 获取进程句柄HANDLE hwnd = DrawingClass::Start()->GetProcessHandle(pid);printf("进程句柄 = %d \n", hwnd);w = DrawingClass::Start()->GetWindowWidth(class_name, class_name);h = DrawingClass::Start()->GetWindowHeight(class_name, class_name);DrawingClass::Start()->createWindow(class_name, class_name, "黑体", Ptr);return 0;
}

具体效果如下:

针对文本的绘制有三种,普通文本,描边文本,以及重合绘制。

#include "LyDrawingClass.h"int w = 0;
int h = 0;// 函数功能实现
void Function()
{}// 菜单绘制部分
void Draw()
{char szBuf[256] = { 0 };strcpy(szBuf, "hello lyshark www.lyshark.com");// 普通文本DrawingClass::Start()->DrawString(szBuf, 25, 10, 20, D3DCOLOR_RGBA(255, 0, 0, 255));// 描边文本DrawingClass::Start()->DrawColourString(szBuf, 25, 20, 40, D3DCOLOR_RGBA(255, 0, 0, 255), D3DCOLOR_RGBA(5, 0, 0, 2));// 多重文本DrawingClass::Start()->DrawStringAndString(szBuf, szBuf, 30, 25, 50, 100, D3DCOLOR_RGBA(255, 0, 0, 255), D3DCOLOR_RGBA(5, 0, 0, 2));DrawingClass::Start()->DrawColourString2("hello lyshark", 30, 20, 20, D3DCOLOR_RGBA(0, 0, 255, 221));DrawingClass::Start()->DrawColourString3("welcome lyshark.com", 30, 40, 40, D3DCOLOR_RGBA(255, 0, 255, 255));
}void Ptr()
{Function();Draw();
}int main(int argc, char *argv[])
{// 运行线程const char* class_name = "LyShark ClassName";// 通过进程名得到进程PIDDWORD pid = DrawingClass::Start()->GetProcessIdByName(L"Win32Project.exe");printf("进程PID = %d \n", pid);// 获取进程句柄HANDLE hwnd = DrawingClass::Start()->GetProcessHandle(pid);printf("进程句柄 = %d \n", hwnd);w = DrawingClass::Start()->GetWindowWidth(class_name, class_name);h = DrawingClass::Start()->GetWindowHeight(class_name, class_name);DrawingClass::Start()->createWindow(class_name, class_name, "黑体", Ptr);return 0;
}

效果如下:

这里扩展一个知识点,如何得到游戏中的FPS数据,得到这个数据我们可以使用timeGetTime() * 0.001这个内置函数来得到,具体代码如下:

#include <Windows.h>
#include "LyDrawingClass.h"#pragma comment(lib,"winmm.lib")int 窗口宽度 = 0;
int 窗口高度 = 0;typedef struct
{DWORD 当前帧数;FLOAT 当前时间;FLOAT 持续时间;FLOAT 返回FPS;
}D3DFPS;D3DFPS fps = { 0 };FLOAT get_fps()
{fps.当前帧数 = fps.当前帧数 + 1;fps.当前时间 = timeGetTime() * 0.001;if (fps.当前时间 - fps.持续时间 > 1){fps.返回FPS = fps.当前帧数 / (fps.当前时间 - fps.持续时间);fps.持续时间 = fps.当前时间;fps.当前帧数 = 0;}return fps.返回FPS;
}void Draw()
{char sz[256] = { 0 };sprintf(sz, "当前游戏 FPS: %f", get_fps());DrawingClass::Start()->DrawColourString2(sz, 30, 20, 20, D3DCOLOR_RGBA(0, 0, 255, 221));char nam[256] = { 0 };strcpy(nam, "PowerBy: lyshark");DrawingClass::Start()->DrawColourString2(nam, 20, 70, 70, D3DCOLOR_RGBA(0, 0, 255, 221));
}int main(int argc, char *argv[])
{// 运行线程const char* class_name = "LyShark ClassName";窗口宽度 = DrawingClass::Start()->GetWindowWidth(class_name, class_name);窗口高度 = DrawingClass::Start()->GetWindowHeight(class_name, class_name);DrawingClass::Start()->createWindow(class_name, class_name, "黑体", Draw);return 0;
}

效果图如下:

FPS游戏:封装外部D3D透视模块相关推荐

  1. FPS游戏:实现D3D劫持透视 (API Hook)

    FPS游戏可以说一直都比较热门,典型的代表有反恐精英,穿越火线,绝地求生等,基本上只要是FPS游戏都会有透视挂的存在,而透视挂还分为很多种类型,常见的有D3D透视,方框透视,还有一些比较高端的显卡透视 ...

  2. FPS游戏:D3D内部游戏菜单实现

    19年发布了一篇<FPS游戏:实现GDI方框透视>这篇文章,本篇文章中使用到的技术是外部GDI绘制,该绘制模式在Win10系统中如果不关闭毛玻璃效果则绘制会失效,为了解决绘制失效的窘境,故 ...

  3. FPS游戏:D3D实现游戏人物上色

    本教程是<FPS游戏:实现D3D劫持透视 (API Hook)>教程的延续篇,在上一课我们讲解了如何通过函数劫持,实现对特定角色墙后透视功能,不过我们当时使用的是全局透视,并没有找到人物模 ...

  4. 【游戏逆向】FPS游戏自瞄透视之堆栈分析

    我们想做FPS游戏的自瞄透视功能,最基础的数据就是周围所有目标的坐标值只有确定了所有目标的位置,我们才能用算法写出自瞄和透视. 首先我们拿自身的血量当突破口,找出周围所有目标的遍历. 竞技场血量不好找 ...

  5. d3d透视逆向篇:第6课 通过特征码定位D3D函数入口地址

    本逆向安全章节是我业余之间编写的,也借鉴了前辈的经验来给大家做一个简单的文字逆向安全教程,欢迎大家讨论和指正,共同学习.禁止非法用途.教程我从最简单的开始给大家做一个简单的讲解d3d 类的3d游戏和f ...

  6. FPS 游戏实现D3D透视

    FPS游戏可以说一直都比较热门,典型的代表有反恐精英,穿越火线,绝地求生等,基本上只要是FPS游戏都会有透视挂的存在,而透视挂还分为很多种类型,常见的有D3D透视,方框透视,还有一些比较高端的显卡透视 ...

  7. 任鸟飞在线课程之FPS游戏自瞄爆头飞天透视画框

    0.FPS游戏自瞄展示 1.FPS游戏自瞄透视之模块动态加载 2.FPS游戏自瞄透视之玩转堆栈 3.FPS游戏自瞄透视之遍历周围所有目标 4.FPS游戏自瞄透视之目标需要的属性总结 5.FPS游戏自瞄 ...

  8. c语言游戏call调用,C语言-植物大战僵尸-刷僵尸call;fps游戏CS-方框透视(矩阵+传统)...

    C语言-植物大战僵尸-刷僵尸call:fps游戏CS-方框透视(矩阵+传统)前言:大家好,我是向上先生,嘿嘿~最近在学习逆向.反汇编等等,首先我在非常感谢52pojie这个平台,差不多很多学习资源都是 ...

  9. FPS游戏透视源码!

    FPS游戏透视源码! 2011年10月03日 需要的自己拿 ,部分插件需要自己给路径!~你懂的 C语言编译环境哈!#include #include #pragma comment(lib, &quo ...

  10. 深度解析FPS游戏外挂+解决方案

     1974年,由Steve Colley开发的世界上第一款FPS游戏<迷宫战争>诞生,这款看似简单的游戏却为未来近半个世纪的FPS类游戏的蓬勃发展埋下了一颗种子. 据今年2月STEAM热门 ...

最新文章

  1. JavaScript文件中调用AngularJS内部方法或改变$scope变量
  2. 2021年举行的第一场智能车校内赛 - 上海海事大学
  3. 6 scrapy框架之分布式操作
  4. 静态分配内存和动态分配内存
  5. vue-typescript
  6. linux下使用odbc连接mysql_Linux环境下通过ODBC访问MSSql Server
  7. SO_LINGER和优雅关闭连接
  8. 反编译androd的apk文件
  9. OpenGL ES之GLSurfaceView学习一:介绍
  10. ActiveMQ学习笔记之异常
  11. 推荐一个ITSM功能系统架构图给大家
  12. 个人博客网站建设详细版
  13. 启动期间的内存管理之初始化过程概述----Linux内存管理(九)
  14. 代理/ssh端口转发
  15. Virustotal威胁猎捕
  16. 国家公务员行测数字推理常见规律
  17. android根据url加载图片路径,初学Android——通过URL加载图片
  18. 物联网毕设选题 Stm32家庭有害气体检测系统 - 嵌入式 单片机
  19. 模具“回弹”公式揭秘,快来收藏吧!
  20. 基于ASP网上团购系统的设计与实现

热门文章

  1. 在线数学函数画图工具 2D 3D
  2. scrapy1.5文档(第二节 Scrapy Tutorial)
  3. 大数据入门教程系列之Hadoop环境搭建、软件准备
  4. python与数据思维基础网课答案_智慧树知到_Python数据分析与数据可视化_答案免费查询...
  5. JavaCC语法分析实验二
  6. 机器学习选择 Python 还是 R 语言?要不直接用 SQL 吧!
  7. 经纬度与大地坐标相互转换
  8. TFS2010中如何添加用户
  9. 数码管超声波c语言黑51,51单片机开发板-超声波测距-数码管显示
  10. ios 现有项目接入Flutter (问题集中营--少走弯路)