美文网首页
Pygame第1-1课:入门

Pygame第1-1课:入门

作者: __豆约翰__ | 来源:发表于2019-02-11 08:30 被阅读50次

什么是Pygame?

Pygame是一个“游戏库” - 一组帮助程序员制作游戏的工具。其中一些是:

  • 图形和动画
  • 声音(包括音乐)
  • 控制(键盘,鼠标,游戏手柄等)

游戏循环

每个游戏的核心都是一个循环,我们将其称为“游戏循环”。这个循环一直在不断运行,一遍又一遍地完成游戏工作所需的所有事情。每次游戏通过此循环称为

游戏框架,主要处理3件事情

1.程序输入(或事件)

这意味着你想要注意的游戏之外的任何东西 - 你需要游戏回应的任何东西。这些可能是键盘上按下的键,点击鼠标等。

2.更新游戏

这意味着更改需要在此框架上更改的任何内容。如果角色在空中,重力需要将其拉下来。如果两个对象相互碰撞,则需要爆炸。

3.渲染(或绘制)

在此步骤中,我们在屏幕上绘制所有内容。必须在屏幕上的正确,更新位置绘制背景,角色,菜单或玩家需要看到的任何其他内容。

时钟

循环的另一个重要方面是控制整个循环的运行速度。您可能听说过FPS这个术语,它代表每秒帧数。这意味着这个循环每秒应发生多少次。这很重要,因为您不希望游戏运行得太快或太慢。你也不希望它在不同的计算机上以不同的速度运行 - 如果你的角色在屏幕上运行需要10秒钟,那么无论它发生在什么计算机上都应该如此。

构建Pygame框架模板

既然我们知道我们需要使游戏工作的部分,我们就可以开始编写一些代码了。首先,我们将制作一个简单的pygame程序,除了打开一个窗口并运行游戏循环之外什么都不做。对于您想要制作的任何pygame项目,这将是一个很好的起点。

在我们程序的顶部,我们将导入我们需要的库并为我们的游戏选项设置一些变量:

# Pygame template - skeleton for a new pygame project
import pygame
import random

WIDTH = 360  # width of our game window
HEIGHT = 480 # height of our game window
FPS = 30 # frames per second

接下来我们需要打开游戏窗口:

# initialize pygame and create window
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指的是我们的游戏屏幕,我们按照我们在配置常量中设置的大小创建它。最后,我们创建了一个,clock时钟以便我们能够确保我们的游戏以我们想要的FPS运行。

现在是时候让游戏循环:

# Game Loop
running = True
while running:
    # Process input (events)
    # Update
    # Render (draw)

这是我们的游戏循环,它是while由变量控制的循环running。如果我们希望游戏结束,我们只需要设置runningFalse循环就会结束。现在我们可以用一些基本代码填写每个部分。

渲染/绘制部分

我们将从Draw部分开始。我们还没有任何角色,但我们可以用纯色填充屏幕。要做到这一点,我们需要谈谈计算机如何处理颜色。

电脑屏幕由像素组成,这些像素有3个部分:红色,绿色和蓝色。每个部件点亮多少会决定像素的颜色,如下所示:

image

三原色中的每一个可以具有介于0(包含)和255(不包含)之间的值,因此对于三种基色中的每一种,存在256种不同的可能性。以下是您可以制作的一些颜色示例:

image

您可以通过乘法找到计算机可以显示的颜色总数:

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

然后我们可以让我们的绘图部分填满屏幕。

    # Draw / render
    screen.fill(BLACK)

但是,由于计算机显示的工作方式,这还不够。更改屏幕上的像素意味着告诉视频卡告诉显示器更改实际像素。从计算机的角度来看,这是一个非常非常缓慢的过程。因此,如果你在屏幕上绘制了很多东西,那么绘制它们可能需要很长时间。我们可以通过使用称为双缓冲的东西以巧妙的方式解决这个问题。这听起来很奇特,但它真的只是意味着:

想象一下,我们有一个双面白板,可以翻转显示一侧或另一侧。前面是显示器(玩家看到的屏幕),而后面是隐藏的,只有计算机可以“看到”它。每一帧,我们都在背面绘制所有图画 - 每个角色,每个子弹,每个闪耀的光线等等。然后,当我们完成后,我们将棋盘翻转并显示新的框架。这意味着我们只是每帧执行一次与显示器交谈的缓慢过程,而不是屏幕上的每一件事。

所有这些都在pygame中自动发生。完成绘图后,您只需要告诉它翻转白板。实际上,命令甚至命名为flip()

    # Draw / render
    screen.fill(BLACK)
    # *after* drawing everything, flip the display
    pygame.display.flip()

只要确保你总是做到flip() 最后。如果你试图在翻转后画一些东西,它将不会被看到!

输入/事件部分

我们还没有游戏,所以我们无法真正说出我们想要听的键或鼠标按钮或其他控件。但是,我们需要设置一个重要事件。如果您现在尝试运行该程序,您会发现您遇到了问题:无法关闭窗口!单击角落中的“X”不起作用。那是因为那实际上是一个事件,我们需要告诉我们的程序监听该事件并让它退出游戏。

事件可以随时发生。如果玩家在更新或绘制部分循环时点击“跳转”按钮怎么办?你不想忽略那个输入 - 玩家会感到沮丧。所以Pygame所做的就是保存自上一帧以来发生的所有事件。这样,如果玩家快速捣碎大量按钮,您可以确保了解所有这些按钮。这将是一个列表,所以我们运行一个for循环来查看所有这些:

    for event in pygame.event.get():
        # check for closing window
        if event.type == pygame.QUIT:
            running = False

Pygame有很多可以找到的事件。 pygame.QUIT是单击“X”时发生的事件,因此我们设置runningFalse并且游戏循环将结束。

控制FPS

我们还没有任何东西要放在“更新”部分,但我们仍然需要确保使用我们的FPS设置来控制速度。我们可以这样做:

while running:
    # keep loop running at the right speed
    clock.tick(FPS)

tick()命令告诉pygame弄清楚循环花了多长时间,然后暂停一段时间,使整个循环(意味着整个帧)持续适当的时间。如果我们设置FPS为30,这意味着我们需要框架每个循环将持续1 / 30(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项目时都可以重复使用它。

在下一个教程中,我们将使用此模板作为学习如何在屏幕上绘制对象并让它们四处移动的起点。

相关文章

网友评论

      本文标题:Pygame第1-1课:入门

      本文链接:https://www.haomeiwen.com/subject/symedqtx.html