15. python从入门到精通——Pygame游戏编程-程序员宅基地

技术标签: python  pygame  游戏  

目录

游戏的原理

安装Pygame

Pygame常用模块

Pygame的基本使用     

实例:制作一个跳跃的小球游戏,如果碰到窗口边缘会改变小球移动方向

实现步骤:

 运行效果:

小球图片:    

 python代码:

开发Flappy Bird游戏

游戏简介:

运行效果:

图片素材

游戏分析 

以面向对象的思维方式来分析一下这个游戏可以归纳为两个对象

小鸟:

管道:

碰撞检测:

实现步骤

python代码


游戏的原理

        窗口:游戏中也有窗口的概念,游戏中的角色都需要再窗口中显示

        资源:是指游戏中的背景、角色、声音等 

        坐标:在Pygame中有横轴和纵轴。例如在植物大战僵尸中不断修改僵尸的坐标可以实现动画效果

                注意:Pygame中坐标0,0在创建窗口的左上角,向右则X坐标越大;向下则Y坐标越大

        运行流程:在python中程序是由上至下执行的,执行完就结束了游戏窗口随之关闭。为了能够让窗口一直显示需要设置一个死循环,可以用while True 语句实现。当执行地一边的时候在窗口中添加背景图片、角色,第二遍同样添加背景图片但是每次循环更新角色坐标。当频率到至少24次每秒我们肉眼就只会感觉到画面和角色是一直存在的从而实现了动画效果

安装Pygame

Pygame:是python中的模块,专用于二D游戏开发,要使用它需要先安装它

安装命令:pip install pygame

        如果超时:pip  install  -i  https://pypi.doubanio.com/simple/   --trusted-host pypi.doubanio.com pygame

Pygame常用模块

Pygame官网

优势:Pygame做游戏开发的优势在于不需要过多考虑与底层开发相关的内容,而可 以把工作重心放在游戏逻辑上。

1. 常用模块:

模块名

功能

pygame.cdrom

访问光驱

pygame.cursors

加载光标

pygame.display

访问显示设备

pygame.draw

绘制形状、线和点

pygame.event

管理事件

pygame.fbnt

使用字体

pygame.image

加载和存储图片

pygame.joystick

使用游戏手柄或者类似的东西

pygame.key

读取键盘按键

pygame.mixer

声音

pygame.mouse

鼠标

pygame.movie

播放视频

pygame.music

播放音频

pygame.overlay

访问高级视频叠加

pygame.rect

管理矩形区域

pygame.sndarray

操作声音数据

pygame.sprite

操作移动图像

pygame.surface

管理图像和屏幕

pygame.surfarray

管理点阵图像数据

pygame.time

管理时间和帧信息

pygame.transform

缩放和移动图像

2. display模块的常用方法

方法名

功能

pygame.dispaly.init

初始化display模块

pygame.dispaly.quit

结束display模块

pygame.dispaly.get^init

如果display模块已经被初始化,则返回True

pygame.dispaly.setmode

初始化一个准备显示的界面

pygame.dispaly.get_surface

获取当前的Surface对象

pygame.dispaly.flip

更新整个待显示的Surface对象到屏幕上

pygame.dispaly .update

更新部分内容显示到屏幕上,如果没有参数,则与flip功能相同

3. Surface对象的常用方法

方法名

功能

pygame.Surface.blit

将一个图像画到另一个图像上

pygame. Surface.convert

转换图像的像素格式

pygame.Surface.convert_alpha

转化图像的像素格式,包含alpha通道的转换

pygame. Surface.f ill

使用颜色填充Surface

pygame. Surface.get_rect

获取Surface的矩形区域

示例:创建窗口流程,也是大部分创建Pygame的流程


import sys  # 导入sys模块
import pygame  # 导入pygame模块

pygame.init()  # 初始化pygame,检查游戏需要的一些硬件调用接口、系统功能接口是否有问题
size = width, height = 640, 480  # 设置窗口大小
screen = pygame.display.set_mode(size)  # 显示窗口但是执行完程序就会关闭窗口

while True:
# 获取所有的事件,例如点击窗口的时间、按下键盘的事件。由于事件的类型很多,程序不知道发生了哪一类事件所以需要不断的循环判断
    for event in pygame.event.get():
        if event.type == pygame.QUIT:  # 如果点击关闭窗口,则退出
            pygame.quit()  # 退出pygame
            sys.exit() #推出系统

Pygame的基本使用     

实例:制作一个跳跃的小球游戏,如果碰到窗口边缘会改变小球移动方向

实现步骤:

        创建窗口→添加小球→移动小球→检测碰撞   

 运行效果:

小球图片:    

 python代码:

# -*- coding:utf-8 -*-
import sys  # 导入sys模块
import pygame  # 导入pygame模块

pygame.init()  # 初始化pygame
size = width, height = 640, 480  # 设置窗口,这是一个数组
screen = pygame.display.set_mode(size)  # 显示窗口
color = (0, 0, 0)  # 设置颜色

ball = pygame.image.load("ball.png")  # 加载图片
ballrect = ball.get_rect()  # 根据图片大小获取矩形区域

speed = [5, 5]  # 设置移动的X轴、Y轴距离
clock = pygame.time.Clock()  # 创建时钟对象
# 执行死循环,确保窗口一直显示
while True:
    clock.tick(240)  # 每秒执行60次
    # 检查事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:  # 如果点击关闭窗口,则退出
            pygame.quit()  # 退出pygame
            sys.exit()

    ballrect = ballrect.move(speed)  # 通过再次赋值移动小球
    # 碰到左右边缘
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]  #如果碰到边距则反方向移动
    # 碰到上下边缘
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = -speed[1]

    screen.fill(color)  # 填充颜色
    screen.blit(ball, ballrect)  # 此函数是将图片推送到窗口上,第一个参数为图片第二个参数为图片位置
    pygame.display.flip()  # 更新全部显示


开发Flappy Bird游戏

游戏简介:

当点击屏幕的时候小鸟就往上飞,再次点击小鸟再次往上飞,当不点击时小鸟会以更快速度降落。我们需要控制小鸟

我们需要控制小鸟通过各种各样的管道,当我们穿过一组管道时就会得一分,如果在飞行过程中碰到了管道那么小鸟状态变为灰色掉在地上,游戏结束并且显示一个总的分数

运行效果:

图片素材

游戏分析 

以面向对象的思维方式来分析一下这个游戏可以归纳为两个对象

小鸟:

        属性:

                小鸟的生命状态

                        活着:颜色为黄色

                        死亡:颜色为灰色

                坐标位置

                        X轴坐标

                        Y轴坐标(变化)

                是否跳跃

                        上升高度

                        坠落高度

        方法

                跳跃

                坠落

管道:

        方法:向左移动

碰撞检测:

        小鸟碰到上下管道

        小鸟碰到上下边界

实现步骤

搭建主框架

创建小鸟类

创建管道类

计算得分

碰撞检测

python代码

import pygame
import sys
import random


class Bird(object):
    """定义一个鸟类"""

    def __init__(self):
        """定义初始化方法"""
        # 鸟的矩形有四个参数:前两个是小鸟矩形左上角的坐标点,后两个是矩形的长宽
        self.birdRect = pygame.Rect(65, 50, 50, 50)
        # 定义鸟的3种状态图片列表:向上飞、向下坠、死亡
        self.birdStatus = [pygame.image.load("assets/1.png"),
                           pygame.image.load("assets/2.png"),
                           pygame.image.load("assets/dead.png")]
        self.status = 0  # 默认飞行状态
        self.birdX = 120  # 鸟所在X轴坐标,即是向右飞行的速度
        self.birdY = 350  # 鸟所在Y轴坐标,即上下飞行高度
        self.jump = False  # 默认情况小鸟自动降落
        self.jumpSpeed = 10  # 跳跃高度
        self.gravity = 5  # 重力
        self.dead = False  # 默认小鸟生命状态为活着

    def birdUpdate(self):
        if self.jump:
            # 小鸟跳跃
            self.jumpSpeed -= 1  # 速度递减,上升越来越慢
            self.birdY -= self.jumpSpeed  # 鸟Y轴坐标减小,小鸟上升
        else:
            # 小鸟坠落
            self.gravity += 0.2  # 重力递增,下降越来越快
            self.birdY += self.gravity  # 鸟Y轴坐标增加,小鸟下降
        self.birdRect[1] = self.birdY  # 更改Y轴位置


class Pipeline(object):
    """定义一个管道类"""

    def __init__(self):
        """定义初始化方法"""
        self.wallx = 400;  # 管道所在X轴坐标,最右边位置
        self.pineUp = pygame.image.load("assets/top.png") #加载上管道图片
        self.pineDown = pygame.image.load("assets/bottom.png") #加载管道图片

    def updatePipeline(self):
        """"管道移动方法"""
        self.wallx -= 5  # 管道X轴坐标递减,即管道向左移动
        # 当管道运行到一定位置,即小鸟飞越管道,分数加1,并且重置管道
        if self.wallx < -80: #管道宽度为94,当管道快移除屏幕时重置管道位置
            global score #设置得分加1并声明为全局变量
            score += 1
            self.wallx = 400


def createMap():
    """定义创建地图的方法"""
    screen.fill((255, 255, 255))  # 填充颜色
    screen.blit(background, (0, 0))  # 填入到背景

    # 显示管道
    #因为管道长度为495几乎占满屏幕了,为了让管道小一点设置为屏幕外的上下方
    screen.blit(Pipeline.pineUp, (Pipeline.wallx, -300));  # 上管道坐标位置
    screen.blit(Pipeline.pineDown, (Pipeline.wallx, 500));  # 下管道坐标位置
    Pipeline.updatePipeline()  # 管道移动

    # 显示小鸟
    if Bird.dead:  # 撞管道状态
        Bird.status = 2
    elif Bird.jump:  # 起飞状态
        Bird.status = 1
    screen.blit(Bird.birdStatus[Bird.status], (Bird.birdX, Bird.birdY))  # 设置小鸟的坐标
    Bird.birdUpdate()  # 鸟移动

    # 显示分数
     #font.render()用于显示字体有三个参数:字符串、是否平滑、颜色
    screen.blit(font.render(str(score), -1, (255, 255, 255)), (200, 50))  # 设置颜色及坐标位置
    pygame.display.update()  # 更新显示


def checkDead():
    # 上方管子的矩形位置
    upRect = pygame.Rect(Pipeline.wallx, -300,
                         Pipeline.pineUp.get_width() - 10,
                         Pipeline.pineUp.get_height())

    # 下方管子的矩形位置
    downRect = pygame.Rect(Pipeline.wallx, 500,
                           Pipeline.pineDown.get_width() - 10,
                           Pipeline.pineDown.get_height())
    # 检测小鸟与上下方管子是否碰撞
    if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect):
        Bird.dead = True
    # 检测小鸟是否飞出上下边界
    if not 0 < Bird.birdRect[1] < height:
        Bird.dead = True
        return True
    else:
        return False


def getResutl():
    final_text1 = "Game Over"
    final_text2 = "Your final score is:  " + str(score)
    ft1_font = pygame.font.SysFont("Arial", 70)  # 设置第一行文字字体
    ft1_surf = font.render(final_text1, 1, (242, 3, 36))  # 设置第一行文字颜色
    ft2_font = pygame.font.SysFont("Arial", 50)  # 设置第二行文字字体
    ft2_surf = font.render(final_text2, 1, (253, 177, 6))  # 设置第二行文字颜色
    screen.blit(ft1_surf, [screen.get_width() / 2 - ft1_surf.get_width() / 2, 100])  # 设置第一行文字显示位置
    screen.blit(ft2_surf, [screen.get_width() / 2 - ft2_surf.get_width() / 2, 200])  # 设置第二行文字显示位置
    pygame.display.flip()  # 更新整个待显示的Surface对象到屏幕上


if __name__ == '__main__':
    """主程序"""
    pygame.init()  # 初始化pygame
    pygame.font.init()  # 初始化字体
    font = pygame.font.SysFont("Arial", 50)  # 设置字体和大小
    size = width, height = 400, 680  # 设置窗口
    screen = pygame.display.set_mode(size)  # 显示窗口
    clock = pygame.time.Clock()  # 设置时钟
    Pipeline = Pipeline()  # 实例化管道类
    Bird = Bird()  # 实例化鸟类
    score = 0
    while True:
        clock.tick(60)  # 每秒执行60次
        # 轮询事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            # 如果触发键盘和鼠标事件并且小鸟状态不是死亡则Bird.jump值为True并且初始化跳跃跟坠落速度
            if (event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead:
                Bird.jump = True  # 跳跃
                Bird.gravity = 5  # 重力
                Bird.jumpSpeed = 10  # 跳跃速度

        background = pygame.image.load("assets/background.png")  # 加载背景图片
        if checkDead():  # 检测小鸟生命状态
            getResutl()  # 如果小鸟死亡,显示游戏总分数
        else:
            createMap()  # 创建地图


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43812198/article/details/131443250

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include&lt;stdio.h&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#include&lt;malloc.h&gt;#include&lt;iostream&gt;#include&lt;stack&gt;#include&lt;queue&gt;using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签