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 ...
随机推荐
- mysql 导出select语句结果到excel文件等
一.导出数据外部 1)mysql连接+将查询结果输出到文件.在命令行中执行(windows的cmd命令行,mac的终端) mysql -hxx -uxx -pxx -e "query sta ...
- BI商务智能对于企业的意义
BI商务智能之所以越来越重要,是因为无知是现代企业的最大威胁.不知不觉的风险是巨大的,而一知半解可能比一无所知危害更大,因为我们会带着错误的念头做出决定和采取行动,同时还自鸣得意地认为自己是真理的化身 ...
- js parseInt和map函数
今天看了一个js的题目["1","2","3"].map(parseInt),看到后脑海中浮现的答案是[1,2,3],但是看到正确答案后蒙了 ...
- 【2016-10-28】【坚持学习】【Day15】【Oracle】【变量 定义 使用】
declare i integer ; j ; begin i :; dbms_output.put_line(j); end
- 我的CentOS 7 U盘安装之路 (Win 8.1 Profession + CentOS 7双系统)
这次为了学习Linux,尝试着安装了鸟哥书上推荐的CentOS这款Distribution,但是安装的是最新版CentOS 7,好像跟书上的差别有点大呢.安装的过程中走了一些弯路,做了一些尝试最后发现 ...
- POJ3368Frequent values[RMQ 游程编码]
Frequent values Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17581 Accepted: 6346 ...
- Hibernate 分组查询 子查询 原生SQL
分组查询: 使用group by关键字对数据分组,使用having关键字对分组数据设定约束条件,从而完成对数据分组和统计 1.1 聚合函数:常被用来实现数据统计功能 ① count() 统计记录条数 ...
- UITabBarController的创建与自定义TarBar---学习笔记三
代码如下: #import <UIKit/UIKit.h> @interface BSJTabBarViewController : UITabBarController @end #im ...
- c# 调用c++DLL方法及注意事项
引用命名空间 using System.Runtime.InteropServices 调用方法: 一.静态加载 用DllImprot方式来加载c++DLL.如下格式: //对应c++方法 //voi ...
- Qt——浅谈样式表
优秀的程序,不仅要有严密逻辑,而且应该有美观的外表.从软件界面,便可看出你是否用心在做,是否是一个有思想的人. Qt样式表的术语和语法规则和HTML CSS有很多相似之处. 样式规则 Qt中样式规则由 ...