使用 haxe 作为 c++ 和 JavaScript 之间的转译器
Using haxe as a transpiler between c++ and JavaScript
首先我很抱歉post。我一直在问一些关于 haxe 的问题,以及它作为解决我面临的问题的工具的适用性。我对 haxe 的了解非常有限,但我所知道的是我在项目中对 haxe 的理想角色不是正常使用 haxe。所以我想避免的是浪费时间我没有学习这门语言(尽管它看起来非常有趣和强大)只是为了发现它不适合目的。所以我希望从你们这些经验丰富的兽医那里得到一些关于它是否适合目的的建议。我真的希望是这样。
这是我想要实现的目标:
我在游戏行业工作,我需要用 C++ 和 JS 创建一个游戏。 C++ 用于嵌入式系统,JS 用于在线和移动。我对C++和JS都很有经验。
我开发的游戏我只想写一次。现在我可以使用类似 emscripten 的东西从 C++ 到 JS,但这将导致编译后的 JS 代码无法使用 chrome 开发工具轻松调试。我很担心我会 运行 编译 JS 的边缘案例错误,我无法轻易追溯到原始 C++。此外,某些游戏平台需要公平实验室才能查看源代码,这对于已编译的 JS 来说是一个问题。
我真正需要的是一个源代码到源代码的编译器,它可以生成本机和人类可读的 c++ 和 JS 代码,然后我可以使用这些代码并在必要时以其本机形式进行修改,因此 haxe。我看过 haxe 为 C++ 和 JS 生成的代码。 JS 看起来非常容易理解和使用。 C++ 不是那么多,但仍然可以接受。我什至可以阻止 haxe 编译和链接我不需要的 C++。我只要源码
到目前为止一切顺利。
现在我有一个使用 oxygine 2d 引擎的 c++ 游戏框架。它能够显示精灵等以及我为消息总线和有限状态机创建的框架(也加载更有用 类)。我在 JS 中也有一个类似的框架,它使用 Pixijs 作为其 2d 引擎,并且有自己的消息总线等,就像 C++ 引擎一样。
现在我想做的是在 haxe 中编写模块,当我将代码转换为 C++ 和 JS 时,代码可以作为框架的一部分包含在内,并与其受人尊敬的语言引擎一起工作。我在 haxe 中创建的每个对象都将被高度封装,只需要订阅消息总线、处理消息和发回消息即可。它可能还需要知道如何使用其引擎状态机。所以我不知道这是否可以用 haxe 实现,因为消息总线(连同其他对象)不会用 haxe 编写,而是在模块在其本地项目中编译和构建后提供给模块。也许我可以编写自己的 haxe 库,它知道我的两个游戏引擎的语法并且可以根据其目标语言进行转换?不确定是否可能。
感谢您抽出宝贵的时间阅读,以及您可以提供的任何建议。
您可以使用
#if cpp
// c++ implementation
#elseif js
// javascript implementation
#end
允许针对不同的目标进行一些不同的实现,这可以在您的代码中的任何位置,因此您可以将 Haxe 值传递给针对不同目标的不同函数。
要使用外部定义:
具体使用 c++ 可能更复杂,您需要查看 CFFI 或 Linc
https://snowkit.github.io/linc/
复杂性可能是跨越类型。请记住,Haxe c++ 已管理内存,您的引擎可能会以不同的方式做事。 HL也快来了,可能会有一些优势。
看oxygine2d好像有点像FlashAPI?我知道 pixijs 大致基于 Flash API。我相信 OpenFL 现在使用 pixijs 进行 WebGL 渲染。您可能还想看看 NME(具有与 OpenFL 几乎相同的 C++ 接口,但 NME 具有 Cppia 设置之类的东西,有时更稳定)。如果 JS 或 C++ 太慢,您需要查看着色器和 Luxe/Kha 进行渲染,您可能还想尝试 Heaps,它使用 Lime ( openfl ) 和我认为的一些 haxe js webgl。
如果您需要 2D 物理,则使用 Nape,它可以与任何 Haxe 工具包(Luxe、OpenFL、Kha、Flambe)一起使用,有 physaxe,但用得不多。 Kha 和 Nape 信息例如:
https://github.com/lewislepton/kha-examples/blob/master/NAPE/Sources/Project.hx
我真的怀疑你想为不同的平台使用不同的引擎而让你的生活变得艰难,而 HaxeFlixel 或 Punk 可能会为你提供你需要的一切 运行 Nape 在一个交叉目标工具包上,但它是按照你的方式做是非常可行的。
也许可以看看 Tink 或 Thx 的信号事件总线等,宏(如 Tink 中使用的)允许在编译时构建大量结构,因此可以通过在 运行-time,所以补间可以由编译器预先计算。有一个 hxcpp 调试器,如果你在 chrome 中 运行 Haxe,它应该通过 js 源映射给你 Haxe 行号。
希望我已经涵盖了您的大问题的某些方面。
Haxe 允许您与原生混合搭配,但我认为使用 Pixijs 和 oxygine 2d 可能并不理想,因为在纯 Haxe 中肯定有足够好的游戏工具内置目标优化,您只需要去 Kha IRC、Luxe gitter、Haxe IRC 和 OpenFL 论坛问几个问题。
首先我很抱歉post。我一直在问一些关于 haxe 的问题,以及它作为解决我面临的问题的工具的适用性。我对 haxe 的了解非常有限,但我所知道的是我在项目中对 haxe 的理想角色不是正常使用 haxe。所以我想避免的是浪费时间我没有学习这门语言(尽管它看起来非常有趣和强大)只是为了发现它不适合目的。所以我希望从你们这些经验丰富的兽医那里得到一些关于它是否适合目的的建议。我真的希望是这样。
这是我想要实现的目标:
我在游戏行业工作,我需要用 C++ 和 JS 创建一个游戏。 C++ 用于嵌入式系统,JS 用于在线和移动。我对C++和JS都很有经验。
我开发的游戏我只想写一次。现在我可以使用类似 emscripten 的东西从 C++ 到 JS,但这将导致编译后的 JS 代码无法使用 chrome 开发工具轻松调试。我很担心我会 运行 编译 JS 的边缘案例错误,我无法轻易追溯到原始 C++。此外,某些游戏平台需要公平实验室才能查看源代码,这对于已编译的 JS 来说是一个问题。
我真正需要的是一个源代码到源代码的编译器,它可以生成本机和人类可读的 c++ 和 JS 代码,然后我可以使用这些代码并在必要时以其本机形式进行修改,因此 haxe。我看过 haxe 为 C++ 和 JS 生成的代码。 JS 看起来非常容易理解和使用。 C++ 不是那么多,但仍然可以接受。我什至可以阻止 haxe 编译和链接我不需要的 C++。我只要源码
到目前为止一切顺利。
现在我有一个使用 oxygine 2d 引擎的 c++ 游戏框架。它能够显示精灵等以及我为消息总线和有限状态机创建的框架(也加载更有用 类)。我在 JS 中也有一个类似的框架,它使用 Pixijs 作为其 2d 引擎,并且有自己的消息总线等,就像 C++ 引擎一样。
现在我想做的是在 haxe 中编写模块,当我将代码转换为 C++ 和 JS 时,代码可以作为框架的一部分包含在内,并与其受人尊敬的语言引擎一起工作。我在 haxe 中创建的每个对象都将被高度封装,只需要订阅消息总线、处理消息和发回消息即可。它可能还需要知道如何使用其引擎状态机。所以我不知道这是否可以用 haxe 实现,因为消息总线(连同其他对象)不会用 haxe 编写,而是在模块在其本地项目中编译和构建后提供给模块。也许我可以编写自己的 haxe 库,它知道我的两个游戏引擎的语法并且可以根据其目标语言进行转换?不确定是否可能。
感谢您抽出宝贵的时间阅读,以及您可以提供的任何建议。
您可以使用
#if cpp
// c++ implementation
#elseif js
// javascript implementation
#end
允许针对不同的目标进行一些不同的实现,这可以在您的代码中的任何位置,因此您可以将 Haxe 值传递给针对不同目标的不同函数。
要使用外部定义:
具体使用 c++ 可能更复杂,您需要查看 CFFI 或 Linc
https://snowkit.github.io/linc/
复杂性可能是跨越类型。请记住,Haxe c++ 已管理内存,您的引擎可能会以不同的方式做事。 HL也快来了,可能会有一些优势。
看oxygine2d好像有点像FlashAPI?我知道 pixijs 大致基于 Flash API。我相信 OpenFL 现在使用 pixijs 进行 WebGL 渲染。您可能还想看看 NME(具有与 OpenFL 几乎相同的 C++ 接口,但 NME 具有 Cppia 设置之类的东西,有时更稳定)。如果 JS 或 C++ 太慢,您需要查看着色器和 Luxe/Kha 进行渲染,您可能还想尝试 Heaps,它使用 Lime ( openfl ) 和我认为的一些 haxe js webgl。
如果您需要 2D 物理,则使用 Nape,它可以与任何 Haxe 工具包(Luxe、OpenFL、Kha、Flambe)一起使用,有 physaxe,但用得不多。 Kha 和 Nape 信息例如:
https://github.com/lewislepton/kha-examples/blob/master/NAPE/Sources/Project.hx
我真的怀疑你想为不同的平台使用不同的引擎而让你的生活变得艰难,而 HaxeFlixel 或 Punk 可能会为你提供你需要的一切 运行 Nape 在一个交叉目标工具包上,但它是按照你的方式做是非常可行的。
也许可以看看 Tink 或 Thx 的信号事件总线等,宏(如 Tink 中使用的)允许在编译时构建大量结构,因此可以通过在 运行-time,所以补间可以由编译器预先计算。有一个 hxcpp 调试器,如果你在 chrome 中 运行 Haxe,它应该通过 js 源映射给你 Haxe 行号。
希望我已经涵盖了您的大问题的某些方面。
Haxe 允许您与原生混合搭配,但我认为使用 Pixijs 和 oxygine 2d 可能并不理想,因为在纯 Haxe 中肯定有足够好的游戏工具内置目标优化,您只需要去 Kha IRC、Luxe gitter、Haxe IRC 和 OpenFL 论坛问几个问题。