TimothyQiu's Blog

keep it simple stupid

游戏按键处理?

分类:技术

游戏中,主循环每一帧的一般流程概括起来是这样的:

处理输入 → 更新状态 → 绘制画面

「处理输入」就是获取键盘、鼠标、手柄等等输入设备的当前状态,然后根据这些输入设备的状态改变游戏中相应对象(不管是实体还是虚拟对象)的状态。

这里的处理按键和操作系统本身的按键消息不属于一个系统,有一个比较麻烦的就是键是可以一直按着的。假设游戏有甲乙两个画面,两个画面间可以通过按 Tab 键切换,如果在每个画面的处理输入时写:

input.tab = IsKeyDown(KEY_TAB); // input.tab 是布尔型变量

if (input.tab) {
    SwitchState();
}

那么如果你按着 Tab 键,游戏就会一直在两个画面间切换,which is not what we want(好吧,这个从句用中文说感觉不像中文,那就英文写好了)。

也就是说,事实上我们需要的是边沿触发而不是电平触发(这术语是模电还是数电的来着 = =),如果API只能取得指定键是否按下的话,有一种方法就是自己来:

if (IsKeyDown(KEY_TAB)) {
    input.tab++; // input.tab 是整型变量
} else {
    input.tab = 0;
}

if (input.tab == 1) {
    SwitchState();
}

这就是今天上网看到的一个比较顺眼的方法,虽然比较火星。以上。