网页功能: 加入收藏 设为首页 网站搜索  
DirectX下软件鼠标的实现
发表日期:2006-08-23作者:[转贴] 出处:  

蔡指着屏幕上对我说:“喂,你看我的鼠标,怎么样?”

  他的显示器已经很明显的设置成DirectX的显示模式,一只小剑在屏幕上当鼠标移来移去。他点了一下鼠标左键,背景切换成了另外一幅图像,然而当他移动鼠标的时候,背景上出现了原来被保存的区域,这就破坏了图像的整体观感。当鼠标再次移动的时候,又恢复了正常,然而这一小点的不足,足足可以称的上是一个BUG。

  在游戏中,可以使用硬件鼠标,这样,作为开发人员,我们不必写上大量的代码来实现鼠标的更新。但是,硬件鼠标只有一种形式,而在游戏中,为了表示各种各样的信息,鼠标的形状,大小是时刻要变化的,有时还要用到各种各样的动画鼠标,这样一来,硬件鼠标自然满足不了需要了,于是我们就的想办法来实现各种各样的鼠标,这就是软件鼠标。通常,没有BUG的软件鼠标有两种实现方式,下面一一道来。

  首先,一种比较简单的方法,是根据鼠标总是在画面的最上方的特点,每次鼠标移动,都把背景重新画一次,最后再画鼠标,这样,能够确保鼠标不会出现BUG。然而在背景复杂的情况下,这样做的结果是大大的影响程序的性能,应为鼠标的刷新间隔是很短的,为了刷新一个小小的鼠标,而把整个屏幕从新画一遍,这样做的代价是很高昂的。我在拚图器的演示版中使用的就是这种鼠标,这是因为拚图器的刷新量不大,在比较快的机器上,每秒钟刷30桢以上不成问题,而且他的实现极其简单,几乎就是硬件鼠标。这种鼠标的实现,就说到这里。

  其次,是一种典型的鼠标实现方式,就是区域保存/重绘方式,几乎所有的游戏都是使用这种形式的鼠标,这种鼠标的特点是需要重新绘制的工作量小,速度快,对机器的性能几乎没有影响。但是,这样的鼠标的实现,却需要大量的代码来支撑。复杂度比较高,一不小心就会出现本文开头所提到的状况。我并不想提出任何实例来说明这一点,只是从理论上来讨论索要注意的问题。

数据的获得。一般的,我们打开软件鼠标的同时,也把硬件鼠标关闭,这样,我们要把握鼠标的位置,可以通过DirectInput来实现。不过,我觉得使用windows的消息管理来更方便一点。在Message结构中,当发生WM_MOUSEMOCVE事件时,HIWORD(lParam)和(LOWORD(lParam)分别返回鼠标的X、Y坐标。

在适当的位置贴图。鼠标有一个HOTPOINT,即鼠标点击时生效的位置。实际上,你获得的鼠标坐标就是图快应该贴上的位置,关于这一点的换算,我就不例举出来了。

鼠标移动之后背景的恢复。这是最复杂的问题,也就是产生BUG的地方。首先,你应该依据屏幕上的格式,开一小块内存用来做保存背景之用。把鼠标将要经过的地方先保存下来,然后画上鼠标,当鼠标移开之后,把这一小快又重新画上去,这样,就实现了鼠标的移动。但是值得注意的问题是,当背景变了之后,鼠标的移动回到支援先保存的鼠标背景画在变了以后的背景上,造成本文开头的
BUG。这种情况,我们经过商量之后认为,我们只要在背景发生改变时,设置一个标记,表示背景已经改变,而鼠标更新程序检测到这个标志后,立即根据保存的背景的矩形区域重新获得一次背景,就可以避免这个问题,这样,就要求在保存鼠标的信息时,应该保存的数据除了鼠标的参数以外,还应该由鼠标当前所在的矩形区域的坐标。这样,这个问题就可以完满解决了。


 

我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 DirectX下软件鼠标的实现
本类热点文章
  DirectInput里的键盘鼠标的应用
  一个中文输入的类
  掌握DirectX和DirectInput力反馈游戏杆
  格斗类游戏的键盘处理
  游戏鼠标操作的思考
  DX下VC6.0中文輸入問題
  使用系统输入法
  DirectInput 键盘编程入门
  DirectX下软件鼠标的实现
  DirectDraw 与 DirectInput 的游戏编程..
  DirectInput 鼠标编程入门
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2024 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00353