c++ 绘制函数图像_python游戏开发——Chapter 4pygame位图绘制(1)

 注:本文的思路和示例参考了Jonathan S.Harbour的《More python programming for the beginner》等书。

2c3c39ba9898dd30448eade0f94b5add.png

上一讲我们练习了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)

综合上面的过程:

bded3b16fde43c727e974e0b5cb37659.png

代码如下:

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))

 获得这样的效果:

8ec9a5202150c88dff0a1891eb47e523.png

代码如下:

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))

c1c74f6050ab03c4c5cb46bd45674ea8.png

如此看来我们需要一个函数将图片进行必要的缩放。

 #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()函数则会花更多的时间来修改图像的大小,所以效果更好。

2c3c39ba9898dd30448eade0f94b5add.png

 代码如下:

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()

好了。这样我们就完成了图像绘制的基本过程,以及常用操作。

下一讲我们探索一下图像的动画。

bfa2938c4a22c15744af3db39db1d16b.png

1 秋季开学赛事_AIMO澳大利亚(中级)数学奥林匹克竞赛

2秋季开学赛事——AMC澳大利亚数学竞赛

3 python游戏:3 pygame图形的绘制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值