使用pygame编写Flappy bird小游戏


Posted in Python onMarch 14, 2020

0. 最终效果:

使用pygame编写Flappy bird小游戏 

1. 搭建一个最小框架

1.1 需要的函数

初始化所有导入的pygame模块。

pygame.init()

生成一个窗口。返回的是一个surface对象。通过resolution设置窗口大小,flags代表扩展选项,depth代表设置颜色,但不建议设置。

pygame.display.set_mode((resolution =(0,0),flags = 0,depth = 0))

设置窗口标题。

pygame.display.set_caption("Flappy bird_Lin")

检测事件。

pygame.event.get()

更新显示。

pygame.display.update()

结束程序。

pygame.quit()
sys.exit()

1.2 搭建框架

首先,导入需要的库。

import sys
import pygame
from pygame.locals import *

其次,进行模块初始化并设置。

pygame.init()
screen = pygame.display.set_mode((288,512))
pygame.display.set_caption("Flappy bird_Lin")

最后,获取事件并响应。

#在本例中,唯一需要检测的事件就是是否退出
while True:
 for event in pygame.event.get():
 if event.type == pygame.QUIT:
 pygame.quit()
 sys.exit()
 pygame.display.update() #刷新屏幕

1.3 完整框架

import sys
import pygame
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((288,512))
pygame.display.set_caption("Flappy bird_Lin")

#在本例中,唯一需要检测的事件就是是否退出
while True:
 for event in pygame.event.get():
 if event.type == pygame.QUIT:
 pygame.quit()
 sys.exit()
 pygame.display.update() #更新屏幕

2. 添加图片元素

2.2 实现效果

使用pygame编写Flappy bird小游戏 

2.1 需要的函数
从文件中加载新文件。返回一个Surface

pygame.image.load('图片路径')

在窗口上添加图片。source:第一步返回的Surface;dest:指定绘制位置。

screen.blit(source,dest)

更新屏幕

pygame.display.update() #更新屏幕

2.2 添加到框架

因为我要实现的是Flappy_bird,所以我将Flappy_bird开始界面的图像元素添加到框架。

background_image = 'K:/bird/background-night.png'
green = 'K:/bird/base.png'
mid_b = 'K:/bird/bluebird-midflap.png'
welcome = 'K:/bird/message.png'

import pygame
from pygame.locals import *
import sys

pygame.init()
screen = pygame.display.set_mode((288,512))
pygame.display.set_caption("Flappy bird_Lin")

background = pygame.image.load(background_image)
green_base = pygame.image.load(green)
mid_bird = pygame.image.load(mid_b)
welcome1 = pygame.image.load(welcome)

while True:
 for event in pygame.event.get():
 if event.type == QUIT:
 pygame.quit()
 sys.exit()
 screen.blit(background,(0,0))
 screen.blit(green_base,(0,400))
 screen.blit(mid_bird,(52,225))
 screen.blit(welcome1,(52,52))
 pygame.display.update()

3. 实现小鸟飞行效果

让图片动起来其实很容易,只需要有规律的改变图片的位置坐标。但这种方式会导致在不同情况下,图片的移动速度不一样(程序的运行速度变化了)。因此,我们使用另一种方法解决这个问题。

为了保证在相同时间里小鸟运动的距离相同,我们引入了Clock对象,用来计算每一帧经过的时间,速度*时间=距离,所以我们只需要设定一个不变的速度值,就可以保证图片在任何情况下运动速度均相同。

3.0 实现效果

使用pygame编写Flappy bird小游戏 

3.1 需要的函数

初始化Clock对象。

pygame.time.Clock()

更新时钟,计算自上次调用以来经过了多少毫秒。

clock.tick()

3.2 思路实现
首先需要在进入循环之前,初始化Clock对象并设定一个速度值。然后在循环中每一帧都记录一次运行时间。最后将运行时间乘以速度值,就得到了本次应该运行的距离。

#进入循环之前
clock = pygame.time.Clock()
speed = 100

#进入循环
 time_passed = clock.tick()
 time_passed_ms = time_passed/1000 #毫秒转换为秒
 distance = speed*time_passed_ms
 x += distance #图片的坐标位置
 
 if x >lim:
 x -= lim #清0,为了减少运行时间不直接归零

3.3 添加到框架

background_image = 'K:/bird/background-night.png'
green = 'K:/bird/base.png'
mid_b = 'K:/bird/bluebird-midflap.png'
welcome = 'K:/bird/message.png'

import pygame
from pygame.locals import *
import sys

pygame.init()
screen = pygame.display.set_mode((288,512))
pygame.display.set_caption("Flappy bird_Lin")

background = pygame.image.load(background_image)#.convert()
green_base = pygame.image.load(green)
mid_bird = pygame.image.load(mid_b)
welcome1 = pygame.image.load(welcome)

base_x = 0
bird_y = 225
speed = 100
clock = pygame.time.Clock()

while True:
 for event in pygame.event.get():
 if event.type == QUIT:
 pygame.quit()
 sys.exit()
 screen.blit(background,(0,0))
 screen.blit(green_base,(base_x,400))
 screen.blit(mid_bird,(52,bird_y))
 screen.blit(welcome1,(52,52))

 time_passed = clock.tick()
 time_passed_seconds = time_passed / 1000.0
 
 distance_moved = time_passed_seconds * speed
 base_x -= distance_moved
 if base_x<-40:
 base_x += 40
 
 pygame.display.update()

4. 实现小鸟煽动翅膀效果

实现小鸟飞行效果一共需要两步,首先是需要让小鸟上下移动,其次是切换图片以实现扇动翅膀的效果。

4.1 小鸟上下移动
这一步实现很简单,方法和上面的一致。不再赘述,直接上代码了。

#进入循环前
base_y = 225
bird_speed = 50
#进入循环
 time_passed_seconds = time_passed / 1000.0 
 bird_distance = time_passed_seconds * bird_speed 
 base_y = base_y + dir*bird_distance
 if base_y >240:
 dir = -1
 if base_y <210:
 dir = 1

添加到框架的步骤也不再赘述了,与前面一致。

4.2 小鸟扇动翅膀
实现小鸟扇动翅膀的效果只需要每隔几帧切换一次图像。但同样容易随着机器性能等原因,出现时快时慢的现象,为了解决这个问题,可以采用与绿砖运动相似的方法,基于时间的图像切换。

#在进入循环前的部分需要添加切换速度和计数值
change_speed = 500
count = 0
#进入循环后
 #需要根据运行时间,决定计数增大的幅度(变化的快慢)
 count +=change_speed*time_passed_seconds
 if 0<=(count)<=50:
 screen.blit(mid_bird,(52,base_y))
 
 elif 50<(count)<=100:
 screen.blit(up_bird,(52,base_y))
 
 elif 100<(count)<=150:
 screen.blit(down_bird,(52,base_y))
 #当计数值过大时,归零,以减少运行时间
 if count>140:
 count -= 140

到此这篇关于使用pygame编写Flappy bird小游戏的文章就介绍到这了,更多相关pygame Flappy bird小游戏内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现删除列表中满足一定条件的元素示例
Jun 12 Python
浅谈Django REST Framework限速
Dec 12 Python
python创建列表和向列表添加元素的实现方法
Dec 25 Python
django中瀑布流写法实例代码
Oct 14 Python
Python基本类型的连接组合和互相转换方式(13种)
Dec 16 Python
关于Pytorch的MNIST数据集的预处理详解
Jan 10 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
Jun 23 Python
Python 操作 MySQL数据库
Sep 18 Python
Alpine安装Python3依赖出现的问题及解决方法
Dec 25 Python
Pandas之缺失数据的实现
Jan 06 Python
教你漂亮打印Pandas DataFrames和Series
May 29 Python
python基础入门之普通操作与函数(三)
Jun 13 Python
Python3.x+pyqtgraph实现数据可视化教程
Mar 14 #Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
Mar 14 #Python
Python实现鼠标自动在屏幕上随机移动功能
Mar 14 #Python
Python 读取WAV音频文件 画频谱的实例
Mar 14 #Python
Python2.7:使用Pyhook模块监听鼠标键盘事件-获取坐标实例
Mar 14 #Python
python matplotlib包图像配色方案分享
Mar 14 #Python
python 使用cx-freeze打包程序的实现
Mar 14 #Python
You might like
php自动给文章加关键词链接的函数代码
2012/11/29 PHP
PHP内核探索:变量概述
2014/01/30 PHP
微信JSSDK分享功能图文实例详解
2019/04/08 PHP
Laravel5.1 框架路由基础详解
2020/01/04 PHP
js 替换
2008/02/19 Javascript
关于jquery动态增减控件的一些想法和小插件
2010/08/01 Javascript
用nodejs访问ActiveX对象,以操作Access数据库为例。
2011/12/15 NodeJs
javascript重写alert方法的实例代码
2013/03/29 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
node+express+jade制作简单网站指南
2014/11/26 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
vue项目中添加单元测试的方法
2018/07/21 Javascript
webpack打包html里面img后src为“[object Module]”问题
2019/12/22 Javascript
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
python3读取MySQL-Front的MYSQL密码
2017/05/03 Python
15行Python代码实现网易云热门歌单实例教程
2019/03/10 Python
python采集百度搜索结果带有特定URL的链接代码实例
2019/08/30 Python
Python实现名片管理系统
2020/02/14 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
2020/04/27 Python
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
Django启动时找不到mysqlclient问题解决方案
2020/11/11 Python
css3实现可拖动的魔方3d效果
2019/05/07 HTML / CSS
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
写好自荐信的技巧
2013/11/08 职场文书
会计专业的自荐信
2013/12/12 职场文书
竞聘演讲稿范文
2014/01/12 职场文书
中国央视网签名寄语
2014/01/18 职场文书
留学推荐信怎么写
2014/01/25 职场文书
安全生产先进个人材料
2014/02/06 职场文书
经典团队口号
2014/06/06 职场文书
工作业绩不及格检讨书
2014/10/28 职场文书
写给纪委的违纪检讨书
2015/05/05 职场文书
2015年预算员工作总结
2015/05/14 职场文书
英语读书笔记
2015/07/02 职场文书
高三毕业感言
2015/07/30 职场文书
python基于tkinter实现gif录屏功能
2021/05/19 Python