Pygame学习笔记(一):Pygame介绍

学习资料:《Python Pygame Introduction》

Pygame初体验

直接从例程上手,是理解一个新的代码库最好的方法。下面来看一个例子,它可以让一个小球在屏幕上弹跳。(可直接下载这张图片)

ball

#!/usr/bin/env python
import sys
import pygame
pygame.init()

size = width, height = 320, 240
speed = [2, 2]
black = 0, 0, 0

screen = pygame.display.set_mode(size)

ball = pygame.image.load('ball.gif')
ballrect = ball.get_rect()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    ballrect = ballrect.move(speed)
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = -speed[1]

    screen.fill(black)
    screen.blit(ball, ballrect)
    pygame.display.flip()

首先,我们使用“import pygame”导入了Pygame的所有模块,然后调用“pygame.init()”对这些模块进行初始化。

第10行,我们通过“pygame.display.set_mode()”创建了一个图形窗口。Pygame使用Surface对象来表示图像,“display.set_mode()”函数创建了一个新的Surface对象来表示实际显示出的图形(graphics)。在这个Surface上绘制的任何东西,都会在显示器上看到。

第12行,我们加载了球的图片。Pygame支持很多图片格式,包括 JPG、PNG、TGA、GIF。“pygame.image.load()”函数,返回一个包含ball.gif数据的Surface对象(它不会改变原图中的色彩值和透明度)。然后创建了一个Rect类型,名为ballrect的变量。

到了第15行,我们的程序已经初始化完成,准备好运行了。在这个无限循环中,我们检查了用户输入,对球进行移动,然后再把球画出来。GUI程序开发,都是采用事件驱动模型,Pygame也不例外。如果接收到了QUIT事件,就直接调用“sys.exit()”退出,Pygame会确保程序正常关闭(不必担心空指针、内存泄漏之类的问题)。

第20-24行,通过更改ballrect的值来更新球的位置。如果球到了上/下边界,就让它的速度反向。

第26行,我们通过填充黑色(black),对整个屏幕进行了擦除。至于为什么这么做,可以去了解一下动画原理。

第27行,我们画出了球的图像。图像的绘制是由“Surface.blit()”方法处理的。blit的基本含义是,把像素点的颜色值从一个图像拷贝到另一个图像上。我们向这个方法传递了一个用于拷贝的Surface源(ball),以及这些像素点出现在目标图像上的位置(ballrect)。

最后一步是更新程序的显示界面(display)。Pygame用了两个缓冲区(buffer)来管理显示界面。当我们的绘制工作完成之后,调用“pygame.display.flip()”,使得我们在screen这个Surface对象上绘制的内容可见。缓存机制可以确保我们只能看见绘制完成之后的帧,如果没有它的话,在screen的创建过程中,用户会看见绘制到一半的屏幕。

以上完成了对Pygame使用方法的一个简单介绍。Pygame还有很多模块可以做一些有趣的事,比如:

  • 处理键盘、鼠标、操纵杆等输入方式。
  • 混合音频,对音乐文件解码。
  • 通过Surface绘制简单的图形、图片,并对它们进行旋转、缩放操作。甚至通过Python数组,实时操作图片的像素点。
  • 支持MPEG视频播放,音频CD播放。
  • 作为PyOpenGL的跨平台展示层。(这一点,也许Pyglet做得更好?)

大部分Pygame的模块都是用C写的,极少数用Python实现。Pygame的程序包里带有一些示例程序,如monkey punching和UFO shooting。

Python与游戏

(具体见本文顶部的学习资料)Python和SDL很适合开发2D游戏,曾用于开发多款大型游戏。但同样有一定的限制,由于SDL的某些设计缺陷,它并不适用于所有类型的游戏。

Pygame是比较底层的库,所以在实际游戏开发中,需要自己封装一些常用的功能函数。这样的好处是,你的程序可以完全掌控所有方面;坏处是,需要写大量的代码来构建一个相对先进的开发框架。你必须深入理解你在做什么。

保持简单(keep it simple)。如果你准备创作你的第一个游戏作品,需要学习很多内容。就算是很简单的游戏,也是对你设计能力的挑战。复杂的游戏,不一定等于好玩的游戏。当你学会了Python,可以使用Pygame在一两周之内创造出一个简单的游戏。然后,你需要花费大量的时间和精力,慢慢完善细节,让它达到可以向别人展示的程度。

Pygame模块总览

cdrom manage cdrom devices and audio playback
cursors load cursor images, includes standard cursors
display control the display window or screen
draw draw simple shapes onto a Surface
event manage events and the event queue
font create and render Truetype fonts
image save and load images
joystick manage joystick devices
key manage the keyboard
mouse manage the mouse
movie playback of mpeg movies
sndarray manipulate sounds with Numeric
surfarray manipulate images with Numeric
time control timing
transform scale, rotate, and flip images