如何画线 - 不在 Canvas 上,只是对象?
How to draw line - not on Canvas, just object?
我正在将我的游戏移植到 QML 并且有一个困难。看这张图:
三角形是精灵,线条是力向量。我可以在 QML 中显示精灵,但我不明白如何绘制矢量。它的长度可以大于精灵大小。
我想我可以使用 Rectangle
和 height
的 1px,但我不知道如何旋转它。
力在每一帧都可能发生变化,因此绘图性能必须良好。
如果您不想使用 Canvas
,有几个选项:
实现 QQuickPaintedItem
- 它使用 QPainter
API 来绘制 QML 项目。最简单的解决方案,但如果您进行大量绘图,效率不高。
实现自定义 QQuickItem
- 它更复杂,你将不得不实现额外的东西,但它会更快,因为它将使用场景图 API,所以您的渲染将得到优化
使用Qt3D
模块,虽然它是用于3d图形的,但它也可以进行2d绘图。
最后,显然你可以通过创建一个非常窄和宽的 Rectangle
并给它一些旋转来画一条线。但这是一个非常笨拙的解决方案。我建议您研究第二个选项,并检查一些示例,使用自定义几何体和着色器实现 QQuickItem
。 Here is one similar example.
更新:
从 Qt 5.10 开始,还有 qml Shape
元素,它提供了一种定义矢量形状的声明方式,IMO 是在 qml 中拥有参数化图形的最简单方式。缺点是性能不是很好,但如果你不涉及过多的元素,它仍然可以完美使用。
我正在将我的游戏移植到 QML 并且有一个困难。看这张图:
三角形是精灵,线条是力向量。我可以在 QML 中显示精灵,但我不明白如何绘制矢量。它的长度可以大于精灵大小。
我想我可以使用 Rectangle
和 height
的 1px,但我不知道如何旋转它。
力在每一帧都可能发生变化,因此绘图性能必须良好。
如果您不想使用 Canvas
,有几个选项:
实现
QQuickPaintedItem
- 它使用QPainter
API 来绘制 QML 项目。最简单的解决方案,但如果您进行大量绘图,效率不高。实现自定义
QQuickItem
- 它更复杂,你将不得不实现额外的东西,但它会更快,因为它将使用场景图 API,所以您的渲染将得到优化使用
Qt3D
模块,虽然它是用于3d图形的,但它也可以进行2d绘图。
最后,显然你可以通过创建一个非常窄和宽的 Rectangle
并给它一些旋转来画一条线。但这是一个非常笨拙的解决方案。我建议您研究第二个选项,并检查一些示例,使用自定义几何体和着色器实现 QQuickItem
。 Here is one similar example.
更新:
从 Qt 5.10 开始,还有 qml Shape
元素,它提供了一种定义矢量形状的声明方式,IMO 是在 qml 中拥有参数化图形的最简单方式。缺点是性能不是很好,但如果你不涉及过多的元素,它仍然可以完美使用。