python绘制三维矢量图_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

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

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

至此,引擎基本功能就实现了

欢迎大家继续关注我的博客

转载请注明出处:Yorhom’s Game Box

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值