从零开始学Python游戏编程36-精灵3

在学习了如何显示坦克精灵后,我们将《从零开始学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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值