pygame开发(二)——pgzero库开发

pygame库开发较麻烦,所以先从pygame zero开始学习

1 pygame zero库下载

1.1 打开cmd

方法见我之前的文章:pygame开发(一)——pygame库下载-CSDN博客文章浏览阅读20次。pygame安装https://blog.csdn.net/m0_66766480/article/details/134083288界面如下:

1.2 输入该指令

"E:\myFile\Program Files\Python37\python.exe" -m pip install pgzero

我前面的博客里用的都是上面的安装方法,这里说一个更简单一点的方法,如下:

pip install pgzero

其实就是把前面那一串路径和"-m"去掉,但有个问题是有的电脑因为之前Python卸载是方法不正规等原因有数据残留导致找不到Python(就像我的电脑,这也是我在前面讲Python安装的博客里要说软件卸载方法的原因之一,都是踩过的坑啊),只能用方法一

1.3 安装完成

1.3.1 安装成功

1.3.2 安装失败

如果出现失败的情况,可以按以下方法尝试安装,不需要可以跳过

1.3.2.1 下载
1.3.2.1.1 打开pypi

网址:PyPI · The Python Package IndexThe Python Package Index (PyPI) is a repository of software for the Python programming language.icon-default.png?t=N7T8https://pypi.org/

1.3.2.1.2 搜索pgzero

1.3.2.1.3 选择合适版本(一般选第一个)

1.3.2.1.4 选择下载类型

点开"Download Files"

选择whl版本文件,单击后开始下载

1.3.2.52 安装
1.3.2.2.1 打开刚下载下来的文件所在文件夹

1.3.2.2.2 按住Shift键,同时右键文件夹空白处,点击“从此处打开命令窗口”

1.3.2.2.3 又是这个cmd窗口

1.3.2.2.4 输入以下指令
"E:\myFile\Program Files\Python37\python.exe" -m pip install pgzero-1.2.1-py3-none-any.whl

 "pgzero-1.2.1-py3-none-any.whl"是刚才下载的whl文件的文件名(不能改)

1.3.2.2.4 安装成功

2 pgzero开发

2.1 导入库

这是一个坑,这里落实以下

本库全名:pygame zero

缩写: pgzero

导入所用库名:pgzrun(pygame zero run的缩写)

所以,导入库的正确方法如下

import pgzrun

2.2 窗口大小

方法很简单,就两行代码,写完就不用管了

WIDTH = 800  # 宽度
HEIGHT = 600  # 高度

2.3 运行程序

注意:放在程序最后

pgzrun.go()

这行代码和root.mainloop()很像(tkinter库中的代码),都是放最后,代表进入主循环(开始运行)

2.4 角色模块Actor()

使用方式:

actor_name = Actor('file name')
# actor_name为储存角色的变量名
# file name是文件名,但要注意的是传入的文件名会在程序所在文件夹中的'images'文件夹中查找,可以不写后缀名

2.4.1 常用属性

使用方法:

角色名.属性名 = 属性内容
2.4.1.1 image属性

作用:改变角色图片

属性内容:同Actor()方法中的'file name'

2.4.1.2 位置属性

作用:改变位置

属性名属性内容
pos中心坐标
x中心横坐标
y中心纵坐标
top顶部横坐标
bottom底部横坐标
left左边纵坐标
right右边纵坐标

注意:pygame(包括后面要讲的标准版)中坐标用的是平面直角坐标系,但与数学中常见的平面直角坐标系不同,pygame的坐标系是以左上角为(0, 0)点,单位长度为像素,右为x轴正方向,下为y轴正方向的平面直角坐标系

2.4.2 常用方法

使用方法:

角色名.方法名(参数名=参数内容)  # “参数名=”大多数能省略
2.4.2.1 colliderect()方法

参数:另一个角色

返回值:布尔(bool)类型(True或False)

作用:检测角色与角色的碰撞,若碰撞,返回True,否则返回False

2.4.2.2 collidepoint()方法

参数:坐标(一般习惯是元组型,但列表等有序的数据类型也是可以的)

返回值:布尔类型

作用:检测角色与坐标的碰撞,若碰撞,返回True,否则返回False

2.4.2.3 draw()方法

参数:无

返回值: 无

作用:将角色绘制到窗口上

2.5 功能模块

这一块不知道叫什么,自己起了个名,仅仅用作便于介绍

 这一块的实现方法(指编写第三方库的时候)不知道是怎么实现的,整体是这样的一种用法,就是按给定的函数名定义函数,程序在相应的时候调用相应函数,但用起来还是挺简单的

到这里,光说就完全说不明白了,所以开始开发一个小游戏,借开发来讲这些知识

框架代码:

import os
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (5, 30)
# 设置窗口位置为(5, 30),使窗口左上角显示在屏幕的(5, 30)位置

import pgzrun
import random

WIDTH = 400  # 窗口宽度为400像素
HEIGHT = 300  # 窗口高度为300像素

bird = Actor('bird', (50, 150))
# 创建鸟的角色,使用bird.png图片,初始位置为(50, 150)
pillar = [
    lambda: Actor('pillar1', (500, -150)),  # 第一种柱子的外观和初始位置
    lambda: Actor('pillar2', (500, 450))  # 第二种柱子的外观和初始位置
]
"""
Actor中的参数是在程序所在文件夹中的images子文件夹中找的,且不用输入后缀名
比如传入'bird',程序找该文件的相对路径就为"./images/bird.png"
"""
pillars = [random.choice(pillar)()]  # 初始化一个柱子列表,并随机选择一种柱子添加进去
speed = 0  # 鸟的速度
begin = 0  # 游戏状态,0表示初始状态,1表示游戏进行中,2表示游戏结束
score = 0  # 得分


def fly():
    global speed, begin, pillars, score
    
    speed = 35  # 设置鸟的速度
    if begin == 2:  # 如果游戏结束,重置得分并清空柱子列表
        score = 0
        del pillars
        pillars = [random.choice(pillar)()]  # 随机选择一种柱子添加进去
    begin = 1  # 设置游戏状态为进行中

# 后面的代码在这里补充


pgzrun.go()  # 运行Pygame Zero游戏引擎,启动游戏循环

2.5.1 draw

实现功能:绘制界面

不多说废话了,直接上代码

def draw():
    screen.blit('background', (0, 0))  # 绘制背景图片
    bird.draw()  # 绘制鸟
    for pl in pillars:
        pl.draw()  # 绘制柱子
    screen.draw.text(str(score), (0, 0), color=(0, 0, 0))  # 在左上角显示得分

这一段代码(包括后面的其他功能)要写在pgzrun.go()之前,import pgzrun之后

screen.blit这一行是绘制图片用的,参数与Actor一样,可以绘制一些固定的图片(不固定的其实也行,但不如直接用Actor方便),比如绘制背

 景

2.5.2 on_mouse_down/on_mouse_up

可接收参数:

pos:坐标

button:按键

实现功能:检测鼠标按下/抬起

代码:

def on_mouse_down():  # 鼠标点击事件的处理函数
    fly()  # 调用前面定义的fly()函数实现飞行

global说人话就是使用函数外面的变量,这里是使上升速度为7,当然,这个功能目前还没实现。

2.5.3 on_key_down/on_key_up

实现功能:检测键盘按下/抬起

代码:

def on_key_down():  # 键盘按下事件的处理函数
    fly()  # 调用前面定义的fly()函数实现飞行

2.5.4 update

实现功能:重复执行

频率:每秒60帧

代码:

def update():
    global speed, pillars, begin, score
    
    if begin == 1:  # 如果游戏状态为进行中
        bird.y -= speed // 9  # 根据速度更新鸟的位置
        if bird.top < 0:  # 如果鸟到达窗口顶部,则将其位置设置为窗口顶部
            bird.top = 0
        if bird.bottom > 300:  # 如果鸟到达窗口底部,则游戏结束
            begin = 2
        speed -= 1  # 速度逐渐减小
        
        if pillars[-1].x <= 250:  # 如果最后一个柱子的右边界到达窗口的一半位置
            pillars.append(random.choice(pillar)())  # 随机选择一种柱子添加进去
        for p in pillars:
            p.x -= 5  # 更新柱子的位置,使其向左移动
            if p.right <= 0:  # 如果柱子的右边界超出窗口,则将其删除并增加得分
                pillars.remove(p)
                score += 1
            if p.colliderect(bird):  # 如果鸟与柱子发生碰撞,则游戏结束
                begin = 2

2.5.4 完整代码

import os
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (5, 30)
# 设置窗口位置为(5, 30),使窗口左上角显示在屏幕的(5, 30)位置

import pgzrun
import random

WIDTH = 400  # 窗口宽度为400像素
HEIGHT = 300  # 窗口高度为300像素

bird = Actor('bird', (50, 150))
# 创建鸟的角色,使用bird.png图片,初始位置为(50, 150)
pillar = [
    lambda: Actor('pillar1', (500, -150)),  # 第一种柱子的外观和初始位置
    lambda: Actor('pillar2', (500, 450))  # 第二种柱子的外观和初始位置
]
"""
Actor中的参数是在程序所在文件夹中的images子文件夹中找的,且不用输入后缀名
比如传入'bird',程序找该文件的相对路径就为"images/bird.png"
"""
pillars = [random.choice(pillar)()]  # 初始化一个柱子列表,并随机选择一种柱子添加进去
speed = 0  # 鸟的速度
begin = 0  # 游戏状态,0表示初始状态,1表示游戏进行中,2表示游戏结束
score = 0  # 得分


def fly():
    global speed, begin, pillars, score
    
    speed = 35  # 设置鸟的速度
    if begin == 2:  # 如果游戏结束,重置得分并清空柱子列表
        score = 0
        del pillars
        pillars = [random.choice(pillar)()]  # 随机选择一种柱子添加进去
    begin = 1  # 设置游戏状态为进行中


def draw():
    screen.blit('background', (0, 0))  # 绘制背景图片
    bird.draw()  # 绘制鸟
    for pl in pillars:
        pl.draw()  # 绘制柱子
    screen.draw.text(str(score), (0, 0), color=(0, 0, 0))  # 在左上角显示得分


def on_mouse_down():  # 鼠标点击事件的处理函数
    fly()  # 调用前面定义的fly()函数实现飞行


def on_key_down():  # 键盘按下事件的处理函数
    fly()  # 调用前面定义的fly()函数实现飞行


def update():
    global speed, pillars, begin, score
    
    if begin == 1:  # 如果游戏状态为进行中
        bird.y -= speed // 9  # 根据速度更新鸟的位置
        if bird.top < 0:  # 如果鸟到达窗口顶部,则将其位置设置为窗口顶部
            bird.top = 0
        if bird.bottom > 300:  # 如果鸟到达窗口底部,则游戏结束
            begin = 2
        speed -= 1  # 速度逐渐减小
        
        if pillars[-1].x <= 250:  # 如果最后一个柱子的右边界到达窗口的一半位置
            pillars.append(random.choice(pillar)())  # 随机选择一种柱子添加进去
        for p in pillars:
            p.x -= 5  # 更新柱子的位置,使其向左移动
            if p.right <= 0:  # 如果柱子的右边界超出窗口,则将其删除并增加得分
                pillars.remove(p)
                score += 1
            if p.colliderect(bird):  # 如果鸟与柱子发生碰撞,则游戏结束
                begin = 2


pgzrun.go()  # 运行Pygame Zero游戏引擎,启动游戏循环

那么,pygame zero学习就到这了,虽然还有更多功能,但已经能写一些基础程序了,并且这不是本专栏重点,这个只是作为一个跳板去学习更专业的pygame,更多的功能就不说了

3 AI版本

这个程序我编写了一个AI程序,感兴趣的看下面这篇文章

传送门:

人工智能开发——Flappy Bird-CSDN博客基础项目框架是在我前面这个博客里开发的pygame开发(二)——pgzero库开发-CSDN博客pygame zero入门。https://blog.csdn.net/m0_66766480/article/details/135170469?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135170469%22%2C%22source%22%3A%22m0_66766480%22%7D

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值