前言:
为什么上了研究生才开始试着系统学习Pygame?
以前总觉得知道上哪去找就好,也就没那么多的追求。在做小游戏的时候,也是遇到不会的就百度,然后用一点时间就简单解决了,感觉良好。
但是实际上是,到了如今阶段还是什么都靠百度。可能到 了某个面试的时刻,然后给别人说“Wait a few minutes for me.”。谁他妈会等你。
这个世界虽不能说效率至上,时间至高,但却不是每个人都愿意等,不是每个人都等得起。
至少,我知道,我自己可能浪费了太多的时间,可能等不起了。
官方文档:Pygame文档
Pygame简介
PyGame是一个用Python写的SDL库。SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。
广泛的用于许多著名的游戏。SDL也有其他语言的包装。由于SDL用C语言写成,而且可以很容易在C++下面工作,并且SDL绑定了许多其它的语言,这其中就包括C#, Java,Objective C,Pascal, Perl, PHP, Python,Ruby等。
包装得比较好的是python语言的pygame。
从案例学习
从官网的第一个案例开始,是一个弹球的案例:
import sys, pygame
# 初始化
pygame.init()
width, height = 320, 240
speed = [2, 2]
black = (0, 0, 0)
# 创建一个图形窗口
screen = pygame.display.set_mode((width, height), pygame.RESIZABLE, 32)
# 载入图像
ball = pygame.image.load("intro_ball.gif")
ballrect = ball.get_rect() # 表示得到一个矩形位置区域。
while True:
# 检查是否发生了QUIT事件。
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]
# 通过用黑色RGB颜色填充屏幕来擦除屏幕。
screen.fill(black)
# 绘制img ball源文件 , ballrect目标位置
screen.blit(ball, ballrect)
# 更新可见显示
pygame.display.flip()
init():在使用pygame做很多事情之前,您需要初始化它。quit():初始化的模块通常还有一个将要清理的quit()函数。 没有必要显式调用这些,因为pygame将在python完成时干净地退出所有初始化的模块。display.set_mode(size):Pygame将图像表示为Surface对象。该display.set_mode()函数创建一个新的Surface 对象,代表了在桌面上出现的那个窗口。您对此Surface所做的任何绘图都将在监视器上显示。它有三个参数:
第一个为元祖,代表分 辨率(必须);
第二个显示窗口的设置,有FULLSCREEN(全屏)、RESIZABLE(可变大小)、NOFRAME(无边框)等,其他的略。
第三个为色深。image.load("intro_ball.gif"):加载球图像。Pygame通过SDL_image库支持多种图像格式,包括BMP,JPG,PNG,TGA和GIF。该pygame.image.load()函数返回一个包含球数据的Surface。Surface将保留文件中的所有colorkey或alpha透明度。get_rect():绘制矩形while True:如果程序不加循环,那么也就是只载入首次的界面,然后退出。故而在程序中需要有动态或者持久效果,就需要一直循环绘制它。在这个主循环里做的事情就是不停地画背景和更新光标位置,虽然背景是不动的,我们还是需要每次都画它。blit(ball, ballrect):该方法处理图像的绘制 。从根本上说,blit意味着将像素颜色从一个图像复制到另一个图像。我们通过blit方法传递Surface 要复制的源(ball),以及将源要放置到目标的位置(ballrect)。display.flip():更新可见显示。Pygame使用双缓冲区管理显示。完成绘制后,将整个显示曲面更新为屏幕,这使我们在屏幕“曲面”上绘制的所有内容均可见。这种缓冲确保了我们只能在屏幕上看到完全绘制的帧。没有它,用户将在创建时看到屏幕的一半完成部分。
最后还是给出运行的截图: