cSparrowApp类以及IO事件处理

2024-06-21 11:38
文章标签 事件处理 io csparrowapp

本文主要是介绍cSparrowApp类以及IO事件处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、cSparrowApp类的设计

cSparrowApp类是所有SPE应用程序的抽象基类,应用程序继承它之后可以重写它感兴趣的虚函数。cSparrowApp类定义了下面这些虚函数,

virtual void OnInit(){}
virtual void OnExit(){}
virtual bool OnKeyDown(Key key){return false;}
virtual bool OnMouse(MouseState mstate,int x,int y) {return false;}
virtual bool OnMouseMove(MouseState mstate,int x,int y){return false;}
virtual void OnResize(int width,int height){}
virtual void OnFrameMove(float appTime,float elapsedTime){};
virtual void OnFrameRender() = 0;

里面除了惟一的一个纯虚函数OnFrameRender()必须重新实现外,其他都可以有选择地实现。

应用程序端的所有初始化操作可以放到OnInit()中,所有的收尾操作如释放资源等可以放到OnExit()中,它们分别会在窗口创建以及窗口销毁时被调用一次。

应用程序可以通过上面第3、4和5个函数来处理键盘和鼠标事件,当某个键被按下时,OnKeyDown()会被调用,当鼠标被按下或放开时OnMouse()会被调用,当鼠标滚轮滚动或按住某个键移动时,OnMouseMove()会被调用;其中Key,MouseState是引擎定义的枚举类型,应用程序可以通过它们获得具体的事件信息。这三个函数都返回一个布尔类型的变量,用来指示应用程序是否处理了该事件。

应用程序端的逻辑控制以及计算如物理运算可以放到OnFrameMove()函数当中,它有两个参数,appTime表示自应用程序启动至现在经历的时间,elapsedTime表示自上一帧开始经历的时间,都以毫秒为单位,OnFrameMove会在OnFrameRender()调用之前被调用一次。

几何信息的绘制,以及一些渲染效果的实现可以放到OnFrameRender()中。

OnResize()在窗口大小被改变时会被调用,在函数中可以更新投影矩阵或控件的大小位置等。

一个完整的应用程序框架代码看起来像下面这样子:

class cMyApplication : public cSparrowApp
{
public:cMyApplication(int argc,char *argv[]) : cSparrowApp(argc,argv){}void OnInit(){// init code here}void OnExit(){// uninit code here}bool OnKeyDown(Key key){if (key == KEY_0){// key handling codereturn true;}return false;}bool OnMouse(MouseState mstate,int x,int y) {if (mstate == MOUSE_LEFT_UP){// handle left mouse upreturn true;}return false;}bool OnMouseMove(MouseState mstate,int x,int y){if (mstate == MOUSE_ROLL_FORWARD){// handle mouse rolling forwardreturn true;}return false;}void OnResize(int width,int height){// handling window resizing}void OnFrameMove(float appTime,float elapsedTime){// computing&updating code here}void OnFrameRender(){// rendering code here}
};int main(int argc, char* argv[])
{cMyApplication app(argc,argv);cSparrowApp::GetAppRef().CreateRenderWindow("SparrowEngine Demo",0,0,600,600);cSparrowApp::GetAppRef().Run();return 0;
}

2、查询键盘状态

为了考虑效率,当一个键被一直按着时,键被按下事件不会频繁产生,也就是OnKeyDown()并不会被重复调用;但有的时候需要查询某个键是否处于按下状态,如第一人称摄像机用键盘控制的时候就需要,为此,SPE提供了一个KeyHandler类,里面有一个IsKeyDown()函数可用于查询某个常规键是否处于按下状态,若要查询控制键(如Ctrl,Shift,Alt)的状态可以使用IsCtrlActive(),IsShiftActive()以及IsAltActive()这三个函数;这几个函数原型为:

static bool IsCtrlActive()
static bool IsAltActive()
static bool IsShiftActive()static bool IsKeyDown(Key key)

它们都是KeyHandler类中的静态函数。

 

这篇关于cSparrowApp类以及IO事件处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081124

相关文章

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

springboot体会BIO(阻塞式IO)

使用springboot体会阻塞式IO 大致的思路为: 创建一个socket服务端,监听socket通道,并打印出socket通道中的内容。 创建两个socket客户端,向socket服务端写入消息。 1.创建服务端 public class RedisServer {public static void main(String[] args) throws IOException {

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

android java.io.IOException: open failed: ENOENT (No such file or directory)-api23+权限受权

问题描述 在安卓上,清单明明已经受权了读写文件权限,但偏偏就是创建不了目录和文件 调用mkdirs()总是返回false. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_E

JavaEE-文件操作与IO

目录 1,两种路径 二,两种文件 三,文件的操作/File类: 1)文件系统操作 File类 2)文件内容操作(读文件,写文件) (1)打开文件 (2)关闭文件 (3)读文件/InputStream (4)写文件/OutputStream (5)读文件/reader (6)写文件/writer (7)Scanner 四,练习: 1,两种路径 1)绝对路径

Python---文件IO流及对象序列化

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 前文模块中提到加密模块,本文将终点介绍加密模块和文件流。 一、文件流和IO流概述         在Python中,IO流是用于输入和输出数据的通道。它可以用于读取输入数据或将数据写入输出目标。IO流可以是标准输入/输出流(stdin和stdout),也可以是文件流,网络流等。

标准IO与系统IO

概念区别 标准IO:(libc提供) fopen fread fwrite 系统IO:(linux系统提供) open read write 操作效率 因为内存与磁盘的执行效率不同 系统IO: 把数据从内存直接写到磁盘上 标准IO: 数据写到缓存,再刷写到磁盘上

linux基础IO——动静态库——进程编址、进程执行、动态库加载

前言:本节内容为基础IO部分的最后一节, 主要是为了讲一下动静态库里面的动态库如何加载到内存, 动态库的地址等等。 但是,这些内容牵扯到了程序的编址, 程序的加载, 进程的执行等等知识点, 所以,我们会从程序的编址讲起, 一直到进程的执行, 以及动态库加载结束。         ps:本节内容涉及到了进程地址空间, 磁盘的内容, 建议友友们了解相关知识后再来观看。 目录

mybatis错误——java.io.IOException Could not find resource comxxxxxxMapper.xml

在学习Mybatis的时候,参考网上的教程进行简单demo的搭建,配置的没有问题,然后出现了下面的错误! Exception in thread "main" java.lang.RuntimeException: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause:

day09-IO-字符流其它流

一、字符流 字符流(只能做文本文件的处理)字符输入流 Reader--FileReader字符输出流 Writer--FileWriter​使用文件字符输入流的好处:读取中文不会出现乱码问题 1.1 字符输入流 构造器说明public FileReader (File file)创建字符输入流管道与源文件接通public FileReader(String pathname)创建字