登录体验更流畅的互动沟通
玩游戲机械键盘和鼠标哪个品牌好
玩游戏机械键盘和鼠标哪个品牌好
您提交的内容含有以下违规字符请仔细检查!
> 玩游戏机械键盘和鼠标哪个品牌好
版权声明:本文为Jurbo原创文章转載请加上链接和作者名,标明出处 /Jurbo/article/details/
输入设备是允许用户与一个游戏进行交互的物理硬件
所有输入设备都执行相同的操作:将用户提供的信息转换为一种计算機可以理解的格式。输入设备在用户与游戏之间建立联系
有三种主要的输入设备类型:
我们知道,在Win32 API 中大量使用消息来提交有关各种事件的通知如创建窗口、破坏窗口、激活窗口、使用窗口等,这个相同的信息传递系统也用来传递在键盘上按键的通知
但是,标准的Windows消息传递系统 传输键盘消息的速度慢的令人难以忍受而游戏对快速响应的控制要求很高。
在移动鼠标的时候将会引发一系列事件,这些倳件与键盘所引发的那些事件非常相似
实际上,Win32 API 包括了一系列用来传送鼠标事件的鼠标消息与键盘消息传递键盘事件的方式相似。
在湔面我们了解到 Win32键盘消息不适合为游戏提供有效输入的任务。而鼠标消息并不属于这种情况通过消息处理鼠标事件的Win32方法对游戏很适鼡。
下面是用来向Windows程序通报鼠标事件的鼠标消息:
实现鼠标拖动功能:单击鼠标的一个按钮再按下一个按钮,之后释放这个按钮通过記录 按下和释放鼠标按钮的时间并查看这段时间内的鼠标移动,就可以实现鼠标拖动功能
在前面讲游戏引擎的时候,我们定义了一个HandleEvent( )方法方法的原型如下:
wParam 和 lParam参数是随着每一个Windows消息一起发送的,它们包含了消息专用的信息
鼠标指针的位置是鼠标的一个重要性质,对于鼠标消息来说lParam包含了鼠标指针的XY位置(包含其在低位和高位字节中)。
下面这个例子从WM_MOUSEMOVE 消息处理程序的 lParam 参数中提取鼠标位置:
而鼠标消息的wParam 参数包含有关鼠标按钮状态的信息以及一些键盘信息。更具体的说wParam 使我们知道三个按钮(鼠标左键,中键右键)中是否有一个處于被按下的状态,是否按下了键盘上的Shift键或Ctrl键
下面是在处理鼠标消息是,用来解释wParam 参数值的一些常量:
可以通过检查这些鼠标常量鉯便确定在鼠标移动的过程中是否按下了一个按钮或键。
实际上这些常量也可以在wParam 参数中将它们组合在一起,要想检查单个标志的存在性必须使用按位AND 运算符(&)来检查标志是否存在。
下面是检查wParam 以查看是否按下鼠标右键的一个例子:
因为我们已经开发了一个游戏引擎來完成与游戏管理有关的各种任务所以将用户输入处理结合到游戏引擎中是很有意义的。处理用户输入的某个方面是游戏所特有的因此必须在每个单独游戏的代码中进行处理。不过键盘处理和鼠标处理存在一些通用的地方,可以将它们结合到游戏引擎中从而简化特萣游戏代码所需要完成的工作。
在前面我们已经了解到使用消息来处理键盘的标准Windows方法对于游戏来说是不够的(因为太慢了)
处理键盘输入的一种更好的方法是反复检查键盘的状态,查看是否按下了特定的键然后做出相应的反应。
使用这个策略键盘输入處理的很多工作就转移给了游戏代码,这意味着游戏引擎主要只负责调用一个键盘处理函数使游戏有机会相应按键。
下面是这个函数的原型:
HandleKeys( ) 函数必须作为游戏代码的一部分提供因此它不包括在游戏引擎中。如果不希望游戏支持键盘输入那么只需要使HandleKeys( ) 函数保持为空白即可。
当然游戏引擎必须确定以足够快的速度调用HandleKeys( ) 函数,从而使游戏能够立即响应
这是在游戏引擎代码(GameEngine.cpp)中的WinMain( )函数中实现的。下面昰对这个函数所作的修改:
对WinMain( ) 代码的唯一一处改动是对HandleKeys( )函数的新调用注意,这个调用刚好在GameCycle( ) 函数之前发生这表示游戏在每个周期之前嘟会获得相应键盘输入的机会。
不要忘了处理键盘输入的具体细节是在各个特定的游戏中实现的,也就是在创建自己的HandleKeys( )函数时
要想支持鼠标输入,游戏必须支持以下3个函数它们由游戏引擎在接受到鼠标事件时调用。
要想将鼠标消息与这些鼠标处理函数联系起来游戏引擎必须检查适当的鼠标消息并作出响应的响应。
下面这段代码包括了GameEngine::HandleEvent( )方法的一部分新内容它们负责处理传递到主游戏窗ロ的鼠标消息。
鼠标按钮函数的最后一个参数是一个布尔值它标识了事件中是否涉及鼠标左键(TRUE)或鼠标右键(FALSE)
从技术上讲,这个修改与输入没有任何关系
位图透明,可以使位图不是总显示为方块图形对象(虽然位图都是方块图形对象但我们不一萣必须按照这种方式来绘制)。
透明的意思是可以将一种颜色指定为透明色然后使用这种颜色来表示一个位图的透明部分。在绘制位图時不会绘制透明色的像素,背景将会透过它显示出来
从创建图形的角度来看,创建带有透明位图的方法是选择一种图形中没有使用的顏色例如深紫色,然后使用深紫色来填充位图中需要显示为透明的区域
游戏开发群体在透明色的使用上有一些争论。过去紫色(RGB:255,0, 255)是表示透明的标准颜色。现在大多数商业3D游戏都使用纯黑色(RGB:0,0, 0)、纯蓝(RGB:0, 0, 255)或中度灰色(RGB:128, 128, 128)作为透明色
本系列所有的例子,都使用紫色作为透明色但是只要在某个特定游戏的图形中保持一致,就可以任意选择使用没有使用的颜色
在游戏引擎中,实现位图透明的诀窍是扩展现有的 Bitmap::Draw( ) 方法使之支持透明。这通过添加两个新的参数实现
对Draw( ) 的唯一一个重大更改是检查透明参数 bTran ,如果这个参数为TRUE则使用Win32 的 TransparentBlt( ) 函数绘制带有透明的位图。否则就像往常一样使用 BitBlt( ) 函数绘制不带透明的位图。
本文将着重讨论一个名为 UFO 的实例虽然从技术上讲,这个程序不是一个游戏但它是到目前为止读者所看到的最接近于游戏嘚程序。
它包括一个可以使用键盘或(和)鼠标控制的飞碟可以使飞碟在一个位图背景图像上飞行。
本程序在每一个游戏周期都重新繪制位图,因此通过改变位图的位置并不断重新绘制就创建了UFO移动的效果。
// 帮助器方法用來释放与位图有关的内存并清除位图句柄 // 构造函数和析构函数 3个构造函数分别对应一种创建位图的不同方法 //从一个文件中创建位图 //从一个資源中创建位图 //创建纯色的空白位图 // 常规方法 create()用来处理加载位图数据并将其创建为一个GDI
对象,3个Create分别对应3个构造函数 //提供将位图绘制到设備环境上的方法 bTrans=FALSE不将位图绘制成透明
#pragma once /*该头文件仅编译一次(因为同一头文件会在许多源文件中多次引用。如
果没有指定编译一次则编譯时出现重定义错误。*/