本节书摘来自异步社区《Python和Pygame游戏开发指南》一书中的第2章,第2.4节,作者[美]Al Sweigart(斯维加特), 李强 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.4 游戏循环和游戏状态
第7行是一个while循环,它有一个直接为True值的条件。这意味着它不会因为该条件求得False而退出。程序执行退出的唯一方式是执行一条break语句(该语句将执行移动到循环之后的第一行代码)或者sys.exit()(它会终止程序)。如果像这样的一个循环位于一个函数中,一条return语句也可以使得执行退出循环(同时退出函数的执行)。
本书中的游戏,其中都带有这样的一些while True循环,并且带有一条将该循环称为“main game loop”的注释。游戏循环(game loop,也叫作主循环,main loop)中的代码做如下3件事情。
1.处理事件。
2.更新游戏状态。
3.在屏幕上绘制游戏状态。
游戏状态(game state)只不过是针对游戏程序中用到的所有变量的一组值的一种叫法。在很多游戏中,游戏状态包括了记录玩家的生命值和位置、敌人的生命值和位置、在游戏板做出了什么标记、分数值或者轮到谁在玩等信息的变量的值。任何时候,如玩家受到伤害(这会减少其生命值),敌人移动到某个地方,或者游戏世界中发生某些事情的时候,我们就说,游戏的状态发生了变化。
如果你已经玩过那种允许你存盘的游戏,“保存状态(save state)”就是你在某个时刻所存储的游戏状态。在大多数游戏中,暂停游戏将会阻止游戏状态发生变化。
由于游戏状态通常是作为对事件的响应而更新(例如,点击鼠标或者按下键盘),或者是随着时间的流逝而更新,游戏循环在一秒钟之内会不断地、多次检查和重复检查是否发生了任何新的事件。在主循环中,就有用来查看创建了哪个事件的代码(使用Pygame,这通过调用pygame.event.get()函数来做到)。在主循环中,还有根据创建了哪个事件而更新游戏状态的代码。这通常叫作事件处理(event handling),如图2-3所示。