正如我所说的,PyGame是基于图形用户界面环境的。此外,PYGAME的输入/输出格式非常适合制作2D游戏。所以,你不得不告别Python的打印或输入标准函数(因为它们只在CUI环境下工作)。那么,PyGame中的哪些函数取代了这些函数呢?首先,我们必须回到友好的《Hello World!》项目,该项目正在学习基本模板和输出。 (需要同一项目目录中的任何字体文件(.ttf))

../../../../_images/Basic-ouput-sourcecode.png
 1import sys, pygame
 2pygame.init()
 3
 4size = width, height = 220, 140
 5speed = [2, 2]
 6black = 0, 0, 0
 7
 8screen = pygame.display.set_mode(size)
 9
10ball = pygame.image.load("Basic-ouput-sourcecode.png")
11ballrect = ball.get_rect()
12
13while True:
14    for event in pygame.event.get():
15        if event.type == pygame.QUIT: sys.exit()
16
17    ballrect = ballrect.move(speed)
18    if ballrect.left < 0 or ballrect.right > width:
19        speed[0] = -speed[0]
20    if ballrect.top < 0 or ballrect.bottom > height:
21        speed[1] = -speed[1]
22
23    screen.fill(black)
24    screen.blit(ball, ballrect)
25    pygame.display.flip()
../../../../_images/Bagic-ouput-result-screen.png
 1import sys, pygame
 2pygame.init()
 3
 4size = width, height = 220, 140
 5speed = [2, 2]
 6black = 0, 0, 0
 7
 8screen = pygame.display.set_mode(size)
 9
10ball = pygame.image.load("Bagic-ouput-result-screen.png")
11ballrect = ball.get_rect()
12
13while True:
14    for event in pygame.event.get():
15        if event.type == pygame.QUIT: sys.exit()
16
17    ballrect = ballrect.move(speed)
18    if ballrect.left < 0 or ballrect.right > width:
19        speed[0] = -speed[0]
20    if ballrect.top < 0 or ballrect.bottom > height:
21        speed[1] = -speed[1]
22
23    screen.fill(black)
24    screen.blit(ball, ballrect)
25    pygame.display.flip()

(Hello World项目的源代码及其结果屏幕)

哇,这与python的print(“Hello World”)(只有一行命令)相比复杂多了。这是因为图形用户界面环境中的文本有5个组件:文本内容、字体、大小、颜色和位置。如果你想将任何文本打印到屏幕上,你必须设置其他4个组件,而不仅仅是字符串(除非它是在图形用户界面环境中)。仅限 pygame.display.set_caption(“Hello World Project”) 7中的函数执行与python的print相同的函数(“Hello World Project”)。唯一的区别是输出字符串始终显示在窗口标题上(当前程序的标题)

首先,在了解如何输出一些东西之前,先看看源代码的模板,源代码可以分为4个部分:Header(#1-#2)、初始语句(#3-#12)、Always语句(#13-#20)和事件语句(#16-#19)。

在……里面 标题 ,将执行导入模块。 import pygame, sys 是永远需要的。不用说,因为这是一个假游戏项目,当玩家想要退出时,游戏必须终止 (sys.exit() 排在第19位)。 from pygame.locals import* 也是使用有用常量所必需的,就像 QUIT 在第17位。在 初始声明 (无限循环前的命令),一些全局值将被初始化,一些函数将被调用一次。全局值就像颜色一样,必须在这里初始化,以增加可读性。记住,这是一个五颜六色的图形用户界面。颜色有三种成分:红色、绿色和蓝色。因此,颜色值必须进行初始化,就像 red = (255, 0, 0) 。名为的函数 pygame.init() 必须在调用其他pyGame函数之前调用。然后可以执行其他的假游戏功能。(其他电子游戏功能将在后面解释。)

在……里面 Always语句 (无限循环内的命令),一些全局值将被例程更新,一些函数将被例程调用,除非它们被包含在条件语句中。名为的函数 pygame.display.update() 应在每个进程完成后调用。因为这个功能是将处理结果打印到屏幕上(=监视器)。如果在Always语句的最后部分没有执行此函数,则当前屏幕和内部数据可能不匹配。(其他电子游戏功能将在后面解释。)

在……里面 事件语句 (循环中的命令,检查每个可能的事件),当某个事件被触发时,将有合适的条件语句。 pygame.event.get() 函数在ALWAYS语句中返回进程发生的事件列表。该列表自动按时间排列(从最旧到最新)。因此,使用For-In语句,可以从过程上解决由Always语句引起的每个触发事件。(请注意,这是事件驱动的特点。)例如,#17-#19中的命令将处理退出事件。在这种情况下,PYGAME将被终止,然后系统将被终止,因为系统必须在PYGAME终止之后才被终止!(其他事件将在稍后解释。)

关于这个模板是固定的,那么我们可以在正确的位置添加特殊的函数来打印“Hello World!”。首先,我们需要设置 fontsizepygame.font.Font(“HoonWhiteCatR,ttf”, 32) 位于#9的函数不仅将通过TTF文件设置字体,还将设置大小(32)。此函数的返回值需要存储到Object(=myTextFont)中。然后将myTextFont的成员函数命名为 render(“Hello World!”, True, red, green) At#10将返回值(=myText)。渲染功能可以设置 文本内容颜色 (红色是文本的颜色,绿色是文本外区域的颜色)。然后将myText的成员函数命名为 get_rect() At#11将返回值(=myTextArea)。MyTextArea是指分配给打印文本的区域。当调用get_rect()时,返回一个对应于文本长度和字体大小的矩形区域。现在,我们要做的就是找出这片区域的位置。如果我们将myTextArea的成员值更改为 center 在#12进入屏幕中央,然后是文本的中心 位置 将成为屏幕的中心。

但如何确定屏幕的中心在哪里呢?首先,我们必须确定屏幕的范围,通过使用 pygame.display.set_mode((640,480)) 在#8中,将生成画布(其中,调用display.update时将绘制所有具有大小、颜色、位置的值),其大小为640x480。那么,它的中心正好是(320,240)。如果给定了总尺寸,我们可以决定任何位置,甚至只需很少的计算就能计算出一些边距(请记住,在2D GUI中,所有内容都有x和y,必须打印)(就像海龟图形一样,如果它消失了 对,x增加了 ,如果它走了 downY增长 。别搞混了!)。我们知道,我提到的所有函数都将被放入初始语句中,因为这些信息在程序进行时是固定的。虽然一切都是固定的,但由于Fill和Blit函数的特点,我们必须设计这些函数来放入Always语句中。 fill(white) #14中的功能是指用单一颜色(白色)填充画布。 blit(myText, myTextArea) #15中的函数表示在画布的特定位置(=myTextArea)上绘制特定对象(=myText)。请注意,绘制(Blit)必须在填充(Fill)之后进行。当所有的东西都绘制在画布上时,画布的结果将在display.update执行时显示到窗口上。

这就是对整个源代码的解释,它有20行。仅用20行代码理解源代码似乎花费了太多时间。但是,添加或更改此源代码并不困难,因为我们了解此源代码的模板和打印步骤。在此源代码中添加流程逻辑如何?这将是下一个项目。

<参考代码>::

import pygame, sys #1
from pygame.locals import* #2

white = (255,255,255) #3
red = (255,0,0) #4
green = (0,255,0) #5
pygame.init() #6
pygame.display.set_caption("Hello World Project") #7
myScreen = pygame.display.set_mode((640, 480)) #8
myTextFont = pygame.font.Font("HoonWhitecatR.ttf", 32) #9
myText = myTextFont.render("Hello World!", True, red, green) #10
myTextArea = myText.get_rect() #11
myTextArea.center = (320, 240) #12

while True: #13
    myScreen.fill(white) #14
    myScreen.blit(myText, myTextArea) #15

    for event in pygame.event.get(): #16
        if event.type == QUIT: #17
            pygame.quit() #18
            sys.exit() #19

    pygame.display.update() #20



Edit on GitHub