OpenGL/Gtkmm 游戏 - 键盘移动
Posted
技术标签:
【中文标题】OpenGL/Gtkmm 游戏 - 键盘移动【英文标题】:OpenGL/Gtkmm game - keyboard moving 【发布时间】:2010-02-10 17:36:51 【问题描述】:我正在用“OpenGL”编写游戏并使用“Gtkmm”作为窗口管理器。我想使用键盘来移动相机(因此,“UP-key”向前移动,“DOWN-key”向后移动,等等......)
前段时间,当我用 Java 编程时,我使用了这种技术来“移动”: 例如,当应用程序收到“UP-key-press”信号时,它随后将标志“shouldMoveForward”设置为“true”,然后当它收到“UP-key-release”时”信号,它将标志设置回“false”。 并且“游戏循环”不断检查该标志,如果是真的,它会向前移动相机,否则它什么也不做。
所以我想在“Gtkmm”中使用相同的技术。所以我只是重写了我的 "Gtk::DrawingArea" 的这些函数:
bool Gtk::Widget::on_key_press_event(GdkEventKey* event)
bool Gtk::Widget::on_key_release_event(GdkEventKey* event)
但问题在于:例如,当我按下“UP”键并按住 5 秒时,会发出以下信号序列:
press ...<little time waiting>... release press release press release press release .......... press release press release
当我运行我的游戏“在 Linux 上”时会出现之前的情况。
当我“在 Windows 上” 时,它就是我想要的样子,因此:
press ...<little time waiting>... press press press press press .......... press press release
所以这似乎是在 Gtkmm 中移动相机的“非便携式”解决方案。
那么还有其他(“PORTABLE”)解决方案可以使用 Gtkmm 作为窗口管理器来实现相机移动吗?
【问题讨论】:
【参考方案1】:This thread 描述了问题(不是 GTK+ 本身),以及一些解决方法。
【讨论】:
【参考方案2】:我刚刚在我的 java 游戏中遇到了自动重复“功能”,我已经解决了。
既然您了解 java,那么移植以下代码应该不会有问题:
// Keyboard
private final List<Integer> keysPressed = new LinkedList<Integer>();
private final List<Integer> keysDown = new LinkedList<Integer>();
private final List<Integer> keysRemove = new LinkedList<Integer>();
public final void keyPressed(final KeyEvent e)
int key = e.getKeyCode();
// Fix AutoKeyRepeat under X11
if (keysRemove.contains(key))
keysRemove.remove(Integer.valueOf(key));
if (!keysDown.contains(key))
keysDown.add(key);
keysPressed.add(key);
e.consume();
public final void keyReleased(final KeyEvent e)
int key = e.getKeyCode();
keysRemove.add(key);
e.consume();
public final void clearKeys()
for (Integer key : keysRemove)
keysDown.remove(Integer.valueOf(key));
if (keysPressed.contains(key))
keysPressed.remove(Integer.valueOf(key));
keysRemove.clear();
keysPressed.clear();
方法 clearKeys 在游戏状态更新后在主循环中被调用(检查键盘输入/移动对象)这里的技巧是第一个 if in keyPressed。自动生成的键事件发生在完全相同的时间,因此在伪造的 keyReleased 和 keyPressed 事件之间几乎不可能发生某些事情。当 keyPressed 事件发生时,键可以在 keyRemove 列表中的唯一方法是它是一个假事件,所以在这种情况下,我们只需从 keyRemove 列表中删除该键。
当您正常释放键时,它不会紧随其后的 keyPressed 事件,因此它不会从列表中删除并由 clearKeys 处理。
对于其余代码(例如检查某个键是否按下或被按下),请查看源代码: http://github.com/BonsaiDen/Bonsai-Game-Library/blob/master/src/org/bonsai/dev/GameInput.java
【讨论】:
以上是关于OpenGL/Gtkmm 游戏 - 键盘移动的主要内容,如果未能解决你的问题,请参考以下文章