6 pygame快速入门|飞机大战经典项目大概介绍

文章目录

  • 安装
  • 快速入门
    • 创建图形化窗口
      • 游戏的开始和退出
      • 坐标系和Rect
      • 创建游戏主窗口
    • 图像绘制
    • 游戏循环和游戏时钟与事件捕捉
      • 动画的实现原理
      • 游戏循环
      • 游戏时钟
      • 事件
    • 精灵和精灵组

安装

pip install pygame

快速入门

创建图形化窗口

游戏的开始和退出

方法说明
pygame.init()导入并初始化所有 pygame 模块,使用其他模块之前,必须先调用init 方法
pygame.quit()卸载所有 pygame 模块,在游戏结束之前调用

实际上就记忆住,在准备开始游戏的时候需要开始加上init 和 最后加上quit

import pygame
pygame.init()
# 编写游戏的代码
print("游戏的代码...")
pygame.quit()

坐标系和Rect

  1. 原点 在 左上角 (0, 0)
  2. x 轴 水平方向向 右,逐渐增加
  3. y 轴 垂直方向向 下,逐渐增加
  4. 一个Rect接口实际上 由位置以及这个矩形自己本身自己的大小构成 Rect(x, y, width, height)
import pygame
hero_rect = pygame.Rect(100, 500, 120, 125)
print("英雄的原点 %d %d" % (hero_rect.x, hero_rect.y))
print("英雄的尺寸 %d %d" % (hero_rect.width, hero_rect.height))
# size 属性会返回矩形区域的 (宽, 高) 元组
print("%d %d" % hero_rect.siz

创建游戏主窗口

pygame 专门提供了一个 模块 pygame.display 用于创建、管理、游戏窗口

方法说明
pygame.display.set_mode()初始化游戏显示窗口
pygame.display.update()刷新屏幕内容显示,稍后使用

set_mode 方法
set_mode(resolution=(0,0), flags=0, depth=0)

  1. 作用 —— 创建游戏显示窗口
  2. 参数 resolution 指定屏幕的 宽 和 高,默认创建的窗口大小和屏幕大小一
    致 flags 参数指定屏幕的附加选项,例如是否全屏等等,默认不需要传
    递 depth 参数表示颜色的位数,默认自动匹配
  3. 返回值 可以理解为游戏的屏幕,游戏的元素都需要被绘制到游戏的屏幕上
import pygame
import time
pygame.init()
# 创建游戏的窗口 480 * 700
screen = pygame.display.set_mode((480, 700))
while True:time.sleep(1)
pygame.quit()

图像绘制

要在屏幕上 看到某一个图像的内容,需要按照三个步骤:
– 使用 pygame.image.load() 加载图像的数据
– 使用 游戏屏幕 对象,调用 blit 方法 将图像绘制到指定位置
– 调用 pygame.display.update() 方法更新整个屏幕的显示

import pygame
pygame.init()
# 创建游戏的窗口 480 * 700
screen = pygame.display.set_mode((480, 700))
# 绘制背景图像
# 1> 加载图像数据
bg = pygame.image.load("./images/background.png")
# 2> blit 绘制图像
screen.blit(bg, (0, 0))
# 3> update 更新屏幕显示
pygame.display.update()
while True:pass
pygame.quit()

可以在 screen 对象完成 所有 blit 方法之后,统一调用一次 display.update 方法,同样可以在屏幕上 看到最终的绘制结果,也就是说前面的blit绘画实际上就是将这个背景画到一张图上(内存?)然后只有等你update之后,才会显示到你的电脑之上。

游戏循环和游戏时钟与事件捕捉

动画的实现原理

  1. 跟电影的原理类似,游戏中的动画效果,本质上是快速的在屏幕上绘制图像电影是将多张静止的电影胶片连续、快速的播放,产生连贯的视觉效果!
  2. 一般在电脑上 每秒绘制60次(帧),就能够达到非常连续高品质的动画效果

游戏循环

游戏一般包括俩个阶段:

  1. 游戏初始化:设置游戏窗口 绘制图像的初始位置 设置游戏时钟等等一些资源的加载都在这一块,也就是写在while循环之外的
  2. 游戏循环:设置刷新帧率 检测用户交互 更新图像位置 更新屏幕显示等等一些不断更新交互的功能都在循环中显示

游戏时钟

  1. pygame 专门提供了一个类 pygame.time.Clock 可以非常方便的设置屏幕绘
    制速度 —— 刷新帧率
  2. 要使用 时钟对象 需要两步:
    1. 在 游戏初始化 创建一个 时钟对象
    2. 在 游戏循环 中让时钟对象调用 tick(帧率) 方法
  3. tick 方法会根据 上次被调用的时间,自动设置 游戏循环 中的延时
# 3. 创建游戏时钟对象
clock = pygame.time.Clock()
i = 0
# 游戏循环
while True:# 设置屏幕刷新帧率,每秒 60 次 或者你可以把tick当作一个delay的过程,实际上就是1/60就是他的delay时间clock.tick(60)print(i)i += 1

样例(一个简单动画的实现):

import pygame
# 游戏的初始化
pygame.init()
# 创建游戏的窗口 480 * 700
screen = pygame.display.set_mode((480, 700))
# 绘制背景图像
bg = pygame.image.load("./images/background.png")
screen.blit(bg, (0, 0))
# pygame.display.update()
# 绘制英雄的飞机
hero = pygame.image.load("./images/me1.png")
screen.blit(hero, (150, 300))
# 可以在所有绘制工作完成之后,统一调用 update 方法
pygame.display.update()
# 创建时钟对象
clock = pygame.time.Clock()
# 1. 定义 rect 记录飞机的初始位置
hero_rect = pygame.Rect(150, 300, 102, 126)
# 游戏循环 -> 意味着游戏的正式开始!
while True:# 可以指定循环体内部的代码执行的频率clock.tick(60)# 2. 修改飞机的位置hero_rect.y -= 1# 判断飞机是否飞出界限,飞出界限就继续从底部开始飞行,这里也可以使用%进行操作if hero_rect.bottom <= 0:hero_rect.y = 700# 3. 调用 blit 方法绘制图像screen.blit(bg, (0, 0))screen.blit(hero, hero_rect)# 4. 调用 update 方法更新显示pygame.display.update()pygame.quit()

事件

事件

  1. 就是游戏启动后,用户针对游戏所做的操作
  2. 例如:点击关闭按钮,点击鼠标,按下键盘… 监听
  3. 在 游戏循环 中,判断用户 具体的操作
    只有 捕获 到用户具体的操作,才能有针对性的做出响应

代码实现:
pygame 中通过 pygame.event.get() 可以获得用户当前所做动作的事件列表
用户可以同一时间做很多事情

import pygame
# 游戏的初始化
pygame.init()
# 创建游戏的窗口 480 * 700
screen = pygame.display.set_mode((480, 700))
# 绘制背景图像
bg = pygame.image.load("./images/background.png")
screen.blit(bg, (0, 0))
# pygame.display.update()
# 绘制英雄的飞机
hero = pygame.image.load("./images/me1.png")
screen.blit(hero, (150, 300))
# 可以在所有绘制工作完成之后,统一调用 update 方法
pygame.display.update()
# 创建时钟对象
clock = pygame.time.Clock()
# 1. 定义 rect 记录飞机的初始位置
hero_rect = pygame.Rect(150, 300, 102, 126)
# 游戏循环 -> 意味着游戏的正式开始!
while True:# 可以指定循环体内部的代码执行的频率clock.tick(60)# 捕获事件event_list = pygame.event.get()if len(event_list) > 0:print(event_list)# 2. 修改飞机的位置hero_rect.y -= 1# 判断飞机的位置if hero_rect.y <= 0:hero_rect.y = 700# 3. 调用 blit 方法绘制图像screen.blit(bg, (0, 0))screen.blit(hero, hero_rect)# 4. 调用 update 方法更新显示pygame.display.update()pygame.quit()

针对退出,我们可以在 while 循环中增加如下代码:

for event in pygame.event.get():# 判断事件类型是否是退出事件 这个退出事件实际上对应的就是最右上角的那个x(关闭的叉叉)if event.type == pygame.QUIT:print("游戏退出...")# quit 卸载所有的模块pygame.quit()# exit() 直接终止当前正在执行的程序exit()

精灵和精灵组

暂时略,后面补

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

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

相关文章

opencv-27 阈值处理 cv2.threshold()

怎么理解阈值处理? 阈值处理&#xff08;Thresholding&#xff09;是一种常用的图像处理技术&#xff0c;在机器学习和计算机视觉中经常被用于二值化图像或二分类任务。它基于设定一个阈值来将像素值进行分类&#xff0c;将像素值大于或小于阈值的部分分为两个不同的类别&…

从Web2到Web3:区块链技术的未来前景

随着互联网的发展&#xff0c;Web1.0、Web2.0 和 Web3.0 成为了人们口中津津乐道的话题。那么&#xff0c;这三种网络时代究竟有什么区别呢&#xff1f; Web1.0 是一个只读的时代&#xff0c;那个时候&#xff0c;用户只能浏览网页&#xff0c;无法进行互动和创作。Web2.0 则是…

UIO:用户空间驱动2007

原文网址&#xff1a;https://lwn.net/Articles/232575 原文作者&#xff1a;corbet 原文时间&#xff1a;2007年5月2日 用户空间驱动这个概念已经有很长时间了&#xff0c;这一次有一个补丁版本已经提交到了Linux2.6.22&#xff0c;这个版本的补丁就是UIO。【因为用户空间驱…

FFMPEG用过的命令记录

转换输入的H264文件参数&#xff0c;其中 b&#xff1a;100k比特率 r&#xff1a;帧率 g&#xff1a;I帧间隔 profilte :编码档次high level:3 -x264opts “bframes0” 去除B帧&#xff0c;或者 -bf 0 -bsf:v “filter_unitsremove_types6” 过滤type为6的帧&#xff0c;既SEI帧…

php-golang-jsonrpc2.0 rpc-codec/jsonrpc2和tivoka/tivoka实践

golang代码&#xff1a; package main import ( "context" "net" "net/rpc" "github.com/powerman/rpc-codec/jsonrpc2" ) type App struct{} type Res struct { Code int json:"code" Msg string json:"msg&quo…

系列二、RocketMQ简介

一、概述 RocketMQ是一款阿里巴巴开源的消息中间件。2016年11月28日&#xff0c;阿里巴巴向Apache软件基金会捐赠RabbitMQ&#xff0c;成为Apache孵化项目。2017年9月25日&#xff0c;Apache宣布RocketMQ孵化成为Apache顶级项目&#xff08;TLP&#xff09;&#xff0c;成为国内…

树莓派微型web服务器——阶段设计报告

文章目录 1. 需求分析1.1 功能需求1.1.1 访问需求1.1.2 自定义域名需求1.1.3 下载公共文件需求1.1.4 用户体验需求 1.2 技术需求1.2.1 操作系统指令1.2.2 技术栈1.2.3 内网穿透 1.3 性能需求1.3.1 处理能力1.3.2 内存1.3.3 存储空间 2. 可行性分析2.1 硬件方面2.2 软件方面 3. …

[Tools: Camera Conventions] NeRF中的相机矩阵估计

参考&#xff1a;NeRF代码解读-相机参数与坐标系变换 - 知乎 在NeRF中&#xff0c;一个重要的步骤是确定射线&#xff08;rays&#xff09;的初始点和方向。根据射线的初始点和方向&#xff0c;和设定射线深度和采样点数量&#xff0c;可以估计该射线成像的像素值。估计得到的…

flutter:animate_do(flutter中的Animate.css)

简介 做过web开发的应该大部分人都知道Animate.css&#xff0c;它为开发者提供了一系列预定义的动画效果&#xff0c;可以通过简单的CSS类来实现各种动画效果。而animate_do 相当于flutter中的Animate.css,它提供了很多定义好的动画效果 基本使用 官方地址 https://pub-web.…

如何启用路由器dhcp?快解析如何内网穿透?

一、什么是DHCP&#xff1f; 动态主机设置协议&#xff08;DHCP&#xff09;是一种使网络管理员能够集中管理和自动分配 IP 网络地址的通信协议。在网络中&#xff0c;每个联网设备都需要分配独有的 IP 地址。并当有新计算机移到网络中的其它位置时&#xff0c;能自动收到新的…

数据结构之常见排序算法

文章目录 1.排序概念2.10种排序比较3.排序算法3.1直接插入排序&#xff08;元素越有序&#xff0c;越高效&#xff09;3.2希尔排序序( 缩小增量排序 )3.3直接选择排序3.5堆排序3.6冒泡排序3.8快速排序 递归实现&#xff08;无序使用最好&#xff09;3.8.1挖坑法 &#xff08;建…

我的第一个后端项目(环境搭建,Springboot项目,运行,接口验证)

一. 安装Java开发工具包&#xff08;JDK&#xff09;&#xff1a; 访问Java Software | OracleOracle官方网站&#xff0c;下载适合你操作系统的最新版本的JDK。安装JDK并设置好JAVA_HOME环境变量。 二. 安装集成开发环境&#xff08;IDE&#xff09;&#xff1a; 推荐使用In…

全方位对比 Postgres 和 MongoDB (2023 版)

本文为「数据库全方位对比系列」第二篇&#xff0c;该系列的首部作品为「全方位对比 Postgres 和 MySQL (2023 版)」 为何对比 Postgres 和 MongoDB 根据 2023 年 Stack Overflow 调研&#xff0c;Postgres 已经成为最受欢迎和渴望的数据库了。 MongoDB 曾连续 4 年 (2017 - …

【高级数据结构】树状数组

目录 树状数组1 &#xff08;单点修改&#xff0c;区间查询&#xff09; 树状数组1 &#xff08;单点修改&#xff0c;区间查询&#xff09; 洛谷&#xff1a;树状数组1https://www.luogu.com.cn/problem/P3374 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行…

MySQL案例——多表查询以及嵌套查询

系列文章目录 MySQL笔记——表的修改查询相关的命令操作 MySQL笔记——MySQL数据库介绍以及在Linux里面安装MySQL数据库&#xff0c;对MySQL数据库的简单操作&#xff0c;MySQL的外接应用程序使用说明 文章目录 系列文章目录 前言 一 创建数据库 1.1 创建一个部门表 1.…

【运维】Linux 跨服务器复制文件文件夹

【运维】Linux 跨服务器复制文件文件夹 如果是云服务 建议用内网ip scp是secure copy的简写&#xff0c;用于在Linux下进行远程拷贝文件的命令&#xff0c;和它类似的命令有cp&#xff0c;不过cp只是在本机进行拷贝不能跨服务器&#xff0c;而且scp传输是加密的。可能会稍微影…

机器学习基础 数据集、特征工程、特征预处理、特征选择 7.27

机器学习基础 1. 数据集 2. 特征工程 3. 学习分类 4. 模型 5. 损失函数 6. 优化 7. 过拟合 8. 欠拟合数据集 又称资料集、数据集合或者资料集合&#xff0c;是一种由数据所组成的集合特征工程 1. 特征需求 2. 特征设计 3. 特征处理特征预处理、特征选择、特征降维 4. 特征验…

C++网络编程 TCP套接字基础知识,利用TCP套接字实现客户端-服务端通信

1. TCP 套接字编程流程 1.1 概念 流式套接字编程针对TCP协议通信&#xff0c;即是面向对象的通信&#xff0c;分为服务端和客户端两部分。 1.2 服务端编程流程&#xff1a; 1&#xff09;加载套接字库&#xff08;使用函数WSAStartup()&#xff09;&#xff0c;创建套接字&…

【Python机器学习】实验04(2) 机器学习应用实践--手动调参

文章目录 机器学习应用实践1.1 准备数据此处进行的调整为&#xff1a;要所有数据进行拆分 1.2 定义假设函数Sigmoid 函数 1.3 定义代价函数1.4 定义梯度下降算法gradient descent(梯度下降) 此处进行的调整为&#xff1a;采用train_x, train_y进行训练 1.5 绘制决策边界1.6 计算…

Spring AOP 中,切点有多少种定义方式?

在 Spring AOP 中&#xff0c;我们最常用的切点定义方式主要是两种&#xff1a; 使用 execution 进行无侵入拦截。使用注解进行拦截。 这应该是是小伙伴们日常工作中使用最多的两种切点定义方式了。但是除了这两种还有没有其他的呢&#xff1f;今天松哥就来和大家聊一聊这个话…