使用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中用于去除空格的三个函数的使用小结
Apr 07 Python
简单介绍Python中的floor()方法
May 15 Python
Python OpenCV 直方图的计算与显示的方法示例
Feb 08 Python
python实现linux下抓包并存库功能
Jul 18 Python
详解Python:面向对象编程
Apr 10 Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 Python
修改 CentOS 6.x 上默认Python的方法
Sep 06 Python
python队列原理及实现方法示例
Nov 27 Python
Pytorch to(device)用法
Jan 08 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
Jun 22 Python
python实现数字炸弹游戏程序
Jul 17 Python
python归并排序算法过程实例讲解
Nov 04 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 文件夹删除、php清除缓存程序
2009/08/25 PHP
PHP 截取字符串专题集合
2010/08/19 PHP
PHP输入流php://input介绍
2012/09/18 PHP
PHP动态生成javascript文件的2个例子
2014/04/11 PHP
50个PHP程序性能优化的方法
2014/06/02 PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
2014/11/05 PHP
PHP代码优化技巧小结
2015/09/29 PHP
PHP实现活动人选抽奖功能
2017/04/19 PHP
PHP中关键字interface和implements详解
2017/06/14 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
JavaScript DOM学习第八章 表单错误提示
2010/02/19 Javascript
jQuery 中国省市两级联动选择附图
2014/05/14 Javascript
简单分析javascript面向对象与原型
2015/05/21 Javascript
javascript中的 object 和 function小结
2016/08/14 Javascript
微信小程序(应用号)简单实例应用及实例详解
2016/09/26 Javascript
微信小程序实现滚动消息通知
2018/02/02 Javascript
详解vue组件基础
2018/05/04 Javascript
浅谈Vue数据响应
2018/11/05 Javascript
vue实现点击隐藏与显示实例分享
2019/02/13 Javascript
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
Python之pandas读写文件乱码的解决方法
2018/04/20 Python
对django views中 request, response的常用操作详解
2019/07/17 Python
Python中*args和**kwargs的区别详解
2019/09/17 Python
python3的UnicodeDecodeError解决方法
2019/12/20 Python
Python使用docx模块实现刷题功能代码
2020/02/13 Python
python mock测试的示例
2020/10/19 Python
Expedia泰国:预订机票、酒店和旅游包(航班+酒店)
2016/09/27 全球购物
JD Sports德国官网:英国领先的运动鞋和运动服饰零售商
2018/02/26 全球购物
法国大使拉杆箱官网:DELSEY Paris
2018/03/20 全球购物
个性化皮包、小袋、生活配件:Mon Purse
2019/03/26 全球购物
公司演讲稿开场白
2014/08/25 职场文书
小学毕业典礼演讲稿
2014/09/09 职场文书
学风建设演讲稿
2014/09/12 职场文书
2014幼儿园小班工作总结
2014/11/10 职场文书
2014年小学校长工作总结
2014/12/08 职场文书
狂人日记读书笔记
2015/06/30 职场文书