python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Pygame太空射击

Pygame游戏开发之太空射击实战入门篇

作者:acktomas

相信大多数8090后都玩过太空射击游戏,在过去游戏不多的年代太空射击自然属于经典好玩的一款了,今天我们来自己动手实现它,在编写学习中回顾过往展望未来,下面开始入门篇

视频

观看视频

入门

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()

在下一教程中,我们将使用此模板作为学习如何在屏幕上绘制对象并使其移动。

到此这篇关于Pygame游戏开发之太空射击实战入门篇的文章就介绍到这了,更多相关Pygame太空射击内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文