FPS游戏:D3D内部游戏菜单实现
19年发布了一篇《FPS游戏:实现GDI方框透视》这篇文章,本篇文章中使用到的技术是外部GDI绘制,该绘制模式在Win10系统中如果不关闭毛玻璃效果则绘制会失效,为了解决绘制失效的窘境,故本人将代码从易语言顺利移植成了C/C++并使用注入的方式劫持绘图函数实现内部D3D绘制,如下本人将具体分析如何实现的内部绘制。
首先在外部GDI绘制时,您肯定发现了,在WindowsXP系统下绘制出来的无论是方框还是文字都会频繁闪烁,而在Win10系统,由于启用了毛玻璃效果,则外部GDI绘制干脆躺平了,这就很尴尬。
本人通过C/C++封装实现了D3D内部与外部多种绘制方法,接下来将逐一分析代码是如何实现的。
外部D3D绘制模块
所谓外部D3D绘制,其实现原理是,通过在外部创建顶层窗体,并每隔指定毫秒数,自动附加窗体到目标进程上,我们所有的绘制操作都是在自身进程上实现的。
这种方式绘制出来的方框或菜单,都有一个显著的特点,首先占用CPU过高,且当有其他窗体覆盖到游戏顶层时,则绘制出来的菜单或方框将会被置顶,如下效果:
至于外部绘制如何监控热键,我们可以使用RegisterHotKey(NULL, 1, 0, VK_UP);
注册,由于是外部,因此不需要热键回调,所以只需要注册即可全局生效。
菜单的绘制,很简单,首先一个外包矩形,矩形的大小需要自己计算得到,你有几个功能则矩形就需要有多长,矩形内部嵌套一个小矩形,当用户按下上下左右时,我们默认让其自动移动位置,这个移动位置是通过下标计算得出的偏移,根据计算的得出的偏移值,从而实现动态移动,当用户选中某个菜单项时,则全局变量负责接收,并判断功能即可。
内部D3D绘制模块
相对于外部D3D绘制模块来说,则不存在以上问题,与外部绘制不同,内部绘制需要控制转接函数,在原始绘图函数工作之前,需要增加新的绘制方法,内部绘制效率时最高的,且内部绘制不存在占用CPU资源高的情况,一般绘制出来的效果如下:
如上,很明显内部绘制与父进程已经融合了,并不存在挡住的情况,但内部绘制使用RegisterHotKey()
无法注册热键,需要将自身热键注册到父窗体回调事件中才可以,所以代码上也需要增加一些。