@Pygame 坦克大战 Python坦克大战效果预览图.mkv 首先确定游戏中所需要出现的类:Tank(My_tank.Enemy_Tank),Missile,wall。同时考虑到炮弹击中坦克时会发生爆炸,而爆炸的实质是依次显示不断放大的爆炸形状的图片,所以将爆炸也设置为一个类explode。同时考虑到所有的类都具有共同的属性,如:都是图片,都具有将图片显示在屏幕的方法等。所以设置一个所有类的父类Base_item, 故而整体游戏的结构框架如下: 此功能将创建一个显示Surface。传入的参数是对显示类型的请求。实际创建的显示将是系统支持的最佳匹配。 类定义了 问题原因:随着空格键的按下,单独生成子弹对象,使得子弹删除出现问题 问题原因: 问题原因1.坦克图片的尺寸不一 问题原因:一开始使用列表创建敌方坦克,列表的append()函数只能在末尾添加成员,无法做到随机生成或者说不是真正的随机坦克
此为2019年西电Python课程大作业,大一课程,仅实现部分简单内容
运行效果 百度云提取码: abcd
原码和素材包 https://download.csdn.net/download/weixin_43872532/12496334
一, 游戏架构设计
二, 在此程序中主要使用的pygame函数
display
:控制pygame显示
pygame.display.set_caption(title)
:设置当前窗口标题;
如果显示器有窗口标题,则此功能将更改窗口上的名称。某些系统支持用于最小化显示的备用较短标题。
pygame.display.set_mode
:初始化屏幕及窗口;set_mode(resolution =(0,0),flags = 0,depth = 0)
resolution
参数是一对表示宽度和高度的数字。flags参数是其他选项的集合。depth参数表示用于颜色的位数。 # Open a window on the screen screen_width=700 screen_height=400 screen=pygame.display.set_mode([screen_width,screen_height])
pygame.display.update
:更新屏幕的部分以显示软件;sprite(精灵组)
:sprite类旨在用作游戏中不同类型对象的基类;
还有一个基本的Group
类,它只存储sprite
。游戏可以创建新类型的Group
类,这些类在它们包含的特殊定制的sprite
实例上运行。
基本的sprite类可以将它包含的sprite绘制到surface。
什么是精灵?
精灵可以认为成是一个个小图片,一种可以在屏幕上移动的图形对象,并且可以与其他图形对象交互。精灵图像可以是使用pygame
绘制函数绘制的图像,也可以是原来就有的图像文件。
编写自己的精灵类,self.image
可以是一个矩形,也可以是一个文件(图片、字符串等)。其中的MoveBall
添加了动画的功能,用Sprite类来做动画效果是比较方便的。
pygame.sprite.Group()
:用于保存和管理多个Sprite对象的容器类。
pygame.sprite.spritecollide
:如果精灵与组中的任何内容相交,则进行简单测试;
spritecollideany(sprite,group,collided = None)
Sprite与返回的精灵碰撞
spritecollideany(sprite,group,collided = None)
无冲突
如果精灵与组中的任何一个精灵发生碰撞,则返回该组中的一个精灵。无冲突时返回无。碰撞参数是一个回调函数,用于计算两个精灵是否发生碰撞。它应该将两个精灵作为值并返回一个bool值,指示它们是否发生碰撞。如果未传递碰撞,则所有精灵必须具有“rect”值,该值是精灵区域的矩形,将用于计算碰撞。__init__
:类有一个名为 __init__()
的特殊方法(构造方法),该方法在类实例化时会自动调用,像下面这样:def __init__(self): self.data = []
__init__()
方法,类的实例化操作会自动调用 __init__()
方法。三, 主要函数
1. 坦克移动方法move()
2. 碰撞检测 stay()与hit()
Move()
函数的核心是对敌方我方坦克坐标的实时监测与计算,同时记录下先前坐标。每个移动的物体都需要选取一个基准点,方便起见以它任意状态下的左上角代表该物体当前的位置,这也是物理上的用质点代表物体的思想。我们以屏幕左上方为坐标原点,距离屏幕左侧的距离命名为“left”,距离屏幕上方的距离叫做“top”,这两个数值均为非负数,即坦克与炮弹均不能移动到屏幕外侧。在规定了屏幕的尺寸后,即可建立相应的第一象限内的坐标系,让所有物体在规定区域内运动。
移动方式的实现。首先是基础的移动,既应用与我方坦克的玩家操控下的移动,也是敌方坦克在程序操控下的移动的基础。以一次移动为基准,每次收到移动命令后向着一个方向移动6个像素。主函数的帧速率为20FPS,在一帧的时长内,移动命令可以执行一次,那么坦克的移动速度为120像素每秒。按下不同的方向键时,将改变坦克的移动方向,即top和left的计算方式。敌方坦克在生成后将进行随机移动,我们设置的机制为:每沿着同一个方向执行6次移动命令后,随机转换方向,再次定向移动,循环往复,完成运动。
Hit()
函数的实现,hit()用于判断游戏中的物体是否发生了碰撞。具体检测机制为:通过pygame.sprite.collide_rect()函数,进行对象之间的边缘检测,若发现两个对象的边缘发生了重叠或者恰好接触,及时调用stay()函数获得先前二者位置,修改它们的坐标值,从而使发生碰撞的对象返回先前不会发生碰撞的状态。
Stay()
函数。这个函数的功能为记录记录前一步(front step)的位置,即缓存周期为一帧,单个对象缓存量为它的一组坐标。四, 试运行与Debug
1. 子弹打到屏幕边缘无法消失或打中坦克无法消失
解决方法:把子弹用列表的形式表示出来,用delete
的方法,随着屏幕刷新使子弹打到屏幕或者坦克消失。2. 字体无法正常显示
pygame.font.SysFont()
的第一个参数没有使用普遍的字体库
解决方案:使用“simsunnsimsun”
字体3. 坦克图片无法正常加载
2.load()
函数需要图片的绝对路径,而每个人文件路径不同导致此函数无法正常加载
解决方法1:修改图片分辨率统一为136*107
解决方法2:图片跟代码放在同一个文件夹下,可以避免使用绝对路径,接着用screen.blit()
函数将图片对象渲染到窗口上4. 敌方坦克无法随机创建
解决方案:使用pygame的精灵组概念,用族群来创建敌方坦克。当程序中有大量的实体的时候,操作这些实体将会是一件相当麻烦的事
pygame使用精灵组来管理精灵的绘制和更新,精灵组是一个简单的容器。使用pygame.sprite.Group()
函数可以创建一个精灵组:group = pygame.sprite.Group() group.add(sprite_one)
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算