A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© enzyme 初级黑马   /  2019-3-31 23:45  /  1528 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

比较弱智,请各位大神勿喷
思路:flappy bird的游戏过程非常简单:
1.        小鸟会自动往前飞行,在往前飞行的过程中,自身会往下以一定速度下坠(实际游戏可能是有加速度,我暂时以固定速度)
2.        飞行过程中的管道随机从图片上下方生成,同时生成的管道必须给小鸟留有一定的空间飞过去。
3.        每次点击或键盘敲击都会使小鸟往上飞行一段距离,持续按键盘不会使小鸟一直往上飞
4.        小鸟碰到管道或者碰到屏幕边缘游戏会结束。

步骤:
实现过程和创建飞机大战过程十分类似,而且比飞机大战还要简单。
1.        与飞机大战类似,我先创建了两个文件一个游戏运行的主文件flappy_bird_main.py和一个用来创建类的工具类文件flappy_bird_sprite.py
2.        Flappy_bird_main.py文件需要完成的内容:
a)        完成游戏主页面的绘制,创建游戏时钟来保证每秒运行60帧
b)        创建游戏对象:
i.        创建游戏中所有的精灵对象:游戏背景(需要两张来保证小鸟运动过程背景的连续性)
ii.        创建管道,我比较笨,为了在背景图像上生成上下部分两个管道,所以就创建了上管道对象,和下管道对象。同时他们生成的时间要保持一致,要有时间间隔
iii.        创建小鸟。
c)        开始游戏的函数:
i.        设置游戏刷新率
ii.        监听事件:(键盘事件,鼠标事件,内置事件)
iii.        碰撞检测:小鸟与管道的碰撞检测(偷懒,没有做屏幕边缘的碰撞检测,不过这个应该不用调用pygame的collide方法,只要判断坐标是否超出即可,超出后直接调用__game_over(),结束游戏
iv.        更新绘制精灵组:每次事件后,都要调用下update,把变更后的图像绘制到屏幕上,所以在调用draw方法的时候不要忘记update传入screen对象哦
v.        更新显示:使用pygame的display.update使更新完的精灵组显示到屏幕上
3.        在设计好主函数后,我们开始写具体的实施过程
a)        我们打开flappy_bird_sprite.py文件,先写一个父类GameSprite。为什么要写这个类呢?是因为写完这个类,在写后面的类的时候可以省很多代码,因为我们之后创建的background类,tubetop类,tubebottom类都有共同的初始化内容,这样可以使我们的代码更加简洁。
b)        我们把需要初始化的东西抽象出来。思考一下,有什么呢?第一,是不是应该把我们准备好的背景素材都传入进去;第二,我们在判断小鸟,图片和管道的时候是不是要知道图片的大小才能判断边缘与位置,所以pygame给我们提供了很好的一个方法get_rect()得到图像的位置和边长;第三,游戏中的大部分元素都在运动,所以我们设置一个speed属性,同时默认一个值。这里我们思考一下,我们在玩flappybird的时候,小鸟实际上是不运动的,运动的是背景以及管道。而管道和背景都是相对于小鸟向左运动,而屏幕的坐上角定点是(0,0)所以背景和管道的运动速度应该是负值,小鸟的绝对运动是向下的,而y轴这边与数学坐标系恰恰相反,往下y轴的值是增加的。管道和背景的运动速度是一致的,所以这边默认给了一个-1,小鸟的运动速度到时候重写即可.
c)        接下来,我们需要创建游戏中不同元素的类。
i.        创建background类,与飞机大战一样,要产生运动的效果,至少需要两个背景对象。第二个对象要隐藏在屏幕的右侧,所以需要一个参数来判断是不是第二个对象
ii.        如果是第二个对象,则需要隐藏到屏幕右侧,也就是SCREEN_RECT.width
iii.        要判断如果背景图像运动到屏幕左侧以后,这张图像应该立即回到屏幕右侧,才能体现出源源不断的运动效果,所以要加一个判断:
If self.rect.x < -SCREEN_RECT.width:
        self.rect.x = SCREEN_RECT.width
iv.        创建TubeTop类,完成上部分管道的创建,这边需要注意的是,管道的高度是随机的,所以这边需要引入random包,而且素材在找的时候一定要超出屏幕中线,但是不能高于屏幕
v.        创建TubeBottom类,完成下部分管道的创建。这边需要思考下,如果需要小鸟飞过管道,必须保证上管道与下管道之间的距离大于小鸟本身的高度。所以在main文件中创建完一个tube_top对象,需要把tube_top的对象传入到tube_bottom的实例中,来获取到上管道的高度,从而保证两个管道之间距离。(这个距离可以是随机的哦,不然固定就不好玩了)
vi.        创建小鸟类,小鸟在初始化的时候需要在屏幕中间,pygame给我们提供了很好的方法,centerx,centery。其次update方法需要重写,因为小鸟的运动速度是正的。
4.        创建好游戏需要的所有类后,我们来回到主文件,来创建出实际的对象。完成游戏的最后收尾工作。
a)        创建对象:
i.        创建两个背景对象和对象精灵组,其中一个is_alt要设置为true
ii.        创建上管道对象和下管道对象精灵组,具体管道对象创建需要在pygame事件触发时
iii.        创建小鸟对象以及精灵组
b)        监听事件:
i.        判断游戏退出事件,pygame.QUIT
ii.        生成管道的系统事件,每次触发事件,生成管道对象,并且把管道对象放入管道精灵组中
iii.        设置键盘事件,来让小鸟往上飞。(我这边设置的是空格)
c)        检测碰撞,到了最激动人心的环节:
i.        要检测小鸟与管道的碰撞,使用pygame.sprite.groupcollide方法,但是这个方法在使用的时候,碰撞后小鸟还存在,无法达到我们的需求
ii.        要使小鸟碰撞游戏结束,我们需要调用pygame.spritecollide(self.bird,self.tube_group,True),如果碰撞后,该方法会返回一个列表,否则返回空列表
iii.        判断列表长度,如果长度大于0,说明产生了碰撞,此时调用self.kill()和game_over()
d)        重新绘制精灵:调用update方法将精灵组更新,同时调用draw方法完成绘制。

好了,大概的flappybird已经完成啦,大家可以试试看。源代码可以找我要。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马