3.5 创建输入管理器
你已经掌握了键盘和鼠标输入,现在让我们把他们结合起来创建一个输入管理器吧。但首先我们要指出前面代码中的一些缺陷,你需要在输入管理器中改善它们。
有件事你可能已经注意到了,前面的例子里用的都是同步方法。另外所有的事件都是通过AWT事件调度线程来发送的,它不同于主线程。很显然,你不希望在绘制操作的过程中改变游戏的状态(例如改变精灵的位置),所以方法同步后就可以避免这种情况。
然而为了将来的游戏考虑,你需要在游戏循环的特定环节处理所有的输入。当按键被按下时,你可以通过很简单地设置布尔值来完成,例如,当空格键被按下的时候,可以在keyPressed()方法中设置布尔值jumpIsPressed,在后续的游戏循环中你可以检查jumpIsPressed变量是否被设置,如果被设置了,则编写代码让主角跳跃。
另外,有一些行为,如跳跃,你只希望只在键被按下时响应;另一些行为,如移动,你希望按键可以被持续响应。对于跳跃,如果你只希望只在键被按下时响应,那么当你看到游戏循环中jumpIsPressed为真时就把它设成假。这样,只要玩家不再一次按键,主角就不会再次跳跃。
但如果用户不想按空格键来跳跃而希望用Ctrl键呢?很简单,在现在的情况下,你只要跟他说:“不好意思,你只能按空格键。”
OK,你可能很好心,想让用户可以自定义键盘。为了达到这个目的,你需要为一个键映射一个通用行为,在运行中让行为映射到不同的键。现在,让我们把希望InputManager类做的事情列出来。
下面是你希望InputManager做的所有事情:
? 处理所有的按键和鼠标事件,包括相对移动。
......
>> 阅读全文