Python游戏引擎开发(七):绘制矢量图
今天来完毕绘制矢量图形。
没有读过前几章的同学,请先阅读前几章:
Python游戏引擎开发(五):Sprite精灵类和鼠标事件
Graphics类
首先我们创建Graphics类用于创建矢量图形:
class Graphics(DisplayObject):
def __init__(self):
super(Graphics, self).__init__()
# 存储全部图形数据的列表
self.__drawingList = []
# 用于储存当前图形数据
self.__currentGraphics = None
因为我们的窗体界面是在不断清除。然后重绘的,所以增加__drawingList属性来储存全部图形的数据。而__currentGraphics用于储存当前图形数据。
在flash中,我们使用beginFill方法来下达開始绘制命令。增加该方法:
def beginFill(self, color = "transparent", alpha = 1):
if color == "transparent":
alpha = 0
self.__currentGraphics = {
"path" : QtGui.QPainterPath(),
"lineAlpha" : 255,
"lineWidth" : None,
"lineColor" : None,
"fillColor" : color,
"fillAlpha" : 255 * alpha,
"joins" : None,
"caps" : None,
"miterLimit" : None
}
開始绘制命令须要例如以下几个參数:图形填充色、填充色透明度。
在上面的代码中,我们初始化了__currentGraphics属性。能够看到,他是一个dict对象。当中的path成员是一个QPainterPath对象。这个对象来自Qt,通过调用这个类中的一些方法,能够创建一些图形,然后调用QPainter的drawPath方法就能够把这个对象里创建的全部图形画出来。
增加endFill方法。用于把当前图形保存到__drawingList中,保存到__drawingList后。就能够使其显示出来:
def endFill(self):
if not self.__currentGraphics:
return
self.__currentGraphics["path"].setFillRule(QtCore.Qt.WindingFill)
self.__drawingList.append(self.__currentGraphics)
然后是_show方法,在前面的章节中介绍过,每一个显示在界面上的对象都有这种方法,用于显示自身:
def _show(self, c):
for item in self.__drawingList:
if not isinstance(item, dict):
return
path = item["path"]
if not path:
continue
lineWidth = item["lineWidth"]
lineColor = item["lineColor"]
fillColor = item["fillColor"]
joins = item["joins"]
caps = item["caps"]
miterLimit = item["miterLimit"]
fillAlpha = item["fillAlpha"]
lineAlpha = item["lineAlpha"]
brush = None
pen = QtGui.QPen()
c.save()
if lineWidth:
pen.setWidth(lineWidth)
else:
pen.setWidth(0)
if lineColor:
color = getColor(lineColor)
if isinstance(color, QtGui.QColor):
if lineAlpha:
color.setAlpha(lineAlpha)
pen.setColor(color)
else:
pen.setColor(getColor("transparent"))
if joins:
pen.setJoinStyle(joins)
if caps:
pen.setCapStyle(caps)
if miterLimit:
pen.setMiterLimit(miterLimit)
if fillColor:
color = getColor(fillColor)
if fillAlpha and hasattr(color, "setAlpha"):
color.setAlpha(fillAlpha)
brush = QtGui.QBrush(color)
brush.setStyle(QtCore.Qt.SolidPattern)
c.setBrush(brush)
c.setPen(pen)
c.drawPath(path)
c.restore()
当中,我们遍历了__drawingList,从中读取每一个图形数据,然后依据数据进行一些图形样式设置。最后drawPath画出图形。
上面的代码主要完毕了基础的一些部分,眼下我们仅仅有開始画图和结束画图命令。
还差设置样式以及增加图形的命令,通过下面代码增加:
def lineStyle(self, thickness = 1, color = "black", alpha = 1, joints = None, caps = None, miterLimit = 3):
if not self.__currentGraphics:
return
if color == "transparent":
alpha = 0
if joints == JoinStyle.ROUND:
joints = QtCore.Qt.RoundJoin
elif joints == JoinStyle.MITER:
joints = QtCore.Qt.MiterJoin
elif joints == JoinStyle.BEVEL:
joints = QtCore.Qt.BevelJoin
if caps == CapsStyle.NONE:
caps = QtCore.Qt.FlatCap
elif caps == CapsStyle.SQUARE:
caps = QtCore.Qt.SquareCap
elif caps == CapsStyle.ROUND:
caps = QtCore.Qt.RoundCap
self.__currentGraphics["lineWidth"] = thickness
self.__currentGraphics["lineColor"] = color
self.__currentGraphics["lineAlpha"] = 255 * alpha
self.__currentGraphics["joints"] = joints
self.__currentGraphics["caps"] = caps
self.__currentGraphics["miterLimit"] = miterLimit
def moveTo(self, x, y):
if not self.__currentGraphics:
return
self.__currentGraphics["path"].moveTo(x, y)
def lineTo(self, x, y):
if not self.__currentGraphics:
return
self.__currentGraphics["path"].lineTo(x, y)
def drawRect(self, x, y, width, height):
if not self.__currentGraphics:
return
self.__currentGraphics["path"].addRect(x, y, width, height)
def drawCircle(self, x, y, radius):
self.drawEllipse(x - radius, y - radius, radius * 2, radius * 2)
def drawEllipse(self, x, y, width, height):
if not self.__currentGraphics:
return
self.__currentGraphics["path"].addEllipse(x, y, width, height)
有了这些命令,就能够进行画图操作了。
Sprite上使用Graphics
Graphics主要是在Sprite上使用,例如以下代码所看到的:
layer = Sprite()
layer.graphics.beginFill("#FF0000")
layer.graphics.drawRect(0, 0, 200, 200)
layer.graphics.endFill()
addChild(layer)
可见我们须要为Sprite增加一个graphics属性,用于操作矢量图形,所以在Sprite构造器中增加例如以下代码:
self.graphics = new Graphics()
self.graphics.parent = self
通过上面的这些命令,我们就能够创建出很多不同的矢量图形:
绘制矢量图的功能就搞定了~如有不懂之处,欢迎留言。
至此,引擎基本功能就实现了
Github地址:https://github.com/yuehaowang/pylash_engine
欢迎大家继续关注我的博客
转载请注明出处:Yorhom’s Game Box
Python游戏引擎开发(七):绘制矢量图的更多相关文章
- Python游戏引擎开发(五):Sprite精灵类和鼠标事件
本次来实现Sprite类和鼠标事件. 说起这个Sprite啊,涉及过2D游戏研究领域的看官应该都听说过它. 它中文原意是"精灵",只是在不同人的眼中,它所表示的意义不同. 比方说在 ...
- 【Cocos2d-x游戏引擎开发笔记(25)】XML解析
原创文章,转载请注明出处:http://blog.csdn.net/zhy_cheng/article/details/9128819 XML是一种非常重要的文件格式,由于C++对XML的支持非常完善 ...
- 【译】在Asp.Net中操作PDF - iTextSharp - 绘制矢量图
原文 [译]在Asp.Net中操作PDF - iTextSharp - 绘制矢量图 在上一篇iTextSharp文章中讲述了如何将现有的图片插入PDF中并对其进行操作.但有时,你需要在PDF中绘制不依 ...
- 推荐一些好用的 HTML5 & JavaScript 游戏引擎开发库
推荐一些好用的 HTML5 & JavaScript 游戏引擎开发库 0. 引言 如果你是一个游戏开发者,并且正在寻找一个可以与 JavaScript 和 HTML5 无缝工作的游戏引擎.那么 ...
- 【python】pandas & matplotlib 数据处理 绘制曲面图
Python matplotlib模块,是扩展的MATLAB的一个绘图工具库,它可以绘制各种图形 建议安装 Anaconda后使用 ,集成了很多第三库,基本满足大家的需求,下载地址,对应选择pytho ...
- 25 个超棒的 HTML5 & JavaScript 游戏引擎开发库
就像在汽车中,引擎完成主要的工作,使汽车看起来不可思议.游戏引擎同理,游戏开发者完成细节的工作,使游戏看起来真实.吸引人眼球.游戏引擎负责其余的事情.早期,游戏开发者通常从草图做起,花费高昂,且不容易 ...
- Photoshop 基础七 位图 矢量图 栅格化
矢量图(CorelDraw)不是像素组成的,放大不会失真,体积小,颜色比较单一.由直线.曲线构成,画一些直线.曲线.多边形.图标. 位图(Photoshop画的就是位图),又像素组成,放大失真,放的越 ...
- Qt使用QPainter绘制矢量图并保存为svg文件
位图和矢量图: Bitmap: Usually a larger file size Cannot be enlarged into a higher resolution as the image ...
- 【Android LibGDX游戏引擎开发教程】第06期:图形图像的绘制(下)图片整合工具的使用
在上一篇文章中,我们提到了图片必须是2的n次方的问题.但是随着Libgdx的不断完善和发展,使用一些工具就 可以很好的解决了这样一个问题,但是它的功能又不仅仅只限于此,那么下面就来让我们看看Textu ...
随机推荐
- android studio偏好设置
1.主题设置,可以选择白色主题及黑色主题 2.代码字体大小 3.生成新的主题 主题命名 4.加入代码时,自动引用库 5.合作菜单生成菜码 6.命名空间设置 字段设置为大写,静态字段设置为小写 SDK设 ...
- Java工具类-转换字符编码
package common; /** *字符串处理公用类 */ public class DealString { /** * 转换字符编码 由“iso-8859-1”西文转换为简体中文 */ pu ...
- FZU 2297 Number theory【线段树/单点更新/思维】
Given a integers x = 1, you have to apply Q (Q ≤ 100000) operations: Multiply, Divide. Input First l ...
- 分享Kali Linux 2017年第30周镜像文件
分享Kali Linux 2017年第30周镜像文件 Kali Linux官方于7月23日发布2017年的第30周镜像.这次维持了11个镜像文件的规模.默认的Gnome桌面的4个镜像,E17.KDE ...
- 【BZOJ 2744】 2744: [HEOI2012]朋友圈 (最大团,二分图匹配,构图)
2744: [HEOI2012]朋友圈 Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他 ...
- 仿苹果系统应用的apk
仿苹果系统应用的apk 韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 收集了好久的仿苹果IOS7全套apk - Android安卓综合 ...
- UML整体概括
UML (Unified Modeling Language)为面向对象软件设计提供统一的.标准的.可视化的建模语言.适用于描述以用例为驱动,以体系结构为中心的软件设计的全过程. UML的定义包括UM ...
- [拒绝毒瘤的小清新系列] give you a tree
题面在这里! (小声)这其实是我读错某题之后自己出的一道题...... 正解也很简单啦,直接扫描线+线段树水过(考虑一个合法的区间正好有 siz-1 对树上相邻的点对)23333 #include&l ...
- 【带权并查集】Gym - 100923H - Por Costel and the Match
裸题. 看之前的模版讲解吧,这里不再赘述了. #include<cstdio> #include<cstring> using namespace std; int fa[10 ...
- [bzoj1012](JSOI2008)最大数maxnumber(Fenwick Tree)
Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度. 2. ...