写一个小游戏,训练一下自己的反应速度、耐心和毅力。
写游戏,不可避免要和键盘打交道。尤其这个游戏,始终要和方向键打交道。那么,怎样读取方向键呢?
你也许会说:“读取方向键还不简单?当用户按下‘上’键的时候,系统就会发送一个0和一个'H',读取到这两个字符,就表示‘上’被按下了。同样的,‘下’为{0, 'P'}。”
这样做固然没有错,但是有那么两个问题:
第一,如果用户按着“上”不放,系统将先发送一组{0, 'H'},停0.25秒,然后再快速地连续发送{0, 'H'}。表现在游戏上就是,按着“上”不放时,飞机先向上飞一格,然后停0.25,然后再继续向上飞。这会给玩家控制游戏带来极大的不便。
第二,如果玩家同时按下“上”和“左”,飞机将向他后按的那个键的方向飞(绝对同时是不可能的,总有先后之分)。换句话说,系统无法识别同时按下的两个键。然而在游戏中,不可避免要处理多个键同时按下的情况。即使是这个简单得不能再简单的小游戏。
为了解决这两个问题,我决定不采用系统提供的读取按键接口,而是直接接管键盘中断。当一个键被按下和被放开时,都将触发键盘中断。接管了中断后,我对键盘便有了至高无上的控制权。
然后,我设置若干个标志变量。当某一个键被按下时,我设置代表它的标志变量为true;当某一个键被放开时,我设置代表它的标志变量为false。这样,我只要检测一下标志变量,就能知道哪几个键被按下了。
为了防止编译器优化标志变量后破坏了它的标志作用,可以使用volatile关键字修饰标志变量。
解决了读取键盘问题后,其它问题都很容易了。使用了前期的FPlane坐标平面类后,处理飞行方向也成了一件十分容易的事,我就不多说了,好好玩吧!我目前的最好成绩是21.45秒,看看谁能打破这个纪录。
这是第二遍写这篇文章。第一次写了满满一屏,然后死机了。虽然我一个劲地求它:“让我存了盘再死吧!”可Windows就是不听。算了,我从头开始重写。