如何使用多种节点使用矢量图形节点本页总览使用矢量图形节点 Dora SSR 基于 nanovg 库,提供了一套强大的矢量图形绘制功能。本教程将引导您在 Dora SSR 中使用这些矢量图形功能。您将学习如何创建矢量图形节点、渲染形状、应用变换,以及加载和显示 SVG 文件。 1. 简介 矢量图形允许使用数学方程而非像素网格来创建可缩放、与分辨率无关的图像。Dora SSR 的矢量图形功能基于 nanovg 库,提供了基础的类似于 HTML5 Canvas 的矢量绘图 API。并且可以和 Dora SSR 的场景节点系统进行集成使用。 在本教程中,我们将探索如何使用 Dora SSR 的矢量图形 API 来: 创建矢量图形节点(VGNode) 直接在屏幕上绘制矢量图形 渲染形状和路径 应用变换 加载和显示 SVG 文件 2. 使用 VGNode VGNode 是 Dora SSR 中用于将矢量图形静态渲染到一张纹理上,并挂载到游戏场景中展示的节点。所以它的内部包含了一张用于绘制矢量图形的帧缓冲纹理,并且本身是一个场景节点对象。要创建一个 VGNode,您需要指定其尺寸,以及可选的缩放比例和边缘抗锯齿系数。 2.1 创建节点对象 LuaTealTypeScriptYueScriptlocal VGNode <const> = require("VGNode")-- 创建一个宽800,高600,默认缩放比例和边缘抗锯齿的 VGNodelocal node = VGNode( 800, -- 帧缓冲纹理的宽度 600, -- 帧缓冲纹理的高度 1.0, -- 可选渲染单位的缩放比例。默认值为 `1.0` 1 -- 可选的边缘抗锯齿系数。默认值为 `1`)local VGNode <const> = require("VGNode")local node = VGNode( 800, -- 帧缓冲纹理的宽度 600, -- 帧缓冲纹理的高度 1.0, -- 可选渲染单位的缩放比例。默认值为 `1.0` 1 -- 可选的边缘抗锯齿系数。默认值为 `1`)import { VGNode } from "Dora";const node = VGNode( 800, // 帧缓冲纹理的宽度 600, // 帧缓冲纹理的高度 1.0, // 可选渲染单位的缩放比例。默认值为 `1.0` 1 // 可选的边缘抗锯齿系数。默认值为 `1`);_ENV = Doranode = VGNode( 800 -- 帧缓冲纹理的宽度 600 -- 帧缓冲纹理的高度 1.0 -- 可选渲染单位的缩放比例。默认值为 `1.0` 1 -- 可选的边缘抗锯齿系数。默认值为 `1`) 这将创建一个 VGNode 实例,我们将使用它把矢量图形渲染到自带的帧缓冲纹理上。 2.2 渲染矢量图形 要渲染矢量图形,使用 VGNode 实例的 render 方法。您需要传递一个包含使用 nvg 模块的绘图命令的函数(闭包)。这些绘图命令会将图形绘制到 VGNode 的帧缓冲纹理上。 nvg 模块提供了绘制矩形、圆形、线条和路径等基本形状的函数。您还可以使用颜色和画笔来自定义形状的外观。 示例:绘制矩形 LuaTealTypeScriptYueScriptlocal VGNode <const> = require("VGNode")local nvg <const> = require("nvg")local Color <const> = require("Color")local node = VGNode(200, 150)node:render(function() nvg.BeginPath() -- 开始新路径 nvg.Rect(0, 0, 200, 150) -- x, y, 宽度, 高度 nvg.FillColor(Color(255, 0, 0, 255)) -- 红色 nvg.Fill()end)local VGNode <const> = require("VGNode")local nvg <const> = require("nvg")local Color <const> = require("Color")local node = VGNode(200, 150)node:render(function() nvg.BeginPath() -- 开始新路径 nvg.Rect(0, 0, 200, 150) -- x, y, 宽度, 高度 nvg.FillColor(Color(255, 0, 0, 255)) -- 红色 nvg.Fill()end)import { VGNode, Color } from "Dora";import * as nvg from "nvg";const node = VGNode(200, 150);node.render(() => { nvg.BeginPath(); // 开始新路径 nvg.Rect(0, 0, 200, 150); // x, y, 宽度, 高度 nvg.FillColor(Color(255, 0, 0, 255)); // 红色 nvg.Fill();});_ENV = Dorawith VGNode 200, 150 \render -> nvg.BeginPath! -- 开始新路径 nvg.Rect 0, 0, 200, 150 -- x, y, 宽度, 高度 nvg.FillColor Color 255, 0, 0, 255 -- 红色 nvg.Fill! 上述代码绘制了一个宽 200、高 150 的红色矩形。并且 render 方法只会在第一次调用时执行,之后会自动缓存渲染结果进行复用。 提示 使用 VGNode 渲染矢量图形时,坐标系原点在节点纹理的左上角,x 轴向右,y 轴向下。以纹理像素乘以缩放值为图形计算单位。 示例:绘制圆形 LuaTealTypeScriptYueScriptlocal VGNode <const> = require("VGNode")local nvg <const> = require("nvg")local Color <const> = require("Color")local node = VGNode(100, 100)node:render(function() nvg.BeginPath() nvg.Circle(50, 50, 50) -- 中心 x, y 和半径 nvg.FillColor(Color(255, 255, 0, 255)) -- 黄色 nvg.Fill()end)local VGNode <const> = require("VGNode")local nvg <const> = require("nvg")local Color <const> = require("Color")local node = VGNode(100, 100)node:render(function() nvg.BeginPath() nvg.Circle(50, 50, 50) -- 中心 x, y 和半径 nvg.FillColor(Color(255, 255, 0, 255)) -- 黄色 nvg.Fill()end)import { VGNode, Color } from "Dora";import * as nvg from "nvg";const node = VGNode(100, 100);node.render(() => { nvg.BeginPath(); nvg.Circle(50, 50, 50); // 中心 x, y 和半径 nvg.FillColor(Color(255, 255, 0, 255)); // 黄色 nvg.Fill();});_ENV = Dorawith VGNode 100, 100 \render -> nvg.BeginPath! -- 开始新路径 nvg.Circle 50, 50, 50 -- 中心 x, y 和半径 nvg.FillColor Color 255, 255, 0, 255 -- 黄色 nvg.Fill! 该代码绘制了一个半径为 50 的黄色圆形。同样,render 方法只会执行一次,并缓存渲染结果进行复用。 3. 直接绘制矢量图形到屏幕 除了使用 VGNode,Dora SSR 还支持直接在屏幕缓冲区的最上层绘制矢量图形。只需在每一帧调用 nvg 模块的绘图函数,即可直接将矢量图形绘制到屏幕上,无需借助 VGNode。 LuaTealTypeScriptYueScriptlocal nvg <const> = require("nvg")local Color <const> = require("Color")local threadLoop <const> = require("threadLoop")threadLoop(function() nvg.BeginPath() nvg.Rect(100, 100, 200, 150) nvg.FillColor(Color(255, 0, 0, 255)) nvg.Fill()end)local nvg <const> = require("nvg")local Color <const> = require("Color")local threadLoop <const> = require("threadLoop")threadLoop(function(): boolean nvg.BeginPath() nvg.Rect(100, 100, 200, 150) nvg.FillColor(Color(255, 0, 0, 255)) nvg.Fill() return falseend)import { Color, threadLoop } from "Dora";import * as nvg from "nvg";threadLoop(() => { nvg.BeginPath(); nvg.Rect(100, 100, 200, 150); nvg.FillColor(Color(255, 0, 0, 255)); nvg.Fill(); return false;});_ENV = DorathreadLoop -> nvg.BeginPath! -- 开始新路径 nvg.Rect 100, 100, 200, 150 nvg.FillColor Color 255, 0, 0, 255 -- 红色 nvg.Fill! 上述代码在屏幕上绘制了一个红色矩形。请注意,这种方式会直接绘制到屏幕缓冲区,并覆盖下面的游戏场景。比较适合用于绘制游戏的 HUD 界面、显示调试信息等。 提示 使用这种绘制方式时,坐标系原点在屏幕左上角,x 轴向右,y 轴向下。在屏幕的可见区,坐标横轴的最大值为 App.visualSize.width,纵轴的最大值为 App.visualSize.height。