Pygame游戏开发之太空射击实战入门篇
作者:acktomas 发布时间:2023-07-17 23:12:42
视频
观看视频
入门
pygame
这是我们教程系列“使用 Pygame 进行游戏开发”的第 1 部分。它适用于对游戏开发和提高Python编码技能感兴趣的初学者/中级程序员。
什么是Pygame
Pygame是一个“游戏库” - 一套帮助程序员制作游戏的工具。其中一些内容是:
图形和动画
声音(包括音乐)
控制(键盘、鼠标、游戏手柄等)
游戏循环
每个游戏的核心都是一个循环,我们称之为“游戏循环”。这个循环不断运行,一遍又一遍,做所有使游戏工作需要做的事情。每次游戏经历此循环时,称为帧。
每个帧,可能会发生许多不同的事情,但它们可以组织成三个不同的类别:
1. 处理输入(或事件)
游戏需要响应的任何内容。这些可能是键盘按键,鼠标移动等。
2. 更新游戏
更改框架上需要更改的任何内容。如果一个角色在空中,重力需要把它拉下来。如果两个物体相互碰撞,它们需要 * 。
3. 渲染(或绘制)
在此步骤中,我们将在屏幕上绘制所有内容。背景、角色、菜单或玩家需要查看的任何其他内容都必须在屏幕上的正确位置绘制。
时钟
循环的另一个重要方面是控制整个循环的运行速度。您可能听说过术语FPS,它代表每秒帧数。这意味着此循环每秒应发生多少次。这很重要,因为您不希望游戏运行得太快或太慢。你也不希望它在不同的计算机上以不同的速度运行 。
构建 Pygame 模板
现在我们知道了使游戏正常工作需要哪些部分,我们可以开始编写一些代码了。首先,我们将制作一个简单的pygame程序,除了打开一个窗口并运行游戏循环之外,什么都不做。对于您想要制作的任何pygame项目来说,这都将是一个很好的起点。
在程序的顶部,我们将导入所需的库,并为游戏选项设置一些变量:
# Pygame 模板 - 游戏框架
import pygame
import random
WIDTH = 360 # 游戏窗口宽度
HEIGHT = 480 # 游戏窗口高度
FPS = 30 # 每秒帧数
接下来我们需要打开游戏窗口:
# 初始化pygame,创建窗口
pygame.init()
pygame.mixer.init() # for sound
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("My Game")
clock = pygame.time.Clock()
pygame.init()
是启动pygame并“初始化”。 将以screen
建立游戏屏幕。最后,我们创建了一个能够确保游戏以我们想要的FPS运行的 clock
接下来是游戏循环了:
# 游戏循环
running = True
while running:
# Process input (events)
# Update
# Render (draw)
这是我们的游戏循环,它是一个由变量控制的循环。如果我们想让游戏结束,只需要设置running = False
就会结束循环。现在我们可以用一些基本代码填充每个部分。
渲染/绘制部分
我们将从*“绘制*”部分开始。我们还没有任何代码,但我们可以用纯色填充屏幕。为此,我们需要讨论计算机如何处理颜色。
计算机屏幕由像素组成,这些像素有 3 个部分:红色、绿色和蓝色。每个部分被点亮的程度决定了该像素是什么颜色,如下所示:
三种原色中的每一种都可以具有介于 0(关闭)和 255(100% 打开)之间的值,因此三种原色中的每一种都有 256 种不同的可能性。以下是您可以制作的一些颜色的一些示例:
您可以通过乘法找到计算机可以显示的颜色总数:
>>> 256 * 256 * 256 = 16,777,216
现在我们已经了解了颜色,让我们在程序的顶部定义一些:
# Colors (R, G, B)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
然后我们可以用黑色填充屏幕。
# 绘制、渲染
screen.fill(BLACK)
对于计算机显示的工作方式,这还不够。更改屏幕上的像素意味着让显卡告诉监视器更改实际像素。在计算机方面,这是一个非常非常缓慢的过程。因此,如果您在屏幕上要绘制很多东西,则可能需要很长时间才能全部绘制出来。我们可以通过使用称为双缓冲的东西以一种聪明的方式解决这个问题。这听起来很花哨,但它实际上只是意味着:
想象一下,我们有一个双面白板,可以翻转以显示一面或另一面。正面将是显示器(玩家看到的屏幕),而背面是隐藏的,只有计算机才能“看到”它。每一帧,我们所有的绘画都在背面。然后,当我们完成后,我们将板翻转过来并显示新框架。这意味着我们只做一个缓慢的过程,每帧与显示器交谈一次,而不是屏幕上的每一件事都这样做。
所有这些都在pygame中自动发生。你只需要告诉它当你完成绘图时翻转白板。实际上,该命令甚至被命名为:flip()
# 绘制、渲染
screen.fill(BLACK)
# 绘制所有的事情后翻转显示
pygame.display.flip()
如果你在flip()
翻转后尝试画一些东西,它们不会显示在屏幕上!
输入/事件部分
我们还没有游戏,所以我们不能准确说出想要监听的键盘或鼠标按钮或其他控制事件。
如果您现在尝试运行该程序,您会发现自己遇到了问题:无法关闭窗口!单击角落中的“X”不起作用。那是因为这是一个事件,我们需要告诉我们的程序监听该事件并让它退出游戏。
事件可能随时发生。如果玩家在更新或绘制循环部分时单击“跳转”按钮,该怎么办?不要忽略这个输入, 玩家会感到沮丧。因此,Pygame所做的就是保存自上一帧以来发生的所有事件。这样,即使玩家快速捣碎许多按键,也能记录下来所有这些按钮。所有事件存放在一个列表,因此我们运行一个for
循环来查看所有事件:
for event in pygame.event.get():
# 检查屏幕关闭事件
if event.type == pygame.QUIT:
running = False
Pygame有很多事件。 pygame.QUIT
是单击“X”时发生的事件,因此我们设置running=False
,游戏循环将结束。
控制屏幕刷新频率
我们还没有在“更新”部分中放入任何内容,但我们仍然需要使用FPS
的设置来控制速度。我们可以这样做:
while running:
# 保证以正常的速率循环
clock.tick(FPS)
'tick()'
命令告诉 pygame 每次循环需要多长时间,然后暂停多长时间,以使整个循环(即整个帧)持续正确的时间。如果我们设置FPS
为 30,则意味着我们希望帧持续 1 30 \frac{1}{30} 301 或 0.03 秒。例如,如果我们的循环代码(更新,绘制等)只需要0.01秒,那么pygame将等待0.02秒。
结束语
最后,让我们确保当游戏循环结束时,我们实际上会破坏游戏窗口。通过将pygame.quit()
放在代码的最后来做到这一点。所以我们的最终pygame模板看起来像这样:
# Pygame template - skeleton for a new pygame project
import pygame
import random
WIDTH = 360
HEIGHT = 480
FPS = 30
# define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
# initialize pygame and create window
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("My Game")
clock = pygame.time.Clock()
# Game loop
running = True
while running:
# keep loop running at the right speed
clock.tick(FPS)
# Process input (events)
for event in pygame.event.get():
# check for closing window
if event.type == pygame.QUIT:
running = False
# Update
# Draw / render
screen.fill(BLACK)
# *after* drawing everything, flip the display
pygame.display.flip()
pygame.quit()
祝贺!你有一个有效的Pygame模板。用一个pygame template.py
名字保存这个文件,这样你就可以在每次开始一个新的Pygame项目时重复使用它。
本部分代码
import pygame
import random
# WIDTH, HEIGHT = 360, 480
# WIDTH, HEIGHT = (360, 480)
# WIDTH = 360
# HEIGHT = 480
# SCREEN_SIZE = (WIDTH, HEIGHT)
SCREEN_SIZE = WIDTH, HEIGHT = 360, 480
FPS = 30
# Colors (R, G, B)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE)
pygame.display.set_caption("my game")
clock = pygame.time.Clock()
running = True
while running:
clock.tick(FPS)
# 1. 事件
for e in pygame.event.get():
if e.type == pygame.QUIT:
running = False
# 2. 更新组件状态
# 3. 绘制图像
screen.fill(BLACK)
pygame.display.flip()
在下一教程中,我们将使用此模板作为学习如何在屏幕上绘制对象并使其移动。
来源:https://acktomas.blog.csdn.net/article/details/125933980
猜你喜欢
- 前言还是最近在做的一个小项目,后端用的是Django搭配RestFramework做接口,前端第一次尝试用京东开源的Taro框架来做多端(目
- 1、opencc-python首先介绍opencc中的Python实现库,它具有安装简单,翻译准确,使用方便等优点。对于我们日常的需求完全能
- 前言相信大家在工作无聊时,总想掏出手机,看看微博热搜在讨论什么有趣的话题,但又不方便直接打开微博浏览,今天就和大家分享一个有趣的小爬虫,定时
- ASP正则表达式,RegExp对象提供简单的正则表达式支持功能。RegExp对象的用法: Function RegExpTest(
- Tornado是一种 Web 服务器软件的开源版本。Tornado 和主流Web 服务器框架(包括大多数 Python 的框架)有着明显的区
- 人工生命—群集智能—蚁群算法js版前言(摘自网上,代码是自己想出来的)对于普通大众来说,“人工生命”、“群集智能”、“仿生机器人”等等可能是
- 初学初用,随手记录以当作笔记使用,会慢慢再进行补充添加,错误之处烦请指正。(1)运行本地文件,在代码不加载的情况下可以直接显示结果% run
- 人脸检测方法有许多,比如opencv自带的人脸Haar特征分类器和dlib人脸检测方法等。对于opencv的人脸检测方法,有点是简单,快速;
- 一、requests库requests是使用Apache2 licensed 许可证的HTTP库。比urllib模块更简洁。Request支
- Postman的脚本可以导出多种语言的脚本,方便二次维护开发。Python的requests库,支持python2和python3,用于发送
- ping的原理是发送一个ICMP请求包,然后根据目的地址的应答包来判断是否能够和这个主机进行通信。我们使用python实现,借助于scapy
- 本文实例讲述了thinkPHP框架通过Redis实现增删改查操作的方法。分享给大家供大家参考,具体如下:一、概述Redis是一个NoSQL数
- 为啥要写这个脚本五一前的准备下班的时候,看到同事为了做数据库的某个表的数据字典,在做一个复杂的人工操作,就是一个字段一个字段的纯手撸,那速度
- 前言提示:在管理服务器的过程中,发现有很多服务器在启动的过程中默认以PXE方式启动,这就导致我们无法将PXE装机程序放开到所有的交换机端口中
- Web 设计离不开调色板,现成的调色板多不胜数,不管是 Windows 标准色板,还是 Web 标准色板,还是 Pantone 色板,它们虽
- 前面已经介绍过如何创建scrapy的项目,和对项目中的文件功能的基本介绍。这次,就来谈谈使用的基本流程:(1)首先第一点,打开终端,找到自己
- 类的私有属性和方法Python是个开放的语言,默认情况下所有的属性和方法都是公开的 或者叫公有方法,不像C++和 Java中有明确的publ
- 前言:今天我教大家如何利用Python自动化操作Excel,包括:介绍操作Excel的工具包、安装方法及操作Excel具体方法。对于每天有大
- 本文实例讲述了wxPython窗口的继承机制,分享给大家供大家参考。具体分析如下:示例代码如下:import wx class
- 本文实例为大家分享了Python/C++实现字符串逆序的具体代码,供大家参考,具体内容如下题目描述:将字符串逆序输出Python实现一:借助