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()
无法注册热键,需要将自身热键注册到父窗体回调事件中才可以,所以代码上也需要增加一些。
FPS游戏:D3D内部游戏菜单实现相关推荐
- rust腐蚀怎么单人游戏_腐蚀RUST怎么提高帧数_腐蚀RUST提高FPS方法_52pk单机游戏
一.如何查看你当前的FPS.(steam办法) 一种方法是激活Steam FPS: 在Rust客户端关闭的情况下,进入主Steam程序窗口的"Steam"选项卡 点击"设 ...
- rust腐蚀怎么单人游戏_腐蚀游戏怎么提高帧数 Rust设置隐藏画质提高FPS教程
腐蚀游戏怎么提高帧数 Rust设置隐藏画质提高FPS教程 2018-03-04 10:58:10来源:游戏下载编辑:云曼衍评论(0) <腐蚀(Rust)>已经正式上市发售了,因为游戏的配置 ...
- java游戏开发入门(二) - 菜单
java游戏开发入门(二) - 菜单 前言 编码 主菜单 游戏内菜单(按下ESC后出现,并会暂停游戏) 效果展示 主菜单 游戏内菜单 完整代码 完整项目 前言 上一章我们创建了一个600x600的 ...
- 【从0到1实现多人FPS房间对战游戏】
从0到1实现FPS房间对战游戏 简介 服务器结构 序列化实现 demo获取 简介 基于godot开源客户端引擎和go开源游戏框架pitaya,实现经典多人3D房间fps射击游戏 立足开源才能站在巨人肩 ...
- 目前游戏行业内部主要几款游戏引擎的技术对比(转)
如果只有客户端的话,可以考虑用gamebryo,技术好一点,用ogre也可以,如果规模不大,用unity3d,如果很有钱,要效果很好的,用unreal3,bigworld是带服务器的,如果能力不够,最 ...
- [转]目前游戏行业内部主要几款游戏引擎的技术对比
如果只有客户端的话,可以考虑用gamebryo,技术好一点,用ogre也可以,如果规模不大,用unity3d,如果很有钱,要效果很好的,用unreal3,bigworld是带服务器的,如果能力不够,最 ...
- 【Iphone 游戏开发】游戏引擎剖析
为什么80%的码农都做不了架构师?>>> 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame. ...
- 《游戏机制——高级游戏设计技术》一1.1 规则定义游戏
本节书摘来异步社区<游戏机制--高级游戏设计技术>一书中的第1章,第1.1节,作者: [美]Ernest Adams 译者: 石曦 责编: 陈冀康,更多章节内容可以访问云栖社区" ...
- 多人网络游戏服务器开发基础学习笔记 I:基本知识 | 游戏设计模式 | 网游服务器层次结构 | 游戏对象序列化 | 游戏 RPC 框架 | 帧同步和状态同步
今天继续开新坑,尽管过了很多 Unix 套接字编程的坑,但是实际还是有很多不同场景和性能的需求,以及最服务器架构的内容也就接触过 preforking 和 master 带 worker 而已. 所以 ...
最新文章
- 防sql注入 php代码,完美的php防sql注入代码
- JDK、J2EE、J2SE、J2ME的区别
- 64位传参利用方法LibcSearcher使用入门ROPgadget利用
- hive如何处理not in和in的问题
- ?php php,PHP: Balises PHP - Manual
- (组合数学笔记)Pólya计数理论_Part.2_群及其性质
- 轮到苹果追赶国产厂商了?苹果新专利曝光iPhone将使用屏幕指纹解锁
- c# string 转 datetime_利用swig封装C++的dll为C#方便使用
- 卷积神经网络CNN原理以及TensorFlow实现
- Apache CarbonData学习资料汇总
- 解决谷歌浏览器chrome的CPU占用率过高的问题
- 炼石白小勇:合规与实战推动密码产业发展
- android2048项目报告,Android项目开发实战-2048游戏
- 华硕主板电脑开机后一直反复进入BIOS界面解决办法(其中之一)
- 在VMware上安装macOS
- 虐我千百遍之NS3安装
- xp系统开机自检很久_xp系统开机慢怎么解决两种提升电脑开机速度方法
- 如何快速创建vue的SPA项目
- h1283 linux内核,H1073C H1073 H1283升级失败恢复方法
- 项目进度安排必须妥善处理的几个问题
热门文章
- 深圳弘辽科技电商|马云:我希望未来中国的500个好公司中,有200个CEO来自于阿里巴巴的人
- 数据库复试——数据库设计(主观题)
- php使用邮件找回密码,thinkphp实现发送邮件密码找回功能实例
- negative和passive的反义词_negative 和 passive的区别?
- .NET Core C#系列之XiaoFeng.ToCast万能类型转换器
- 爬虫基础之爬取豆瓣top250电影名字
- 一村一码,扫二维码反映民生
- 在uniapp上使用不了FormData对象的问题解决
- VMware虚拟机安装DOS6.22(二)
- STM32F103之实验2控制1个电机并采用编码器读取电机转速(代码)