网上有很多人说过此类问题,可我总觉得有些说法不太合适。于是就自己试验了一下。
下面是笔记:
1. 只有缓冲IO才能用于KeyListener/MouseListener,
也就是Keyboard::setEventCallback()设置的监听器。
2. 因为缓冲IO时,检测的是按键状态,所以就有按下和释放两个事件。
3. 把IO事件和帧渲染分开,利于管理,但是容易造成冗余。
可以把MyListenerData设成须共享数据的监听器(如Frame|Key|MouseListener)的友元,在MyListenerData里封装属性。
4.实现类:
MyListenerData: 跟控制属性相关的数据(注意这是控制信息,并非实体信息)
MyKeyListener: 跟按键控制相关的操作
MyMouseListener: 跟鼠标控制相关的操作
MyFrameListener: 跟每一帧渲染相关的操作
如果把键盘设为非缓冲,那么Keyboard::setEventCallback()设置的监听器就不灵了。同样的,如果把鼠标设置为非缓冲,那么鼠标的回调函数也会失灵。这样只能在真渲染中进行相关控制操作,这易导致类的设计不够清晰。
因为键鼠监听器总是检测按键状态,所以在移动、旋转等过程变化以及按键切换等瞬时变化上和非缓冲及帧渲染事件处理上有所不同。所以,才导致键鼠监听器总是有按下和释放两个事件处理,这就是为了改变状态。而不像frame事件中那样只考虑按键是否按下就可以了。正因为此,才有了frameStated/frameRenderingQueued/frameEnded这三中不同的时间态去做处理。比如,一个变量要在鼠标移动时为1,否则为0,就可以再mouseMoved中设置1,frameRendingQueued中做处理,到frameEnded中设置为0,因为不知道下一帧鼠标是不是还在移动啊。