15. python从入门到精通——Pygame游戏编程

news2024/9/27 5:42:54

目录

游戏的原理

安装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()  # 创建地图


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

生成古风少女图片【InsCode Stable Diffusion美图活动一期】

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 写在前面 Stable Diffusion 模型在线使用地址&#xff1a; 工具介绍 一.如何使用S…

基于Java的酒店管理系统设计与实现(源码+文档+报告+任务书)

本系统采用Java语言进行开发&#xff0c;实现了跨平台的部署。使用了MySQL数据库进行数据存储&#xff0c;保证了数据的稳定性与可靠性。通过使用Spring框架&#xff0c;实现了对各个模块的解耦&#xff0c;使得系统更易于维护与升级。前端使用了Node.jsVue以提供易用、美观的用…

spring复习:(4)AbstractEnvironment

该类中指定了激活profile属性的名称(spring.profiles.active)&#xff0c;默认profile属性的名称(spring.profiles.default)&#xff0c;以及默认的profile的名字(default)。

springboot项目集成nacos配置中心踩坑

前提 在使用nacos的配置中心功能&#xff0c;发现在application.yml中配置地址后仍然读取不到配置中心地址&#xff0c;配置项和值都是正确的。但就是读不到&#xff0c;现在来分析下 配置项 spring:application:name: test-servicemain:allow-bean-definition-overriding: …

Ubuntu 20.04 LTS x86_64 SPEC CPU 2006 cpu2006-1.2.iso 测试笔记

环境 安装依赖项 sudo apt install gfortran 挂载iso sudo mkdir /mnt/cpu2006 sudo mount cpu2006-1.2.iso /mnt/cpu2006 安装 cd /mnt/cpu2006 sh install.sh -d /home/speccpu/cpu2006 SPEC CPU2006 InstallationTop of the CPU2006 tree is /mnt/cpu2006Installing F…

【Vue3】学习笔记-toRef

作用 创建一个ref对象&#xff0c;其value值指向另一个对象中的某个属性。 语法 const nametoRef(person,‘name’) 应用 要将响应式对象中的某个属性单独提供给外部使用时 #扩展 toRefs与toRef功能一直&#xff0c;但可以批量创建多个ref对象,语法&#xff1a;toRefs(per…

浅谈消防应急照明和疏散指示系统在变电站的设计与应用

【摘要】&#xff1a;随着对消防安全重视程度的不断提高&#xff0c;消防设计要求更加严格。针对变电站的应用场景&#xff0c;以民用和工业建筑为对象设计的消防应急照明和疏散指示系统不宜直接套用。文章从变电站实际应用角度出发&#xff0c;梳理和对比了现行设计规范&#…

机器人制作开源方案 | 智能立体仓储系统模型

1. 功能说明 本文示例将通过程序控制模拟立体仓储系统的运动效果--模拟立体仓储系统进行运输货物时各个结构的运动方式。立体仓储系统的运动有整体系统的水平移动、载货台的纵向移动、货叉的平动&#xff0c;所有的运动表现形式都是旋转运动转化为平动。 2. 结构说明 该立体仓储…

netcat(nc)安装

网络工具中有“瑞士军刀”美誉的NetCat&#xff08;以下简称nc&#xff09;可以使用TCP或UDP协议的网络连接去读写数据。 问题 使用命令 nc -zv ip port 发现报错Ncat&#xff1a;Connection refused&#xff0c;其实是混淆了netcat&#xff08;nc&#xff09;与ncat where …

只要你会vue,5分钟学不会 svelte 你来找我

&#x1f33b; 前言 2023年了&#xff0c;国内前端领域基本被Vue、React占领市场&#xff0c;近几年似乎前端技术栈的迭代更新缓慢了下来。 当然近几年也出现了像svelte、solid.js等一些新兴的前端框架&#xff0c;这些框架有很多创新的点&#xff0c;比如svelte相比于vue,re…

SSTI-lab

Level-1 no waf {{2*2}}测试发现存在ssti漏洞 {{.__class__}}{{.__class__.__bases__[0]}}{{.__class__.__bases__[0].__subclasses__}}import requestsurl"http://node1.anna.nssctf.cn:28430/level/1"#payload{{.__class__.__bases__[0].__subclasses__()[1]}} …

基于智慧消防系统的建设与应用

安科瑞 华楠 【摘要】随着“智慧城市”建设热潮的兴起&#xff0c;对推动人类社会发展与进步发挥重要作用&#xff0c;而“智慧消防”作为“智慧城市”的重要组成部分&#xff0c;其建设工作也越来越受到社会各界人士的高度关注&#xff0c;这对推动“智慧城市”构建发挥作用。…

途乐证券|Prada总部上海荣宅失事?230亿龙头突现重大利空,黑马也被带崩

Prada和蔡徐坤同时刷屏&#xff01; 今天一早&#xff0c;Prada冲上微博热搜&#xff0c;原因是有网友称&#xff0c;“Prada总部上海荣宅起火”&#xff0c;相关视频在网上热传。据上海静安消防发布火情通报&#xff0c;2023年7月2日18时14分&#xff0c;静安区陕西北路靠近南…

登录校验-会话技术/JWT令牌

登录校验 会话技术 会话&#xff1a; 用户打开浏览器&#xff0c;访问web资源的时候&#xff0c;会话建立。直到一方断开连接&#xff0c;会话结束&#xff0c;一次会话中包含多次响应 会话跟踪&#xff1a;一种维护浏览器状态的方法&#xff0c;服务器需要识别多次请求是否来…

【MySQL】count()查询性能梳理

【MySQL】count()查询性能梳理 1、背景 使用的数据库是MySQL8&#xff0c;使用的存储引擎是Innodb。 通常情况下&#xff0c;分页接口一般会查询两次数据库&#xff0c;第一次是获取具体数据&#xff0c;第二次是获取总的记录行数&#xff0c;然后把结果整合之后&#xff0c…

【VB6|第19期】vb6通过COM组件操作Excel

日期&#xff1a;2023年7月3日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xff…

软件测试工程师必备的27个基础技能

混迹于软件测试这么长时间了&#xff0c;一直想写一篇关于软件测试的经验分享的文章&#xff0c;但苦于工作原因迟迟未下笔。最近终于有了些闲余时间&#xff0c;遂决定把自己的心路历程及所感所想记录下来&#xff0c;与各位同行共勉。 以我多年的工作经验来看&#xff0c;软…

处理glibc堆栈缓冲区溢出漏洞(CVE-2018-11236)

GNU C Library&#xff08;又名glibc&#xff0c;libc6&#xff09;是一种按照LGPL许可协议发布的开源免费的C语言编译程序。 GNU C库&#xff08;aka glibc或libc6&#xff09;中的stdlib/canonicalize.c处理非常长的路径名参数到realpath函数时&#xff0c;可能会遇到32位体系…

判断平台现货白银价格趋势方法有哪些?

新手投资者面对平台现货白银走势总是束手无策&#xff0c;那是因为新手投资者对市场的运行规律&#xff0c;以及对一些常用的技术分析工具并不熟悉&#xff0c;最后无法判断市场走向&#xff0c;所以交易获利也无从谈起。下面&#xff0c;我们一起来讨论一些可以判别趋势的工具…

imazing是什么软件? iMazing 2.17.3备份神器,iPhone相册管理超方便!!!

相信很多小伙伴们听说过imazing&#xff0c;那么imazing这是一款什么软件呢&#xff0c;imazing是一款iOS设备管理软件&#xff0c;这款软件支持对基于iOS系统的设备进行数据传输与备份。 imazing是什么软件 答&#xff1a;imazing是一款iOS设备管理软件。 imazing是一款iOS设…