Python写游戏,我上我也行 - Flappy Bird 03

这篇博客介绍了如何使用Python的pygame库开发Flappy Bird游戏,涉及小鸟类的创建、图片加载、重力加速度、跳跃高度等关键概念。作者通过实例代码详细解释了小鸟的上下移动、限制下落速度以及游戏帧率设置等步骤,鼓励读者动手实践并点赞支持后续更新。
摘要由CSDN通过智能技术生成

如果你喜欢自动化:一起学爬虫(Python) — 19 年轻人,进来学自动化

如果你想学习爬虫相关的知识,就关注一下下,点赞一下下,然后到小泽的主页里,尽情遨游吧~

努力做日更博主!如果没有日更,那就做两日更博主,或者三日更,四日更,努力!

在这里插入图片描述

回归一下吧

如果你好好的从01看过来的话,就会发现我已经成功的水了两篇博客 教了大家两篇博客。

在这里插入图片描述

前面的基本上都没有什么难度哦,那今天我们就整一点比较难的,当然这里的难是指比较难理解,毕竟只要捅破那一层薄薄的xxx,思路就很明确了,大家就成长了。

在这里插入图片描述

敲代码上的成长,不是身体上的。

俗话说得好,男人最怕的,就是太快了!

所以我们就要慢慢的进入,不能一上来就直接把代码扔各位脸上,这样不光是不尊敬各位,而且还没有什么可阅读性,对吧。

毕竟道理大家都懂,不会真的有人是看小泽写的博客在学习吧,不都是在看乐子吗,不会吧不会吧…

在这里插入图片描述
啊,说了这么多,其实就是想让各位点个赞嘛,生活不易,点赞虽然没用,但是好看。

就当是各位付的学费吧,点赞点赞点赞,三连三连三连!

在这里插入图片描述

进来,一夜长大

上一篇呢,我们写到了弄出来了一个背景图,对吧,效果是下面这样的:

在这里插入图片描述
可以看到呢,已经非常完美了,各位可以毕业了。

在这里插入图片描述

咳咳,开个玩笑,这样子肯定是不可以的嘛,为什么呢?

Flappy 鸟,鸟呢?

那么我们今天就来弄鸟!

何为鸟

鸟就是…

在这里插入图片描述
又要再次感谢我的“合作伙伴”。

那我们知道这个有什么用呢?

没有用。

在这里插入图片描述

进入鸟

来,进入到我们的鸟类,也就是:

class Bird():
    def __init__(self):
        pass

我们需要往里面写什么呢?

回顾一下我们的背景图片是怎么设置的:

我们在主进程类里写了一个背景图片的加载,又在主进程类里的run函数里写了一个显示背景,这就是我们对背景图片的处理。

听不懂我在说什么的,罚你去操场跑一百圈,跑不完不许啵上司嘴。

在这里插入图片描述
那我们也可以在主进程类里进行一个小鸟图片的显示吧,因为要在那里展示的嘛,但是具体的功能,还有数值,都写在小鸟类里叭!

包括图片的加载哦。

听不懂没关系,我们先把小鸟图片加到小鸟类里:

class Bird():
    def __init__(self):
        # 加载图片
        self.image = pygame.image.load('./sprites/bluebird-midflap.png')

这样的话,只要主进程一调用小鸟类,就会自动加载图片吧,但是肯定是只调用一次嘛,主进程类里是一个死循环的,我们要调用的话会把小鸟类放到死循环外面去调用。

也就是初始化小鸟类。

不过这都是后话了,先来说小鸟类!

当然也可以说一下啦,就比如:

# 调用小鸟类
bird = Bird()
# 拿到小鸟这个图片的对象
bird_image = bird.image

这样我们就可以对这个图片进行显示,放置等等操作…随便玩~

那么我们既然已经成功加载了图片,现在我们需要给图片进行一个参数的设定吧。

就比如我们上货的时候也是要填大小,重量,数量等等的嘛~

在这里插入图片描述

class Bird():
    def __init__(self):
        # 加载图片
        self.image = pygame.image.load('./sprites/bluebird-midflap.png')

        # 跳跃高度
        self.jump = -9
        # 重力加速度
        self.ft = 1
        # 下降的最大速度
        self.max_speed = 10
        # 当前速度
        self.speed = 0

跳跃高度呢,就是我们每一次跳跃会让y轴加上这个跳跃高度。

在这里插入图片描述
这样我们的小鸟就能实现“向上飞”这个效果。

只要帧率刷新的够快,就不会看出来是一点一点往上移的,就感觉像是飞起来的一样。

重力加速度呢,是因为如果我们不进行跳跃,这个小鸟是会一直往下掉的,而且掉的速度是越来越快的,就是因为有这个重力加速度。

所以我们设置一个重力加速度,也就是一个每次下降速度增加多少的量。

这个游戏是只有一个跳跃键的哦,不是上下键!

下降的最大速度呢,是防止小鸟下降的太快,所以设置了一个阈值,不能超过这个速度,不然一小会不按唰一下就下去了。

当前速度就是小鸟当前的速度(废话),刚开始设置为0,游戏一开始如果我们不按任何东西,小鸟就会慢慢往下降。

在这里插入图片描述
收不到赞,木有更新的动力了,害。

白嫖党太多了,虽然我曾经也是一名同好吧,但是求求了,各位点个赞吧,本篇点赞过100,立马更新!

不过分吧,毕竟一千个粉丝,只要十分之一不是白嫖的就好了,呜呜呜T-T

在这里插入图片描述
那我们接着写吧,接下来就需要把这些参数给用上,也就是用上这些参数。

class Bird():
    def __init__(self):
        # 加载图片
        self.image = pygame.image.load('./sprites/bluebird-midflap.png')

        # 跳跃高度
        self.jump = -9
        # 重力加速度
        self.ft = 1
        # 下降的最大速度
        self.max_speed = 10
        # 当前速度
        self.speed = 0

    def updata(self):
    	# 如果当前速度小于最大速度,就让当前速度加上重力加速度
        if self.speed < self.max_speed:
            self.speed += self.ft

大意了,还要再加两个参数。

是小鸟的坐标。

x轴是可以固定不变的,只有y轴是变化的。

x轴就是横着的那一条,小鸟只能上下移动的。

在这里插入图片描述
还不点赞???看什么看,快去点赞,点完再回来看。

点完赞了?

快回来继续学吧~

# 宽度是固定的
self.x = 288 * 0.2
self.y = 512 * 0.5

把这两个参数呢,放到鸟类的主函数下面。

x和y就是小鸟的坐标啦,288是游戏窗口的宽度,512是游戏窗口的高度。

这里我们用乘以一个小数的方式来放到合适的位置,当然这个是根据个人喜好的,你也可以设置成你觉得ok的位置!

在这里插入图片描述

由于宽度是不变的,也就是小鸟是只能上下动的,所以x是不变的吧,那我们只要让y一直变化,就能实现小鸟的上下摩擦!

class Bird():
    def __init__(self):
        # 加载图片
        self.image = pygame.image.load('./sprites/bluebird-midflap.png')

        # 跳跃高度
        self.jump = -9
        # 重力加速度
        self.ft = 1
        # 下降的最大速度
        self.max_speed = 10
        # 当前速度
        self.speed = 0
        # 宽度是固定的
		self.x = 288 * 0.2
		self.y = 512 * 0.5

    def updata(self):
    	# 如果当前速度小于最大速度,就让当前速度加上重力加速度
        if self.speed < self.max_speed:
            self.speed += self.ft
            
		# 让小鸟的y轴坐标加上速度
		self.y += self.speed

这样我们的小鸟系就写的差不多啦!

剩下的就是到主进程类里,初始化小鸟系,调用里面的起飞方法,就可以啦~

    def run(self):
    
    	# 初始化小鸟系,也就是调用小鸟系
        bird = Bird()
        
        while True:
            # 检测发生的事件
            for event in pygame.event.get():
                # 如果事件的类型等等于点击关闭按钮,也就是窗口右上角的X
                if event.type == pygame.QUIT:
                    # 中止运行
                    sys.exit()
                # 按下w键时,速度等于-9,也就是让y轴加上了-9,就是往上移了9个像素
                if event.type == pygame.KEYDOWN and event.key == pygame.K_w:
                    bird.speed = bird.jump

            # 小鸟移动,因为是一直要移动的,所以放到死循环里
            bird.updata()

            # 显示背景
            self.screen.blit(self.background, (0, 0))

            # 显示小鸟,bird.image是小鸟类里的image,也就是self.image
            # 因为我们是在小鸟类里加载的小鸟图片
            # bird.x和bird.y是self.x和self.y,也就是我们设置的坐标
            self.screen.blit(bird.image, (bird.x,bird.y))
				
			# 刷新窗口
            pygame.display.update()

但是这样写的话,你会发现打开游戏窗口并看不到小鸟,这是为什么呢?

在这里插入图片描述
还是那句话,男人最怕的,就是太快了!

当小鸟下落的频率比我们能看到的频率还快的时候,我们就看不到小鸟下落了。

这里为了方便看,我们给小鸟设置一个最低下落的高度,也就是不能比窗口的高度减去小鸟的高度还要低。

窗口的高度减去小鸟的高度就是小鸟在窗口最下面的上面的高度。

没错,你听懂了。

在这里插入图片描述

    def updata(self):
    	# 如果当前速度小于最大速度
        if self.speed < self.max_speed:
        	# 当前速度加上重力加速度
            self.speed += self.ft
            
        # 如果小鸟的y坐标大于等于 窗口的高度 - 小鸟图片的高度
        if self.y >= 512-self.image.get_height():
        	# 就让他们保持相等,也就是不能掉下去
            self.y = 512-self.image.get_height()
        
        self.y += self.speed

加上这个之后,我们来试一下吧!

在这里插入图片描述
可以看到小鸟是在这里了,而且我们按w是可以往上跳的,但是按得再快也不能让它起飞。

这是因为屏幕刷新的太快啦,所以男人有的时候太慢也是不好的。

如果你的手速能达到每秒按个几百下,估计就可以起飞了~

在这里插入图片描述
这里呢,就要用到我们的fps啦!

就是设置一下每秒多少帧,不至于我们的手速反应不过来~

class Game():
    def __init__(self):
        # 初始化
        pygame.init()
        # 设置频率
        self.fps = pygame.time.Clock()
        # 设置长和宽(根据背景图片来设置)
        self.screen = pygame.display.set_mode((288, 512))
        # 加载背景图片,使用self的话,在这个类中可以任意调用
        self.background = pygame.image.load('./sprites/background-day.png')

可以看到,主进程类里多了一个设置频率,这样我们就可以调用fps里面的方法了,也就是pygame.time.Clock()里面的方法!

在哪里调用呢?

在我们的刷新屏幕的后面调用就好啦!

    def run(self):
        bird = Bird()
        while True:
            # 检测发生的事件
            for event in pygame.event.get():
                # 如果事件的类型等等于点击关闭按钮,也就是窗口右上角的X
                if event.type == pygame.QUIT:
                    # 中止运行
                    sys.exit()
                # 向上时,小鸟上移
                if event.type == pygame.KEYDOWN and event.key == pygame.K_w:
                    bird.speed = bird.jump

            # 小鸟移动
            bird.updata()

            # 显示背景
            self.screen.blit(self.background, (0, 0))

            # 显示小鸟
            self.screen.blit(bird.image, (bird.x,bird.y))

            pygame.display.update()
            
			# 设置最大帧率
            self.fps.tick(30)

这样我们的小鸟就可以被我们玩来玩去啦~

小鸟酱?小鸟酱!

成人礼

如果有哪里没有搞懂呢,就在留言里或者群里私聊问哦!

那就…因为我也不知道有没有人看这个系列,所以等01,02,03三篇加起来有200赞,就更新下一期!

不难吧,不要白嫖啦T-T

在这里插入图片描述

各位姥爷886~

目前の全部代码(无注释)

import sys
import pygame

class Game():
    
    def __init__(self):
        
        # 初始化
        pygame.init()
        
        # 设置频率
        self.fps = pygame.time.Clock()
        
        # 设置长和宽(根据背景图片来设置)
        self.screen = pygame.display.set_mode((288, 512))
        
        # 加载背景图片,使用self的话,在这个类中可以任意调用
        self.background = pygame.image.load('./sprites/background-day.png')

    def run(self):
        
        bird = Bird()
        
        while True:
            # 检测发生的事件
            for event in pygame.event.get():
                # 如果事件的类型等等于点击关闭按钮,也就是窗口右上角的X
                if event.type == pygame.QUIT:
                    # 中止运行
                    sys.exit()
                # 向上时,小鸟上移
                if event.type == pygame.KEYDOWN and event.key == pygame.K_w:
                    bird.speed = bird.jump

            # 小鸟移动
            bird.updata()

            # 显示背景
            self.screen.blit(self.background, (0, 0))

            # 显示小鸟
            self.screen.blit(bird.image, (bird.x,bird.y))

            pygame.display.update()

            self.fps.tick(30)

class Bird():
    
    def __init__(self):
        # 加载图片
        self.image = pygame.image.load('./sprites/bluebird-midflap.png')

        # 跳跃高度
        self.jump = -9
        # 重力加速度
        self.ft = 1
        # 下降的最大速度
        self.max_speed = 10
        # 当前速度
        self.speed = 0
        # 宽度是固定的
        self.x = 288 * 0.2
        self.y = 512 * 0.5

    def updata(self):
        
        if self.speed < self.max_speed:
            self.speed += self.ft

        if self.y >= 512-self.image.get_height():
            self.y = 512-self.image.get_height()

        self.y += self.speed

if __name__ == '__main__':
    game = Game()
    game.run()

那就…

200赞见喽!

  • 44
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值