注:本文的思路和示例参考了Jonathan S.Harbour的《More python programming for the beginner》等书。
上一讲我们练习了draw相关函数做了有趣的工作,这一讲我们学习位图(bitmap,image),必须承认,位图才是好看的游戏所需要的图形(draw绘制图形是矢量图形,基于线条的)。对2D游戏,图像可能就是一些背景、角色等,而3D游戏则往往是大量的贴图。
Ø 本讲学习内容:
² 如何加载图像;
² 如何绘制图像;
² 如何将图像缩放、旋转等变换
² 使用rect管理图像的运动
Ø PBL实践内容
² 练习小球的运动——直线碰撞运动
² 模拟飞船环绕行星运动——圆周运动
² 模拟校园下雪的场景——多个对象的运动
位图绘制的基本流程
背景:下面的例子中,我们将展现太空的场景,然后是行星,然后是飞船。
一 加载图像的基本操作
对于Pygame而已,加载图片就是pygame.image.load,给它一个文件名然后就还给你一个surface对象。
pygame.image.load()load newimage from a fileload(filename) ->Surfaceload(fileobj,namehint="") -> Surface
Load an imagefrom a file source. You can pass either a filename or a Python file-likeobject.
下面的代码完成了太空图片的加载:
Space=pygame.image.load(“space.png”)
补充说明一下,有很多存储图像的方式(也就是有很多图片格式),比如JPEG、PNG等,Pygame都能很好的支持,具体支持的格式如下:
· JPEG(JoinPhotograhpic Exper Group),极为常用,一般后缀名为.jpg或者.jpeg。数码相机、网上的图片基本都是这种格式。这是一种有损压缩方式,尽管对图片质量有些损坏,但对于减小文件尺寸非常棒。优点很多只是不支持透明。
· PNG(Portable Network Graphics)将会大行其道的一种格式,支持透明,无损压缩。对于网页设计,软件界面设计等等都是非常棒的选择!
· GIF网上使用的很多,支持透明和动画,只是只能有256种颜色,软件和游戏中使用很少
· BMPWindows上的标准图像格式,无压缩,质量很高但尺寸很大,一般不使用
· PCX,TGA,TIF,LBM, PBM,XPM等等
二 转换Surfaces
我们之前说的RGB24位真彩色图像,在游戏中我们往往使用RGBA图像,这个A是alpha,也就是表示透明度的部分,值也是0~255,0代表完全透明,255是完全不透明,而像100这样的数字,代表部分透明。也就是RGBA格式图像时32位图像,更加丰富。
所以平时为了获得更高的性能,我们会先做一些转换:
background = pygame.image.load(background_image_filename).convert()pic2 = pygame.image.load(mouse_image_filename).convert_alpha()
第一种方式convert()函数将位图转换为程序窗口的本地颜色深度,以此作为优化。每次加载完图像以后就应该做这件事,如果没有在加载的时候转换,以后在循环中每次绘制都需要转换。
第二种方式是covert_alpha,保留了Alpha 通道信息(可以简单理解为透明的部分),这样我们的光标才可以是不规则的形状。在加载必须使用透明方式绘制的前景对象使用。
space=pygame.image.load(“space.png”).convert()
三 绘制图像
绘制图像,意味着在surface对象(通常时屏幕)中绘制位图。Surface类有一个名叫做blit()的函数,意思是:“bit block transfer“,也就是把一块儿内存从一个位置复制到另一个位置的绘制方法。比如下面的例子中,从系统内存绘制到视频动画的内存中。
screen.blit(space,(0,0)
综合上面的过程:
代码如下:
import sys ,random,math,pygamefrom pygame.locals import *pygame.init()size=width,height=900,600screen=pygame.display.set_mode(size)pygame.display.set_caption("位图的绘制1")#加载并转换图像space=pygame.image.load(".\\pic\space.png").convert()while True: for event in pygame.event.get(): if event.type==QUIT: pygame.quit() sys.exit() keys=pygame.key.get_pressed() if keys[K_ESCAPE]: pygame.quit() sys.exit() #绘制星空 screen.blit(space,(0,0)) pygame.display.update()
四 获取图像大小来绘制行星
下面我们要加载和绘制行星的图像,位置呢处在游戏窗口的中央,就需要获得行星图片的大小。
planet=pygame.image.load(".\\pic\planet2.png").convert_alpha() planet_width,planet_height=planet.get_size()screen.blit(planet,(width//2-planet_width//2,height//2-planet_height//2))
获得这样的效果:
代码如下:
import sys ,random,math,pygamefrom pygame.locals import *pygame.init()size=width,height=900,600screen=pygame.display.set_mode(size)pygame.display.set_caption("位图的绘制1")#加载并转换图像space=pygame.image.load(".\\pic\space.png").convert()planet=pygame.image.load(".\\pic\planet2.png").convert_alpha()while True: for event in pygame.event.get(): if event.type==QUIT: pygame.quit() sys.exit() keys=pygame.key.get_pressed() if keys[K_ESCAPE]: pygame.quit() sys.exit() #绘制星空 screen.blit(space,(0,0)) planet_width,planet_height=planet.get_size() screen.blit(planet,(width//2-planet_width//2,height//2-planet_height//2)) pygame.display.update()
五 绘制飞船与图像的变换
同样的方法,我们可以加载飞船的图像,位置先放在左上角(50,50)的地方。
ship=pygame.image.load(".\\pic\ship.png").convert_alpha()screen.blit(ship,(50,50))
如此看来我们需要一个函数将图片进行必要的缩放。
#pygame.transform.scale(Surface, (width, height), DestSurface = None) -> Surface resize to new resolution# smoothscale(Surface, (width, height), DestSurface = None) -> Surface scale a surface to an arbitrary size smoothly
两个函数scale()函数是一个快速的缩放函数,可以产生一个快速缩放的图像。Smoothscale()函数则会花更多的时间来修改图像的大小,所以效果更好。
代码如下:
import sys ,random,math,pygamefrom pygame.locals import *pygame.init()size=width,height=900,600screen=pygame.display.set_mode(size)pygame.display.set_caption("位图的绘制1")#加载并转换图像space=pygame.image.load(".\\pic\space.png").convert()planet=pygame.image.load(".\\pic\planet2.png").convert_alpha()ship=pygame.image.load(".\\pic\ship.png").convert_alpha()shipwidth,shipheight=ship.get_size()ship=pygame.transform.smoothscale(ship,(shipwidth//2,shipheight//2))while True: for event in pygame.event.get(): if event.type==QUIT: pygame.quit() sys.exit() keys=pygame.key.get_pressed() if keys[K_ESCAPE]: pygame.quit() sys.exit() #绘制星空 screen.blit(space,(0,0)) planet_width,planet_height=planet.get_size() screen.blit(planet,(width//2-planet_width//2,height//2-planet_height//2)) #绘制飞船 screen.blit(ship,(50,50)) pygame.display.update()
好了。这样我们就完成了图像绘制的基本过程,以及常用操作。
下一讲我们探索一下图像的动画。
1 秋季开学赛事_AIMO澳大利亚(中级)数学奥林匹克竞赛
2秋季开学赛事——AMC澳大利亚数学竞赛
3 python游戏:3 pygame图形的绘制