广州双城热恋创意文化传播有限公司

现在的位置: 主页 > 在线留言 > 文章列表

文章正文

Python游戏引擎开发(七):绘制矢量图的绘制

作者:广州双城热恋创意文化传播有限公司 来源:www.666loveyou.com 发布时间:2017-09-07 12:46:17
Python游戏引擎开发(七):绘制矢量图的绘制

今天来完成绘制矢量图形。

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

通过上面的这些命令,我们就可以创建出许多不同的矢量图形:

Image 1

绘制矢量图的功能就搞定了~如有不懂之处,欢迎留言。

预告:引擎使用举例。

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉做网站 https://www.feimao666.com


COPYRIGHT © 2015 广州双城热恋创意文化传播有限公司 ALL RIGHTS RESERVED.
网站地图 技术支持:肥猫科技
精彩专题:网站建设
购买本站友情链接、项目合作请联系客服QQ:2500-38-100