FPS遊戲:實現D3D方框透視 [思路]

在2019年初時本人總結了基於算法的GDI透視輔助的製作,並於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()無法註冊熱鍵,需要將自身熱鍵註冊到父窗體回調事件中才可以,所以代碼上也需要增加一些。

內部繪製增加以前的那個透視代碼,可穩定繪製出來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章