本篇记录的是坦克大战的项目实战。使用的图片,音乐等资源以及源代码记录在了阿伟同学 Github 仓库中,地址 https://github.com/AltriaChen/TankWar
一. 源代码
(A) main.py
1 | # Thanks to Zack |
(B) settings.py
1 | import os |
(C) sprites.py
1 | import time |
(D) tank_war.py
1 | import pygame |
二. 项目介绍
(A) 运行截图
我们主程序入口在 main.py 文件,在安装好 pygame 模块后就能直接运行。下面是运行截图:
(B) 项目文件
下面是项目目录:
resources
其中 resources 是资源文件。音频,图片等都在 resources 目录。main.py
main.py 是项目的主入口,代码很短:1
2
3
4
5from tank_war import TankWar
if __name__ == '__main__':
tankWar = TankWar()
tankWar.run_game()我们直接创建了 TankWar 的实例,然后调用 run_game( ) 方法运行游戏。
settings.py
settings.py 中定义了一些设置信息,包括子弹的数量,子弹的速度,坦克的速度,地图信息,图片信息等。我们可以通过修改 settings.py 来调整游戏的相关设置。sprites.py
在 pygame 中提供了一个 sprite 类用于创建有图像的物体。而 sprites 中定义的都是 sprite 的子类,因此也都是有图片的类。其中包括坦克基类,英雄类(我方坦克),敌人类(敌人坦克),子弹类,墙类等。
而各个类中定义了各自的行为,例如:坦克类有发射子弹的行为,移动的行为,爆炸的行为等。tank_war.py
tank_war.py 中写了我们坦克大战游戏主体的模块,里面的 TankWar 类定义了游戏主体的一切行为。包括初始化屏幕,初始化 pygame 模块,创建敌方坦克,绘制地图,检测碰撞,监听事件等。
三. Tips
(A) pygame.sprite.Sprite
- pygame.sprite.Sprite 是可见游戏对象的简单基类。有以下这些常用方法:
pygame.sprite.Sprite.update | 控制精灵行为的方法 |
---|---|
pygame.sprite.Sprite.add | 将精灵添加到组中 |
pygame.sprite.Sprite.remove | 从组中删除精灵 |
pygame.sprite.Sprite.kill | 从所有组中删除 Sprite |
pygame.sprite.Sprite.alive | 精灵属于任何组的检测 |
pygame.sprite.Sprite.groups | 包含此 Sprite 的组列表 |
- 可见游戏对象的基类。派生类将覆盖 Sprite.update( ) 并分配 Sprite.image 和 Sprite.rect 属性。初始值设定项可以接受要添加的任意数量的 Group 实例。
在对 Sprite 进行子类化时,请务必在 Sprite 添加到 Groups 之前调用基本初始值设定项。例如:
1 | class Block(pygame.sprite.Sprite): |
(B) pygame.sprite.Group
- pygame.sprite.Group 是用于保存和管理多个 Sprite 对象的容器类。有以下这些常用方法:
pygame.sprite.Group.sprites | 此组包含的 Sprite 列表 |
---|---|
pygame.sprite.Group.copy | 复制组 |
pygame.sprite.Group.add | 将 Sprite 添加到此组 |
pygame.sprite.Group.remove | 从组中删除 Sprite |
pygame.sprite.Group.has | 测试一个 Group 是否包含 Sprite |
pygame.sprite.Group.update | 在包含的 Sprite 上调用 update 方法 |
pygame.sprite.Group.draw | blit Sprite 的图像 |
pygame.sprite.Group.clear | 在 Sprites 上绘制背景 |
pygame.sprite.Group.empty | 删除所有 Sprite |
- Sprite 对象的简单容器。可以继承此类以创建具有更多特定行为的容器。构造函数将任意数量的 Sprite 参数添加到 Group 中。该组支持以下标准 Python 操作:
1 | in test if a Sprite is contained |
组中的 Sprite 不是有序的,因此绘制和迭代 Sprites 没有特别的顺序。
(C) super( ) 函数
(a) 概述
super( ) 函数用于调用父类(超类)的一个方法。
super( ) 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序 (MRO),重复调用(钻石继承)等种种问题。MRO 就是类的方法解析顺序表,其实也就是继承父类方法时的顺序表。
(b) 语法
以下是 super( ) 方法的语法:
1 | super(type[, object-or-type]) |
其中
1 | type -- 类 |
注,Python3.x 和 Python2.x 的一个区别是,Python3 可以使用 super().xxx
代替 super(Class,self).xxx
Python3.x 实例:
1 | class A: |
Python2.x 实例:
1 | class A(object): # Python2.x 记得继承object |
(c) 实例
1 | class FooParent(object): |
结果为
1 | Parent |
(D) staticmethod( ) 函数
(a) 概述
python staticmethod 返回函数的静态方法。
该方法不强制要求传递参数,如下声明一个静态方法:
1 | class C(object): |
以上实例声明了静态方法 f,从而可以不实例化调用该方法 C.f()
(b) 实例
1 | class C(object): |