ProtoGraph 使用介绍
ProtoGraph
ProtoGraph 是一个社区制作的声明式编程语言,旨在与 ProtoFlux 在 Resonite 生态系统中协同工作。它允许创作者以简洁、可读的文本格式编写逻辑,并直接编译为 ProtoFlux 节点——从而更轻松地构建、测试和维护复杂系统。
概述 (Overview)
- 范式:声明式 响应式 数据流
- 家族:ML: Caml: OCaml: F#
- 设计者:Papaltine, Kittysquirrel
- 开发者:Papaltine, Kittysquirrel
- 稳定版本:1.7.0
- 许可证:AGPLv3
- 目标平台:Resonite(通过 ProtoFlux)
- 文件扩展名:
.pg - 编译器工具:
flux-sdk - 仓库:Flux SDK
- VSCode 扩展:ProtoGraph
- Nuget 工具:Papaltine.FluxSDK
- 编译后格式:
.brson(Resonite 记录) - 受以下语言影响:F#, Elm, Python, Haskell, VHDL, Odin, Go
- 公共文件夹:resrec:///U-1O4IcGhlKSm/R-131E69459864F98728F5423884957F2E677BFC75894306493CCADBDAF7E7F154
- 展示世界:https://go.resonite.com/world/U-1O4IcGhlKSm/R-2045c574-dda6-4a7e-9955-56d2ca002d78
- 文档
谁应该考虑 ProtoGraph?
- 希望超越可视化脚本的创作者
- 构建模块化、可重用系统的开发者
- 在大型项目上协作的团队
优势 (Benefits)
- 可读性强:简洁的语法,与 ProtoFlux 一一对应
- 模块化:使用模块(嵌套节点)实现可重用且易于重构的代码
- 版本控制:使用行业标准工具存储、比较、分享和版本控制源代码
- 可靠性高:编译器检查有助于及早捕获错误,甚至可以构建不完整的程序
- 易于上手:即使作为第一门编程语言,对熟悉 ProtoFlux 的人也很友好
- 兼容性好:底层仍是 ProtoFlux,能与 Resonite 的其他部分无缝协作,无需模组或插件
什么时候 ProtoGraph 不是好选择?
- 快速原型:对于小型测试和一次性示例,ProtoFlux 设置起来更快、更容易。
- 高性能要求:请等待 WASM 集成。ProtoGraph 的速度仅与 ProtoFlux 虚拟机相当。
- 纯可视化创作者:ProtoGraph 是 ProtoFlux 的文本版本,需要打字。
在 Resonite 中构建与使用
- 编写您的
.pg文件。 - 编译它:
flux-sdk build MyModule.pg - 将
.brson文件导入 Resonite。 - 在对应槽位下检查生成的 ProtoFlux。
Flux UI
可以在 Resonite 中使用 Flux UI 来连接生成的 ProtoFlux 中的源和驱动。
示例 (Examples)
叉积模块 (Cross Product Module)
这是一个简单的纯模块,将输入数据转换为输出。
/// 使用叉积计算两个三维向量的乘积
module CrossProduct
/// 第一个向量
in A: float3
/// 第二个向量
in B: float3
/// (A X B) 的结果
out this: float3
where {
// 输入
Ax, Ay, Az = A->unpack;
Bx, By, Bz = B->unpack;
// 计算
Cx = (Ay * Bz) - (Az * By);
Cy = (Az * Bx) - (Ax * Bz);
Cz = (Ax * By) - (Ay * Bx);
// 最终结果
pack<float3>(Cx, Cy, Cz);
}
计数器对象 (Counter Object)
展示了如何编写一个维护内部状态并公开可调用方法的对象。
/// 一个可以向上和向下计数的简单对象状态机
module Counter
/// 计数器的当前值
out this: int
/// 增加计数的公开方法
out Increment: Impulse
/// 减少计数的公开方法
out Decrement: Impulse
/// 将计数器设置为 0 的公开方法
out Reset: Impulse
where {
// 变量不与其他节点共享,它们是私有的
sync CounterVar: int;
// out 脉冲是对象上的方法,用于向其发送消息以执行不同操作
Reset = CounterVar <- 0;
Increment = CounterVar <- ValueInc(CounterVar);
Decrement = CounterVar <- ValueDec(CounterVar);
// 我们也可以暴露普通数据。这类似于 getter。
CounterVar;
}
弹跳球 (Bouncing Ball)
一个抛体运动的物理模拟,每次撞击地面时能量会损耗。
No comments to display
No comments to display