1. 绘制图像的三个步骤

介绍一下怎么样把图像文件中保存的图像数据, 绘制到游戏的屏幕上,先明确一下什么是图像文件以及要使用图像文件,第1步应该做什么, 在之前准备项目的时候,在项目中添加了一个images 目录,

在这个目录下保存有大量的图像文件,

这些图像文件默认情况下是保存在磁盘上的.

在开发时,如果想要使用这些图像文件中保存的数据,第1步应该把图像文件中保存的数据加载到内存,譬如现在做一个双击的动作,双击之后可以在屏幕右侧看到图像的内容,

之所以能够看到图像的内容,是因为双击的动作,会把图像文件中保存的数据加载到内存, 加载之后,才能够看到图像的内容.

刚刚确认了一下图像文件,默认情况下都是保存在磁盘上的,

在开发中如果想要使用图像文件中保存的数据,第1步就应该把图像文件中保存的数据加载到内存,这个概念明确之后。接下来看一下在使用pygame开发的时候,怎么样把图像文件中保存的数据绘制到游戏的窗口中.

要想实现这个目标啊,只需要编写三句代码,

第1句代码,让pygame的image 模块来调用一下load()方法, load()有加载的意思,传入一个要加载的图像文件路径,

这个方法就会返回一个加载之后的图像数据.load()方法,负责加载图像的数据.

那加载之后呢,第2步就使用 游戏屏幕  对象调用一个blit 方法,

blit  方法需要传入两个参数,第一个参数就是刚刚加载得到的图像数据, 第2个参数呢,可以是一个元组,也可以是一个矩形对象,

总而言之,第2个参数就是指定在游戏屏幕的什么位置来绘制这个图像,第三步, 绘制之后还不够,如果希望在屏幕上看到最终的绘制结果,还需要调用一个非常重要的方法,需要调用一下pygame.display 这个模块提供的一个update方法,

update有更新的意思,只有更新了整个屏幕,才能够在屏幕上看到最终的绘制结果,这样就是使用pygame来绘制一张图像的三个步骤。

那接下来就针对三个步骤来做一个简单的演练,在这个演练中就加载一下背景图像,加载之后把背景图片绘制在(0, 0) 的位置,也就是游戏窗口的左上角,绘制完成调用一下update() 方法来看到最终的显示结果.

演练目标明确之后,粘贴之后, 就把光标放在第8行,

要绘制图像,应该在无限循环的上方来绘制,先编写一下注释,目标明确之后,以注释的方式来明确一下绘制背景图像的三个步骤,

现在123, 3个步骤写完,就先来使用image 模块的load 方法加载一下图像.

要想使用pygame的image模块,选中load 方法,然后在方法的小括号内部传入要加载的图像名称,先敲一个点表示当前目录,

图片加载完成.

同时注意load 方法是有返回结果的, 所以在前面定义一个变量来接收一下,

图像数据加载完成,可以让屏幕对象bg 来调用blit 方法,就让screen这个对象调用blit 的方法,把刚刚加载的背景图像传递进来,

然后呢,跟一个逗号, 在逗号后面跟上一个元组,这个元组呢就指定一下在游戏窗口的什么位置来绘制这个背景图像.(0, 0) 是在屏幕的左上角来绘制背景图,现在绘制的动作也做完.

update 方法是display模块提供的,那现在就用pygame点找到display,直接敲一个update,好1 23, 三个步骤写完, 来运行一下程序,

现在屏幕上已经可以看到背景图片,

现在把绘制背景图像的位置改一下,x值写一个100,y值同样也写一个100,

现在再运行一下,

再演示一下,最后一句代码.如果让屏幕执行完绘制动作之后,不调用update方法就没有办法在屏幕上看到最终的绘制结果.

现在就把update的方法注释一下,再来运行一下程序,

游戏启动了,这个黑黑的窗口上并没有任何的内容.这样就是不调用update方法看到的一个结果.

把这个方法的注释打开,重新运行一下程序.

然后选择停止所有.

 选择停止之后, 

重新运行一下程序, 程序启动了, 并且可以看到背景图片的绘制,

2. 绘制英雄和透明图像

接下来再针对绘制的图像在做一个案例演练,来把英雄的图像画在屏幕上,通过这个案例演练,首先要强化一下上一小节学习的加载图像以及绘制图像的代码,并且介绍一下什么叫做透明图像.

明确了演练目标之后,来看一下演练步骤,在这一小节,首先从me1.png 这个图像文件来加载一下飞机的数据,当把飞机的数据加载完成之后,就把英雄的飞机挂在屏幕的水平方向,200的位置,垂直方向500的位置.

当让screen对象调用了blit 方法,

完成了绘制之后,还需要调一下display模块提供的update的方法,

只有调用了update 方法,才能够在屏幕上看到最终绘制的结果, 也就是英雄的飞机.

做一下演练,首先来找到image的文件夹,

来看看在这一小节要绘制的英雄图片,

找到并双击,

这些小格子就是图片的透明区域,至于透明区域会看到什么效果,等下编写完代码,就可以一目了然了.

再找到我们上一小节完成的代码, CTRL a选中, CTRL c复制,然后切换到一个全新的空白文件CTRL v粘贴进来.

把光标放在第16行, 注意要想绘制飞机的图片,就应该在无限循环的上方来编写代码.

先增加一个单行注释, 来明确一下这一小节要绘制的目标英雄的飞机,目标明确之后,要想在屏幕上绘制一个图像,第1步应该加载图像,

那现在先给英雄起个名字hero,然后呢使用pygame 模块来调用load 方法,load 方法的参数就是要加载图像文件的完整路径,

那现在写一个点, 表示当前路径,

然后呢跟上images表示图像目录下的,

然后呢再跟上me1.png 这个图像文件名,

图像数据加载完成,接下来让screen 这个对象来调用blit 方法,

blit 方法可以接收两参数,第1个参数就是刚刚加载的图像数据,就把hero传递过来,

第2个参数是一个元组,这个元组的第1个数值是水平方向的坐标,元组的第2个数值是垂直方向的坐标,现在指定一个200和500,

让屏幕对象执行了blit 方法之后, 还需要调用一下display这个模块提供的update方法.

调一下update方法,

好三句代码写完, 先来运行一下程序,看看英雄的飞机能不能出现在屏幕上.

英雄的飞机已经出现在屏幕上,

下方是一个背景图片,上方有一个英雄的小飞机.

现在英雄的飞机已经出现了,如果希望英雄出现的位置向左偏一点,应该修改第1个数值,第1个数值表示水平方向的x值.

那现在就把程序停止一下,

然后把水平的200修改成150,现在再运行一下程序, 英雄的小飞机位置发生变化了,

观察一下英雄飞机下方有一个陨石,但是陨石并没有被小飞机全部遮挡住,有一半的陨石能够透露出来, 这个就是透明图片的效果.

再看一下要加载的图像,在图像上有一些灰色的小格子,这些灰色的小格子就是透明区域,

在显示图像时,如果下方有其他的图像内容,这些透明的小格子, 就会把其他的图像内容通过小格子透露出来, 同样也可以让我们肉眼看到.这个就是透明图像的概念.

所谓透明图像,就是png 这种格式是支持透明的,在显示的时候,如果下方已经有内容就会透过透明区域显示出来,这样呢就可以看到两张图片完全融合的效果.

譬如小飞机叠在陨石上,这个就是透明图片的效果.

3.update 方法的作用

介绍一下display模块提供的update方法的作用,要想绘制图像, 就让screen 对象来调一下blit 方法.

 要想看到绘制的结果,就调用一下display模块提供的update的方法.

一个绘制图像,一个更新显示,那现在试想一下,假设开发的游戏,需要绘制非常非常多的图像.

那么在编写代码的时候,如果每绘制一张图像就调用一次update 方法,每绘制一张图像就更新一下显示,如果这样编写代码就显得太繁琐了.

有更简单的方法.

其实在开发时可以让screen 对象完成了所有blit 方法之后,即完成所有绘制方法之后,再最后统一调一次update的方法,同样可以在屏幕上看到最终的绘制结果.

验证一下,先把绘制背景的注释删除一下,这样呢可以让代码看起来更加直观一些,

大家看在第3行初始化了一下pygame,

第6行调用set_mode方法,创建了一个游戏的屏幕,

然后呢,连续的三句代码是非常类似的,

先来加载图像,

然后绘制图像,

紧接着更新显示,

更新显示可以在屏幕对象完成所有绘制动作之后统一调用.

增加一个注释, 可以在所有绘制工作完成之后统一调用update方法,

update 方法会把screen 对象中最终的绘制结果统一输出到屏幕上来.

既然如此,第11行这个更新显示的代码就可以注释掉了.

把第11行代码注释一下, 来运行一下程序,

看看背景图像和英雄的飞机能不能被最终的显示在屏幕上来,现在运行一下程序,背景图片也好,英雄的飞机也好,都能够显示在屏幕上,

这个就是在开发时,可以先让screen 对象顺序调用blit 方法,按照程序的需求,在不同的位置绘制不同的图像,当所有绘制工作完成之后,最后统一调一次update的方法.

这种方式编写代码, 就不用在每次绘制完图像都调用一次更新.

只需要在最后统一调一次update的方法就可以.

为什么update 方法只需要用一次就可以了呢?之前介绍set_mode方法的时候,提到过,暂时可以把screen 对象理解成游戏的屏幕,其实啊,screen 对象本质上是一个内存中的屏幕的数据对象,

它只是一个数据对象,可以把screen 对象理解成一个油画的画布,画一个示意图,现在这个红色的框框,就是screen 这个对象,

可以在screen 对象上调用blit 方法,就可以完成图像的绘制工作.

先来画一个英雄的飞机,

画完英雄的飞机之后,如果还希望画一个敌人的飞机,那么就可以使用blit 方法, 再画一个敌人的飞机,

如果游戏中的图像比较多,非常有可能出现几张图像之间彼此覆盖彼此重叠的情况,

但是不管有多少张图像,彼此覆盖和重叠,最终看到的结果只是一个而已.

让screen 对象调用blit 方法,可以在内存中进行虚拟的绘制,把需要展现的所有图像全部绘制完成,紧接着呢,就调一下update方法, update 方法会把screen 对象中绘制的最终结果,一次性的绘制到游戏屏幕上.

screen 对象只是一个内存中的数据对象,而最终要在屏幕上看到的结果是通过update 方法把screen 对象的最终结果,一次性的画在屏幕上, 这种方式可以提高屏幕的绘制效率, 可以提高屏幕每次更新的效率,从而呢可以提高游戏的流畅度.

Python_绘制图像相关推荐

  1. 图像语义分割python_图像语义分割出的json文件和原图,用plt绘制图像mask

    1.弱监督 由于公司最近准备开个新项目,用深度学习训练个能够自动标注的模型,但模型要求的训练集比较麻烦,,要先用ffmpeg从视频中截取一段视频,在用opencv抽帧得到图片,所以本人只能先用语义分割 ...

  2. 写论文神器APEX-NET:自动重新绘制图像

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达小白导读论文是学术研究的精华和未来发展的明灯.小白决心每天为大家带来 ...

  3. R语言可视化绘制及PDF使用字体参数列表:查看字体列表、可视化绘制图像中的字体参数列表、字体示例并写入pdf

    R语言可视化绘制及PDF使用字体参数列表:查看字体列表.可视化绘制图像中的字体参数列表.字体示例并写入pdf 目录 R语言可视化绘制及PDF使用字体参数列表:查看字体列表.可视化绘制图像中的字体参数列 ...

  4. python画的图怎么保存_python通过PyGame绘制图像并保存为图片文件的代码

    把开发过程中常用的一些内容片段记录起来,下边内容是关于python通过PyGame绘制图像并保存为图片文件的内容,希望对大伙有较大好处. ''' pg_draw_circle_save101.py d ...

  5. 【MATLAB】基本绘图 ( text 函数 | annotation 函数 | 绘制图像示例 )

    文章目录 一.text 函数 二.annotation 函数 三.绘制图像示例 一.text 函数 参考文档 : https://ww2.mathworks.cn/help/matlab/ref/te ...

  6. PHP中绘制图像的一些函数总结

    在PHP中绘制图像的函数非常丰富,包括点.线.各种几何图形等可以想象出来的平面图形,都可以通过PHP中提供的各种画图函数完成.我们在这里介绍一些常用的图像绘制,如果使用我们没有介绍过的函数,可以参考手 ...

  7. Linear regression with one variable算法实例讲解(绘制图像,cost_Function ,Gradient Desent, 拟合曲线, 轮廓图绘制)_矩阵操作...

    %测试数据 'ex1data1.txt', 第一列为 population of City in 10,000s, 第二列为 Profit in $10,000s 1 6.1101,17.592 2 ...

  8. C++ Opengl 绘制图像字符源码

    C++ Opengl 绘制图像字符源码 项目开发环境 项目功能 项目演示 项目源码传送门 项目开发环境 开发语言:C++和IDE:VS2017,操作系统Windows版本windows SDK8.1, ...

  9. 【Qt】2D绘图之绘制图像(二)

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制QImage图像 04. 绘制QPixmap图像 05. 绘制QPicture图像 06. 综合对比 07. 附录 0 ...

最新文章

  1. 实现单链表--Python
  2. matlab figure函数的用法
  3. MySQL分库分表 mycat
  4. oppo设备怎么样无需root激活XPOSED框架的教程
  5. 次方求模 http://acm.nyist.net/JudgeOnline/problem.php?pid=102
  6. running Extension project directly on ABAP server without Launchpad
  7. “你都硕士博士了,竟然还不如我!”
  8. 编译原理 —— 1.2 编译系统的结构(终于弄懂语法和语义的区别了!)
  9. 广告点击率预测_用于广告点击率预测的逻辑回归你会了吗?
  10. spring-boot-route(十二)整合redis做为缓存
  11. 复变函数系列(三 ) - 复变函数的积分
  12. 在RedHat Linux系统中安装和配置snmp服务
  13. pytorch在anaconda下安装
  14. 程序员最喜欢的15款文本编辑器推荐
  15. 平衡二叉树的插入与删除
  16. 金山词霸2009牛津版下载地址
  17. vmware workstaion主机关机,风扇一致转,不能正常关机
  18. Alarm Clock C/C++ Version
  19. 最受中国人欢迎的10种日本药
  20. mongodb针对查询数据保留两位小数或者自定义

热门文章

  1. Thymeleaf在IDEA中的红色波浪线问题
  2. 基于java,springboot的音乐分享平台
  3. 基于JAVA果之芒农场销售系统计算机毕业设计源码+数据库+lw文档+系统+部署
  4. Unity ECS实例:制作俯视角射击游戏!
  5. 3an推客推广有效果吗?
  6. Android app漏洞挖掘初探(0)
  7. 本特利电涡流传感器系统的维护
  8. 【C语言】从键盘上输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止
  9. vertx源码分析(一)---------------vertx启动流程分析
  10. 紧凑并列倒装式气液增压缸型号及应用