本篇文章是Python游戏引擎开发系列的第二篇文章,主要介绍如何显示图片,大家可以学习下。

在上一章中我们讲了如何创建窗口以及对界面进行重绘。可能有朋友不理解为什么要进行全窗口的重绘呢?我在这里可以大致讲一下原因: 由于我们的游戏是动态的,所以我们每次更改数据后(例如播放动画时切换图片),要让界面显示更改后的结果,一般的想法是:首先进行擦除原先要改的地方,然后再把变更的内容画出来。不过这个看似简单,如果遇到了重叠放置的对象就麻烦了,比如说A在B的下面,我们要更改A,那么把A擦掉后,B也会被擦掉,原因在于我们的画布是2D的,无法控制Z方向的擦除。这样一来,我们除了重画A还要再把B画上去。这是个比较复杂的问题,所以为了简化操作,我们直接使用全窗口的重绘,也就是定期的进行擦除,然后重绘。

显示对象

在前面的章节中,我们屡次提到了显示对象这个东西,那显示对象到底是什么呢?顾名思义,它是一个可视的物体,比如说游戏中的人物,地图等。例如list,tuple等,这些对象是不可以显示的,它们只用于内部的数据存储,所以不是显示对象。同理,游戏中的资源加载器也不是显示对象。

程序开发可以看作一个归类的过程(所以class成为了一种主要的程序语句)。如果我们以对象的尺寸,或者颜色来分类显示对象,那么可能会出现这些类:BigTree,GreenTree……这样的分类存在明显的问题:分类不够细化,而且无法实现所有效果。于是flash给了我们很好的示例:通过负责显示的内容来分类。也就是说,图片显示为一类,文本显示为一类,矢量图形显示为一类……这样一来,细化层度不仅高,而且界面上的一切都可以用这几个类来组合完成。

今天就先来实现显示图片。由于上述的类都和显示对象有关,所以我们先创造一个所有显示对象的父类DisplayObject:

这个类中的所有属性,就是所有显示对象的公共属性。比如说x,y分别表示平面直角坐标系中横纵坐标(原点为屏幕最左上角);rotation表示对象绕其左上角旋转的角度。 前面提到了重复渲染,所以我们要提供一个方法来实现自我重绘。在重绘的途中,不同的显示对象显示的内容不同,比如说图片类就该显示图片,文本类显示文本。但是这些类又有统一之处,比如说都可以设置横纵坐标,旋转度数等。所以我们创建_show方法,其中对旋转,缩放,移动进行统一处理,然后调用_loopDraw来进行绘制不同的内容。 由于显示对象还有获取宽高的功能,所以我们再加入_getOriginalWidth,_getOriginalHeight进行获取width,height属性时计算宽高。 还有个remove方法用于将自身从显示列表中移除。

以上在代码安排进行了说明,接下来来解释代码。首先追忆一下上一章的代码:

这是Stage类中的一个方法,在这个方法中,我们遍历了显示对象并调用显示对象的_show方法,所以这里是绘制显示对象的入口。我们可以看到,在调用这个函数时,我们传入了Stage类的canvas属性,这是个啥玩意呢?在上一章中我们介绍过,这是一个QPainter对象,“只是当时已惘然”【1】的同学还当看看本文前一章才是

【1】出自李义山《锦瑟》一诗,原诗的意思一说是:“只是当年早已惘然”,我这里借代使用,翻译为字面意思:“现在感到茫然”

在_show方法中,我们首先接受这个参数,这个QPainter中有很多方法,可以用来设置整个画笔的一些属性,比如说画笔的透明度,绘画的位置等。QPainter的save方法用于记录当前坐标状态,方便实现相对定位。translate,scale,rotate,setOpacity分别用于设置画笔起始位置,拉升/压缩画笔,旋转画笔,设置画笔透明度。随后调用_loopDraw绘制不同显示对象的特殊内容。最后是调用restore恢复画笔状态到记录状态(save调用时的)。

显示图片

有了以上的显示对象类作为基础,我们就可以来实现显示图片了。

加载图片

首先是加载图片。写个Loader类:

用到了QImage这个Qt的类,这个类有个load方法,通过向这个方法传入一个图片地址来加载图片。另外提一下,我们前面说过资源加载器不属于显示对象,但是据我所知,flash中的Loader就是个显示对象,继承自DisplayObject,还可以被加入到显示列表中进行显示,当然这是在加载.swf等文件的条件下,我们这里就暂且模仿flash,以后有别的运用再拓展拓展也不迟。

储存图片数据

在flash中,储存图片使用BitmapData类,这小蹄子就不是显示对象了:

这个类就只是对图片数据进行一些储存,比如说显示范围的宽高,和显示范围的起始坐标。当然这个类还有其他的用途,如像素处理,以后会逐步拓展。值得注意的是,这个类中各个属性代表的含义如下:

图片显示类

图片既加载了又储存了,那么接下来就显示图片了。显示图片的类号Bitmap,是DisplayObject子类:

这里使用了对_loopDraw的重写来完成绘制图片这一特殊内容。在这个方法中,值得注意的是QPainter的drawImage方法,这个方法接受的参数分别是:[起始点x,起始点y,QImage对象,图片显示内容的x属性,图片显示内容的y属性,图片显示内容的宽,图片显示内容的高] 顺便重写了_getOriginalWidth,_getOriginalHeight来获取图片的宽高。

完成后,结合前面的代码,进行测试:

效果图:

本次封装的所有代码:

Python游戏引擎开发系列:

python怎么制作游戏图片_Python游戏引擎开发(二):显示图片相关推荐

  1. python将图片转换为Framebuffer裸数据格式(终端显示图片)

    要在ubuntu终端显示图片或者在板子的LCD显示图片,Framebuffer是一个简单易用的接口,直接写入像素信息即可. 但普通的图片带有头部信息或者编码格式不同,直接送入Framebuffer是显 ...

  2. java开发 图片显示不出来_java web开发中 显示图片的问题

    记录一个java Web开发中显示图片的小问题: 我碰到的问题是:把服务器上存的图片,在客户端的浏览器中显示出来.解决方法如下: 两种显示方式 一是:在servlet 或 action中直接输入图片到 ...

  3. 富文本编辑的图片在手机,移动端显示图片img太大,超出屏幕,出现滚动条,富文本中的图片如何修改样式

    富文本编辑的图片在手机,移动端显示图片太大,超出屏幕,出现滚动条,富文本中的图片如何修改样式 var html = res.data.details.replace(/<img([\s\w&qu ...

  4. 基于Python实现制作的塔防游戏

    导语 最近发现很多人对 python 制作小游戏感兴趣,于是花了半天时间做了个塔防小游戏,在这里分享给大家,希望对大家有帮助. 让我们愉快地开始吧~ 开发工具 **Python 版本:**3.6.4 ...

  5. python绑定按键pageup键_python游戏教程一——键盘事件

    无论什么游戏,少不了输入设备,键盘鼠标可能应用的是最多的,当然除了他们还有游戏手柄或者其他.今天我们就一起来学习一下经常用到的鼠标和键盘事件. python当中经常用来做游戏的标准库为pygame,今 ...

  6. python制作ico图标_python使用PythonMagic k将jpg图片转换成ico图片的方法

    python使用PythonMagic k将jpg图片转换成ico图片的方法 发布时间:2017-06-27 08:00 来源:互联网 当前栏目:网页设计教程 这篇文章主要介绍了python使用Pyt ...

  7. python获取网页图片_python抓取网页中的图片示例

    python抓取网页中的图片示例 代码如下: #coding:utf8 import re import urllib def getHTML(url): page = urllib.urlopen( ...

  8. python 拼接图片_python使用PIL剪切和拼接图片

    本文实例为大家分享了python使用PIL剪切图片和拼接图片的具体代码,供大家参考,具体内容如下 因工作需要,接触到了PIL这个包,看其他人的博客踩了一些坑,有些博客并没有注明各个位置参数的含义,今天 ...

  9. python图显示在新的窗口_python在新的图片窗口显示图片(图像)的方法

    python在新的图片窗口显示图片(图像)的方法 使用python画图,发现生成的图片在console里.不仅感觉很别扭,很多功能也没法实现(比如希望在一幅图里画两条曲线). 想像matlab一样单独 ...

最新文章

  1. 灵魂拷问:机器学习、深度学习专业已经沦为调包专业了吗?
  2. Hark的数据结构与算法练习之简单选择排序
  3. 数据库的同步和复制----sql语句方法
  4. 你很可能需要知道这个调试小技巧
  5. 使用Guava MapSplitters配置Hadoop
  6. python结构化数据_python新手入门必备—— 使用json保存结构化数据
  7. qt2-无边框窗口创建、拖拽、阴影
  8. 【转】Android - 文件读写操作 总结
  9. django-pure-pagination
  10. Zabbix官方文件Zabbix图形树
  11. python 类内置方法
  12. 牛年大吉~ 包邮送一部新款华为手机!
  13. Spring:连接池连接数据库报错Unknown system variable ‘tx_isolation‘
  14. 100天python、github_GitHub - 1392792445/Python-100-Days: Python - 100天从新手到大师
  15. windows无法格式化u盘_U盘修复无法格式化的解决方法
  16. cisco 链路聚合 (自用)
  17. mysql怎么加载txt文本1148_MySQLload从文件读入数据提示ERROR1148
  18. 生命密码是几适合学计算机,数字生命密码是什么?
  19. GitHub上开源了一个自制表情包项目
  20. python——csv读取文件报错:error:new-line character seen in unquoted field

热门文章

  1. HDU 2838 Cow Sorting(双树状数组+求逆序数)
  2. 从程序员的角度看人类通信史
  3. 《追风筝的人》读书笔记暨读后感
  4. 电商营销方式抢购,秒杀Redis原子出队列lpop方法作为剩余库存判断条件的实现方式(2)
  5. HTML+CSS实现导航条
  6. 【博学谷学习记录】超强总结,用心分享丨前端开发:BootStrap框架基础用法
  7. python等比例压缩图片_python图片等比例压缩
  8. Docker 的数据管理(Dockerfile的概述和构建)
  9. 3D立体显示技术原理与游戏应用历程简介 【转】
  10. Altera下载脚本二