参考资料

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

参考资料

1.本文讲解怎样处理鼠标消息。编程思路有很多种,本文只是提供一种思路,并非一定要照这么做。

通常写小游戏时,很多人会有一个主循环,类似这样:

while(true)

{

获取用户控制();

进行游戏运算();

绘制游戏内容();

Sleep(xx);

}

当添加鼠标操作时,会这样写(错误代码):

// 定义变量,保存鼠标消息

MouseMsg msg;

// 游戏的主循环

while(true)

{

if (MouseHit()) // 当有鼠标消息的时候执行

{

msg = GetMouseMsg(); // 获取鼠标消息

switch(msg.uMsg) // 根据不同的鼠标消息,执行不同的代码

{

case xxxx: 进行游戏运算(); break;

case xxxx: 进行游戏运算(); break;

}

}

绘制游戏内容();

Sleep(xx); // 延时,降低 CPU 占用率

}

这个代码的问题是,由于Sleep 的存在,导致鼠标消息的产生速度,超过游戏处理的速度。比如有Sleep(20),那么主循环每秒钟最多循环50 次,也就最多处理50 次鼠标消息。但是鼠标移动时也会产生一系列的鼠标消息,这个速度远远超过每秒钟50 次,这就导致鼠标消息的缓冲区溢出,会导致每次处理得鼠标消息都是旧的,并且无法接收新的鼠标消息。

于是,有人在Sleep(xx) 之前,增加了函数FlushMouseMsgBuffer(),将多余的鼠标消息清空。很明显的,这样会造成另一个问题:鼠标消息丢失。产生的效果就是操作不灵敏,一些点击操作无效。因为鼠标移动的消息数量占大多数,点击操作占少数,清空的鼠标消息很可能包括点击操作,所以点击操作最受影响。

作为一种解决方案,可以考虑这么做:

// 定义变量,保存鼠标消息

MouseMsg msg;

// 游戏的主循环

while(true)

{

while (MouseHit()) // 当有鼠标消息的时候执行

{

msg = GetMouseMsg(); // 获取鼠标消息

switch(msg.uMsg) // 根据不同的鼠标消息,执行不同的代码

{

case xxxx: 进行游戏运算(); break;

case xxxx: 进行游戏运算(); break;

}

}

绘制游戏内容();

Sleep(xx); // 延时,降低 CPU 占用率

}

这样,就可以确保每次都能处理每一个鼠标消息,并且不会造成鼠标消息的丢失。在范例程序里面,很多网友的投稿都有鼠标操作,同样可以做一个参考。

既然如此,那么关于FlushMouseMsgBuffer 函数,在什么时候使用呢?

例如游戏“连连看”,这样一个功能:

准备游戏3、2、1倒计时();

执行游戏();

问题是:在倒计时的时候,用户有可能会狂点鼠标。那么这些鼠标操作,是会“记忆”的,等到“执行游戏”的时候,获取到的鼠标消息,都是倒计时期间的,因此会产生错误的操作。可以这么解决:

准备游戏3、2、1倒计时();

FlushMouseMsgBuffer();

执行游戏();

这样,就可以确保在“执行游戏()”的时候,不会受之前的鼠标操作所影响。

2.

相关文档
最新文档