天天看點

FPS遊戲:D3D内部遊戲菜單實作

19年釋出了一篇《FPS遊戲:實作GDI方框透視》這篇文章,本篇文章中使用到的技術是外部GDI繪制,該繪制模式在Win10系統中如果不關閉毛玻璃效果則繪制會失效,為了解決繪制失效的窘境,故本人将代碼從易語言順利移植成了C/C++并使用注入的方式劫持繪圖函數實作内部D3D繪制,如下本人将具體分析如何實作的内部繪制。

首先在外部GDI繪制時,您肯定發現了,在WindowsXP系統下繪制出來的無論是方框還是文字都會頻繁閃爍,而在Win10系統,由于啟用了毛玻璃效果,則外部GDI繪制幹脆躺平了,這就很尴尬。

本人通過C/C++封裝實作了D3D内部與外部多種繪制方法,接下來将逐一分析代碼是如何實作的。

外部D3D繪制子產品

所謂外部D3D繪制,其實作原理是,通過在外部建立頂層窗體,并每隔指定毫秒數,自動附加窗體到目标程序上,我們所有的繪制操作都是在自身程序上實作的。

這種方式繪制出來的方框或菜單,都有一個顯著的特點,首先占用CPU過高,且當有其他窗體覆寫到遊戲頂層時,則繪制出來的菜單或方框将會被置頂,如下效果:

FPS遊戲:D3D内部遊戲菜單實作

至于外部繪制如何監控熱鍵,我們可以使用​

​RegisterHotKey(NULL, 1, 0, VK_UP);​

​注冊,由于是外部,是以不需要熱鍵回調,是以隻需要注冊即可全局生效。

菜單的繪制,很簡單,首先一個外包矩形,矩形的大小需要自己計算得到,你有幾個功能則矩形就需要有多長,矩形内部嵌套一個小矩形,當使用者按下上下左右時,我們預設讓其自動移動位置,這個移動位置是通過下标計算得出的偏移,根據計算的得出的偏移值,進而實作動态移動,當使用者選中某個菜單項時,則全局變量負責接收,并判斷功能即可。

内部D3D繪制子產品

相對于外部D3D繪制子產品來說,則不存在以上問題,與外部繪制不同,内部繪制需要控制轉接函數,在原始繪圖函數工作之前,需要增加新的繪制方法,内部繪制效率時最高的,且内部繪制不存在占用CPU資源高的情況,一般繪制出來的效果如下:

FPS遊戲:D3D内部遊戲菜單實作

如上,很明顯内部繪制與父程序已經融合了,并不存在擋住的情況,但内部繪制使用​

​RegisterHotKey()​

​無法注冊熱鍵,需要将自身熱鍵注冊到父窗體回調事件中才可以,是以代碼上也需要增加一些。