使用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实现文本文件合并
Dec 29 Python
Python如何为图片添加水印
Nov 25 Python
python 遍历字符串(含汉字)实例详解
Apr 04 Python
Python实现的单向循环链表功能示例
Nov 10 Python
Python实现的knn算法示例
Jun 14 Python
python之消除前缀重命名的方法
Oct 21 Python
python多项式拟合之np.polyfit 和 np.polyld详解
Feb 18 Python
容易被忽略的Python内置类型
Sep 03 Python
去除python中的字符串空格的简单方法
Dec 22 Python
pandas中DataFrame检测重复值的实现
May 26 Python
python开发人人对战的五子棋小游戏
May 02 Python
Python 绘制多因子柱状图
May 11 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 归并排序 数组交集
2011/05/10 PHP
PHP gbk环境下json_dencode传送来的汉字
2012/11/13 PHP
php实现四舍五入的方法小结
2015/03/03 PHP
详解WordPress中提醒安装插件以及隐藏插件的功能实现
2015/12/25 PHP
Yii框架批量插入数据扩展类的简单实现方法
2017/05/23 PHP
PHPTree――php快速生成无限级分类
2018/03/30 PHP
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
2009/04/07 Javascript
document.onreadystatechange事件的用法分析
2009/10/17 Javascript
Draggable Elements 元素拖拽功能实现代码
2011/03/30 Javascript
JQuery分屏指示器图片轮换效果实例
2015/05/21 Javascript
一起学写js Calender日历控件
2016/04/14 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
利用BootStrap的Carousel.js实现轮播图动画效果
2016/12/21 Javascript
使用bootstrap插件实现模态框效果
2017/05/10 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
2018/10/29 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
python基础教程之元组操作使用详解
2014/03/25 Python
python将ansible配置转为json格式实例代码
2017/05/15 Python
python一行sql太长折成多行并且有多个参数的方法
2018/07/19 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
2018/07/26 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
html5 web本地存储将取代我们的cookie
2012/12/26 HTML / CSS
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
合伙协议书范本
2014/04/21 职场文书
土木工程求职信
2014/05/29 职场文书
合作协议书模板2014
2014/09/26 职场文书
乱丢垃圾袋检讨书
2014/10/08 职场文书
五年级学生期末评语
2014/12/26 职场文书
2016春节家属慰问信
2015/03/25 职场文书
雨中的树观后感
2015/06/03 职场文书
小学感恩主题班会
2015/08/12 职场文书
思想品德课教学反思
2016/02/24 职场文书
小程序实现悬浮按钮的全过程记录
2021/10/16 HTML / CSS
windows安装 redis 6.2.6最新步骤详解
2022/04/26 Redis