使用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 30 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
Jul 01 Python
深入理解NumPy简明教程---数组1
Dec 17 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
Jan 31 Python
django连接mysql配置方法总结(推荐)
Aug 18 Python
Python使用统计函数绘制简单图形实例代码
May 15 Python
python basemap 画出经纬度并标定的实例
Jul 09 Python
python中的split()函数和os.path.split()函数使用详解
Dec 21 Python
通过实例解析Python文件操作实现步骤
Sep 21 Python
在Django中使用MQTT的方法
May 10 Python
Python初学者必备的文件读写指南
Jun 23 Python
Anaconda配置各版本Pytorch的实现
Aug 07 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如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
扩展javascript的Date方法实现代码(prototype)
2010/11/20 Javascript
JS中的public和private对象,即static修饰符
2012/01/18 Javascript
Jquery实现视频播放页面的关灯开灯效果
2013/05/27 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
2014/09/26 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
2015/09/27 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
js实现分页功能
2017/05/24 Javascript
vue2.0使用swiper组件实现轮播效果
2017/11/27 Javascript
vue.js自定义组件directives的实例代码
2018/11/09 Javascript
nodejs使用node-xlsx生成excel的方法示例
2019/08/22 NodeJs
五句话帮你轻松搞定js原型链
2020/12/09 Javascript
Python中关于使用模块的基础知识
2015/05/24 Python
Python实现霍夫圆和椭圆变换代码详解
2018/01/12 Python
Python字符串对象实现原理详解
2019/07/01 Python
如何使用Python实现斐波那契数列
2019/07/02 Python
Python time库基本使用方法分析
2019/12/13 Python
文件上传服务器-jupyter 中python解压及压缩方式
2020/04/22 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
matplotlib之pyplot模块之标题(title()和suptitle())
2021/02/22 Python
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
康拓普公司Java笔面试
2016/09/23 面试题
韩语专业本科生求职信
2013/10/01 职场文书
医院护理人员的自我评价分享
2013/10/04 职场文书
机修工岗位职责
2013/11/24 职场文书
社会实践感言
2014/01/25 职场文书
教师师德承诺书
2014/03/26 职场文书
锦旗标语大全
2014/06/23 职场文书
2014年大学生党员自我评议
2014/09/22 职场文书
本溪关门山导游词
2015/02/09 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书
python实现图片九宫格分割的示例
2021/04/25 Python
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS