在学习了如何显示坦克精灵后,我们将《从零开始学Python游戏编程33-指令模式2》中通过指令模式实现的“矩形移动”游戏改为“坦克移动”,即通过键盘控制坦克的移动。“坦克移动”游戏的效果如图1所示。
图1 “坦克移动”游戏的效果
1 “坦克移动”游戏原理
在“矩形移动”的游戏中,使用具体的数值来设置矩形的左上角坐标,以便确定矩形的位置。而在“坦克移动”的游戏中,我们将游戏窗口分为10行16列,共10×16=160个空格,就像棋盘一样,而坦克精灵只能在这些空格中显示,通过空格所在的行数和列数来确定坦克精灵的左上角横纵坐标,如图2所示。
图2 “坦克移动”游戏的原理
2 游戏状态类GameState
2.1 __init__()方法
在“矩形移动”的游戏中,表示游戏状态的GameState类包含的是矩形左上角的横纵坐标两个属性;而在“坦克移动”的游戏中,GameState类包含的是坦克所在空格的行列数以及整个游戏窗口包含的行列数,以上属性在__init__()方法中定义,代码如图3所示。
图3 GameState的__init__()方法
其中,第16行代码定义的worldSize表示游戏窗口包含的总行数和总列数;第17行代码tankPos表示坦克精灵所在空格的行数和列数。
注意1 列数用来计算横坐标,而行数用来计算纵坐标。因此,Vector2()的第一个参数表示横坐标,其值为列数,第二个参数表示纵坐标,其值为行数。
相关链接1 Vector2是pygame.math模块中的类,是Pygame中用于表示和处理二维向量的类,提供了丰富的数学运算和方法,非常适合游戏开发、物理模拟和图形处理中的向量计算。在本程序的起始位置处有from pygame.math import Vector2,因此可以在程序中直接使用Vector2,而不用写成pygame.math.Vector2。
2.2 update()方法
GameState的update()方法的作用是根据指令更新游戏数据,代码如图4所示。
图4 update()方法的代码
update()方法的参数moveTankCommand是移动坦克的指令,该指令的类型也是Vector2,表示坦克精灵在水平方向和垂直方向移动的空格数量。第20行代码将坦克精灵的位置按照moveTankCommand的指令进行移动。第22-25行代码判断坦克精灵在水平方向是否移动出了游戏窗口范围,第22-23行代码判断是否水平向左移动出范围,如果是,则将坦克精灵的位置设置为最左侧(第1列),第24-25行代码判断是否水平向右移动出范围,如果是,则将坦克精灵的位置设置为最右侧(第15列);第27-30行代码判断坦克精灵在垂直方向是否移动出了游戏窗口范围,第27-28行代码判断是否垂直向上移动出范围,如果是,则将坦克精灵的位置设置为最上方(第1行),第29-30行代码判断是否垂直向下移动出范围,如果是,则将坦克精灵的位置设置为最下方(第10行)。
注意2 游戏窗口中行数和列数都是从0开始,即第1行的行数是0,第1列的行数也是0。