Pygame学习笔记(一):Pygame介绍
- Python
- 2015-12-19
- 116热度
- 0评论
学习资料:《Python Pygame Introduction》
Pygame初体验
直接从例程上手,是理解一个新的代码库最好的方法。下面来看一个例子,它可以让一个小球在屏幕上弹跳。(可直接下载这张图片)
#!/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 |