SDL鼠标事件
鼠标事件有这么多种,手柄的可以忽视,Sdl.SDL_KEYDOWN,Sdl.SDL_KEYUP,Sdl.SDL_MOUSEMOTION,Sdl.SDL_MOUSEBUTTONDOWN,Sdl.SDL_MOUSEBUTTONUP应该是常用的。
public enum EventTypes
{
/// <summary>
/// No event
/// </summary>
None = Sdl.SDL_NOEVENT,
/// <summary>
/// Active event
/// </summary>
ActiveEvent = Sdl.SDL_ACTIVEEVENT,
/// <summary>
/// Key down event
/// </summary>
KeyDown = Sdl.SDL_KEYDOWN,
/// <summary>
/// Key up event
/// </summary>
KeyUp = Sdl.SDL_KEYUP,
/// <summary>
/// Mouse Motion event
/// </summary>
MouseMotion = Sdl.SDL_MOUSEMOTION,
/// <summary>
/// Mouse button down event
/// </summary>
MouseButtonDown = Sdl.SDL_MOUSEBUTTONDOWN,
/// <summary>
/// Mouse button up event
/// </summary>
MouseButtonUp = Sdl.SDL_MOUSEBUTTONUP,
/// <summary>
/// Joystick Axis motion event
/// </summary>
JoystickAxisMotion = Sdl.SDL_JOYAXISMOTION,
/// <summary>
/// Joystick ball motion event
/// </summary>
JoystickBallMotion = Sdl.SDL_JOYBALLMOTION,
/// <summary>
/// Joystick hat motion event
/// </summary>
JoystickHatMotion = Sdl.SDL_JOYHATMOTION,
/// <summary>
/// Joystick button down event
/// </summary>
JoystickButtonDown = Sdl.SDL_JOYBUTTONDOWN,
/// <summary>
/// joystick button up event
/// </summary>
JoystickButtonUp = Sdl.SDL_JOYBUTTONUP,
/// <summary>
/// Video resize event
/// </summary>
VideoResize = Sdl.SDL_VIDEORESIZE,
/// <summary>
/// Video expose event
/// </summary>
VideoExpose = Sdl.SDL_VIDEOEXPOSE,
/// <summary>
/// Quit event
/// </summary>
Quit = Sdl.SDL_QUIT,
/// <summary>
/// Window manager event
/// </summary>
WindowManagerEvent = Sdl.SDL_SYSWMEVENT,
/// <summary>
/// user-defined event
/// </summary>
UserEvent = Sdl.SDL_USEREVENT
}
鼠标点击后的button:
public enum MouseButton
{
/// <summary>
/// None
/// </summary>
None = ,
/// <summary>
/// Primary button. Typically the left button
/// </summary>
PrimaryButton = Sdl.SDL_BUTTON_LEFT,
/// <summary>
/// Secondary button. typically the right button
/// </summary>
SecondaryButton = Sdl.SDL_BUTTON_RIGHT,
/// <summary>
/// Middle button
/// </summary>
MiddleButton = Sdl.SDL_BUTTON_MIDDLE,
/// <summary>
/// Wheel up
/// </summary>
WheelUp = Sdl.SDL_BUTTON_WHEELUP,
/// <summary>
/// Wheel down
/// </summary>
WheelDown = Sdl.SDL_BUTTON_WHEELDOWN
}
常用的代码写法
while (!quit) //建立事件主循环
{
while (Sdl.SDL_PollEvent(out ev) == )//从队列里取出事件
{
Sdl.SDL_WaitEvent(out ev); //必须等待
if (ev.type == Sdl.SDL_MOUSEBUTTONDOWN)
{
if (ev.button.button == Sdl.SDL_BUTTON_LEFT)
{
MouseDown(ev.button);
}
else
if (ev.button.button ==Sdl.SDL_BUTTON_RIGHT)
{
}
}
else
if (ev.type == Sdl.SDL_MOUSEMOTION)
{
MouseMove (ev.button);
}
else
if (ev.type == Sdl.SDL_MOUSEBUTTONUP)
{
if (ev.button.button ==Sdl.SDL_BUTTON_LEFT)
{
MouseUp (ev.button);
}
}
else
if (ev.type ==Sdl.SDL_VIDEORESIZE)
{
}
else
if (ev.type ==Sdl.SDL_QUIT)
{
quit = true;
break;
}
}
}
在处理SDL的事件有两种模式,一种是等待 SDL_WaitEvent,另一种是轮询SDL_PollEvent
目前,在网上可以查到的文章,大多数都使用了轮询,还有人指出等待有时会导致事件处理延迟。但是我在实际coding中,使用SDL_PollEvent,一运行就风扇不停的转,用top看了下,cpu占用到了99%。
实际上,使用wait已经足够,我不大清楚这种轮询机制在什么时候会用到。
以下是一个SDL_PollEvent的原型。分析一下这段程序:
在while(quit!=1)这个循环中,如果没有发生任何事件,quit始终为0,那么在用户没有任何操作的情况下,这里会无限循环,直到event发生,进入了SDL_PollEvent的循环中。
这就导致了cpu占用率达到了100%. 因此,这种方法是不可取的。
在外层有循环时,SDL_PollEvent论询是不能用的。如果单独使用,用户无操作的时候,又无法进入处理事件的部分。实在不能明白它有什么用。
我考虑是不是这个应该用在非实时处理的时候,比如while(quit!=1)循环中嵌入一个sleep(1)之类。
void WaitKeyboard(SubWin sw){
int quit = ;
SDL_Event event;
KEYBOARDMODE kmode = COMMAND;
while(quit!=){
// printf ( "waiting for keyboard action\n" );
while( SDL_PollEvent(&event)){
printf ( "WaitKeyboard: caught keyboard %x\n", event.key.keysym.sym );
switch (event.type){
case SDL_KEYDOWN:
printf ( "tracking keydown\n" );
kmode = TrackKeyDown(sw, event.key.keysym.sym, kmode);
break;
case SDL_QUIT:
printf("Stop !\n");
quit = ;
break;
}
}
}
endSDL();
}
接下来是SDL_WaitEvent的原型
在while(quit!=1)的循环中,由于SDL_WaitEvent语句,在用户未发生任何操作前,程序处于等待状态,不会进入下一次循环,这样就避免了cpu占用的问题。
这样的做法才是正确处理SDL事件的方法。
void WaitKeyboard(SubWin sw){
int quit = ;
SDL_Event event;
KEYBOARDMODE kmode = COMMAND;
while(quit!=){
// printf ( "waiting for keyboard action\n" );
// while( SDL_PollEvent(&event)){
SDL_WaitEvent(&event);
printf ( "WaitKeyboard: caught keyboard %x\n", event.key.keysym.sym );
switch (event.type){
case SDL_KEYDOWN:
printf ( "tracking keydown\n" );
kmode = TrackKeyDown(sw, event.key.keysym.sym, kmode);
break;
case SDL_QUIT:
printf("stop !\n");
quit = ;
break;
}
}
endSDL();
}
http://blog.chinaunix.net/uid-26456800-id-3337795.html
SDL鼠标事件的更多相关文章
- 7.JAVA之GUI编程鼠标事件
鼠标事件: 功能: 1.基本窗体功能实现 2.鼠标移动监听,当鼠标移动到按钮上时,触发打印事件. 3.按钮活动监听,当按钮活动时,触发打印事件. 4.按钮被单击时触发打印事件. 源码如下: impor ...
- 手持设备点击响应速度,鼠标事件与touch事件的那些事
前言 现在一直在做移动端的开发,这次将单页应用的网页内嵌入了app,于是老大反映了一个问题:app应用点击响应慢!我开始不以为然,于是拿着网页版的试了试,好像确实有一定延迟,于是开始了研究,最后选择了 ...
- css屏蔽元素的鼠标事件pointer-events
// 屏蔽点击 $('body').css('pointer-events', 'none'); //恢复默认 $('body').css('pointer-events', 'auto'); 用 ...
- 深入学习jQuery鼠标事件
× 目录 [1]类型 [2]写法 [3]合成事件[4]鼠标按键[5]修改键[6]坐标位置 前面的话 鼠标事件是DOM事件中最常用的事件,jQuery对鼠标事件进行了封装和扩展.本文将详细介绍jQuer ...
- 深入理解DOM事件类型系列第一篇——鼠标事件
× 目录 [1]类型 [2]顺序 [3]坐标位置[4]修改键[5]相关元素[6]鼠标按键[7]滚轮事件[8]移动设备 前面的话 鼠标事件是web开发中最常用的一类事件,毕竟鼠标是最主要的定位设备.本文 ...
- winform/窗体鼠标事件编程中的几个问题
1.进行.net窗体的开发,经常用到鼠标事件,如MouseDown/MouseUp/MouseMove/MouseClick等.可是有时候给控件添加鼠标事件,就是不响应,怎么办呢! 答案:1.控件是否 ...
- JQuery事件之鼠标事件
鼠标事件是在用户移动鼠标光标或者使用任意鼠标键点击时触发的. ():click事件:click事件于用户在元素敲击鼠标左键,并在相同元素上松开左键时触发. $('p').click(function( ...
- c#全局鼠标事件以及鼠标事件模拟
最近在编写Max插件时,其主容器FlowLayoutPanel由于隐藏了滚动条,要实现按住鼠标中键上下拖动的功能,因此尝试了全局鼠标事件.以及鼠标勾子,可惜由于Max不争气?都未能实现,于是代码报废, ...
- Extjs 窗体居中,双重窗体弹出时清除父窗体的鼠标事件
这个是监控窗体缩放的事件 缩放中居中主要在 'beforeshow' 和 'destroy'两个事件里面监控 var EditTempWindow; Ext.EventManager.onWindow ...
随机推荐
- 设计模式C#实现(十五)——命令模式
意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 将请求封装成一个对象,客户接受请求参数:可以对请求排队或者记录请求日志,以及可以支持撤销操作 适用性 抽象出待执行的动作以参数化某对 ...
- 烂泥:阿里云RDS本地恢复数据
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 公司目前使用的数据库是阿里云的RDS,目前RDS的版本为mysql5.6.如下: 现在要 ...
- Neutron 理解 (9): OpenStack 是如何实现 Neutron 网络 和 Nova虚机 防火墙的 [How Nova Implements Security Group and How Neutron Implements Virtual Firewall]
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
- HOLOLENS程序发布,这个界面调用的图片
SplashScreen.scale-200.png 1240 x 600
- IdentityHashMap类:增加相同Key(键)内容的结果
正常Map操作中,key是不能重复的. 先看使用HashMap()操作,增加相同Key内容的结果: 先看代码: package 类集; import java.util.HashMap; import ...
- IT领域中哲学原理的应用——个体与整体
个体与整体哲学原理在很多学科和领域中都会得到应用,今天就看看IT行业中有哪些地方应用了个体和整体的原理. IT行业可以分为硬件.软件.网络三个领域,我们可以分别针对这三个领域来看下. 硬件方面,最基本 ...
- C#.NET 大型企业信息化系统 - 防黑客攻击 - SSO系统加固优化经验分享
好久没写文章了,突然间也不知道写什么好了一样,好多人可能以为我死了,写个文章分享一下.证明一下自己还在,很好的活着吧,刷个存在感. 放弃了很多娱乐.休闲.旅游.写文章.看书.陪伴家人,静心默默的用了接 ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 远程同步服务器大量基础数据到客户端
服务器上保存有上万条的基础数据,需要同步到全国各地的成千上万个客户端,而且这些基础数据也经常在有变化调整.这时候需要有一个稳定的数据同步程序,能分批同步基础数据,由于网络流量,网络的稳定性等因素,需要 ...
- visual studio 2015中的webapi生成helpPage,页面不显示方法说明问题解决
环境: vs2015.win7 参考:http://www.cnblogs.com/Erik_Xu/p/5638381.html 生成的help页面如下:,并没有显示控制器和方法. 原因是:新建项目时 ...
- 为什么 Java 8 中不再需要 StringBuilder 拼接字符串
为什么 Java 8 中不再需要 StringBuilder 拼接字符串 来源:codeceo 发布时间:2016-12-27 阅读次数:427 0 在Java开发者中,字符串的拼接占用资源高往往 ...