Pygame(一)--绘声绘色的小世界

Pygame(一)--绘声绘色的小世界

Hello,阿呆又回来啦~

这是本期的素材,请各位看官收好:

链接:pan.baidu.com/s/1cZa7a4

提取码:2wul

这一期,我们主要讲如何讲pygame导入与初始化、载入图像与声音、主循环等内容。

准备好了吗?

在开始操作Spyder之前,我们需要将代码进行保存,以防不必要的悲剧发生~我是在D盘建立了一个名为firstblood的文件夹,随后,复制文件夹的地址栏:

打开Spyder,粘贴到Spyder的文件地址栏中:

点击屏幕左上角:file>save as,将文件命名为firstblood_1,保存到firstblood文件夹中。此时,Editor区域就变成了如下图所示的样子:

一、导入与初始化:

在pygame中,导入和初始化是一个非常简单的过程。有多简单呢?

1.1 导入

首先,我们必须导入pygame包:

# filename is: firstblood_1.py
# import zone
import pygame

1.2 初始化

# initialize pygame
pygame.init()

二、创建一个Pygame窗口

2.1 黑黑的、无法关闭的窗口

# create a screen
screen = pygame.display.set_mode([800,600])

Pygame最重要的部分是表面。我们可以把表面想象成一张白纸。你可以用表面做很多事情:画线、填充颜色、复制图像等。这个表面可以是任何尺寸的,我们设置的是800(宽)*600(高)的大小。试着运行这个程序,你会发现有一个无法关闭的黑黑窗口~是的,程序不是你想关,想关就能关的~

2.2 使窗口正常工作

Pygame的作用就是为了创建游戏,需要与玩家不断互动,所以需要有一个事件循环一直运行。Windows操作系统使用的是事件驱动程序,这种程序基本上是“原地不动”,等着事件自投罗网,接着会做出反应来处理事件。为了让事件驱动系统“看到”事件发生,它必须不断“寻找”事件,这种特殊的循环成为事件循环。我们采用while来执行这种循环。

# LOOP: mRunning
mRunning = True
while mRunning:

接着,我们要增加一个事件处理器。 Pygame 包括多个不同模块,我们将使用的模块是 pygame.event。用pygame.event.get() 方法从事件队列得到所有事件的一个列表。 for 循环迭代处理这个列表中的每一个事件,如果看到一个 QUIT 事件, 它会将mRunning 设置为False, 这会导致 while 循环结束,并结束程序:

for event in pygame.event.get():
if event.type == pygame.QUIT:
mRunning = False
pygame.quit()

运行以上代码,你就会看到一个能正常工作的窗口啦~点击菜单栏中的绿色小箭头,运行程序(后面关于如何运行程序就不赘述啦):

三、翻转(flip)

对于 Pygame 窗口中显示的所有内容, Pygame 中的显示对象(screen) 都会有这些内容的两个副本。我们可以把这两个副本当作一个“当前屏”和一个“下一屏”。 当前屏就是我们现在看到的, 下一屏是完成“翻转”之后看到的。 做完“下一屏”上的所有修改后, 再翻转到下一屏, 就能看到这些改变。这样以来,我们对图形多次修改后会flip到图形的新版本,而不是每次对图形做一个小小的修改时都更新显示,从而让动画更流畅,更新速度更快。

这个怎样实现呢?我们在2.1的代码之后,用白色背景填充窗口,Pygame中使用的颜色系统是RGB,每个颜色对应0-255的数,由一个包含三个整数的列表组成。白色由[255,255,255]表示,最后别忘了翻转呀~

# fill with color WHITE
screen.fill([255,255,255])
# flip
pygame.display.flip()

这样,我们就得到了一个白家兄弟~运行程序:

四、插入图像(pygame.image)

在 Pygame 中,使用图像最简单的方法就是利用 image 函数。我们将图片也放在firstblood文件夹中。现将这个图片赋予一个变量jpgFileName,为了少出错,我们在Variable Explore中将jpgFileName对应的值进行复制,粘贴到代码中:

# load and show the image of lanbo
jpgFileName = 'lanbo800_600.jpg'

pygame.image模块有一个load()函数,可以帮我们加载图片:

imgRect = pygame.image.load(jpgFileName)

图片加载完成后,我们需要将像素从一个地方复制到另一个地方。像素复制在编程中有一个特殊的名字,叫做块移(blitting)。它可以帮助我们将一个图像从一个地方“块移”(就是复制啦)到另一个地方。移到哪里呢?我们需要设定一个起始位置,即: x 轴(水平方向)、y 轴(垂直方向)。 在 Pygame 中, 这两个数是从从窗口左上角的 [0, 0] 坐标开始的。

screen.blit(imgRect,[0,0])

运行以上代码,有一个硬汉在等你~

五、播放声音(pygame.mixer)

看着史泰龙严肃的表情,想不想知道他在说些啥呢?

Pygame 有一个处理声音的模块, 名为 pygame.mixer。 在真实世界中,取不同的声音并把它们混合在一起的设备叫做“混音器”(mixer),Pygame 中的模块也正是因此得名。

我们将声音文件(.wav)也放在firstblood文件夹中。现将这个声音赋予一个变量wavFileName,为了少出错,我们在Variable Explore中将wavFileName对应的值进行复制,粘贴到代码中:

# load and show the sound of firstblood
wavFileName = 'FirstBlood.wav'

Pygame 会使用 mixer 中的 music 模块来播放音乐:

sndTrack = pygame.mixer.music.load(wavFileName)
pygame.mixer.music.play()

运行以上代码,你就知道答案啦~

最后,献上完整代码:

# filename is: firstblood_1.py

# import zone
import pygame
# initialize pygame
pygame.init()
# create a screen
screen = pygame.display.set_mode([800,600])
# fill with color WHITE
screen.fill([255,255,255])
# load and show the image of lanbo
jpgFileName = 'lanbo800_600.jpg'
imgRect = pygame.image.load(jpgFileName)
screen.blit(imgRect,[0,0])
# load and show the sound of firstblood
wavFileName = 'FirstBlood.wav'
sndTrack = pygame.mixer.music.load(wavFileName)
pygame.mixer.music.play()
# flip
pygame.display.flip()
# LOOP: mRunning
mRunning = True
while mRunning:
for event in pygame.event.get():
if event.type == pygame.QUIT:
mRunning = False
pygame.quit()

是不是有点意犹未尽的赶脚?那就静等阿呆我发大招吧~

再(一次)见哦~

编辑于 2019-04-14 07:21