65.9K
CodeProject 正在变化。 阅读更多。
Home

Conscript IDE:Conscript 脚本语言的集成开发环境 (IDE) 实现

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (23投票s)

2008 年 3 月 13 日

CPOL

4分钟阅读

viewsIcon

107998

downloadIcon

2248

Conscript .NET 脚本引擎系列文章的第三篇,也是最后一篇。

Simple script with accompanying byte code

背景

嵌入式脚本引擎在多个领域都有应用,包括扩展或修改软件应用程序核心功能的能力。在游戏开发领域,脚本为游戏引擎开发者提供了一种将控制权交给设计师的方式,允许他们实现游戏的故事情节事件、NPC 行为等,而无需游戏引擎开发者干预,否则他们可能需要将游戏玩法逻辑硬编码到游戏引擎中。

引言

关于 Conscript .NET 可嵌入脚本引擎的最后一篇文章,介绍了一个 Conscript IDE 的实现,其功能和外观让人联想到 Microsoft Visual Studio 和其他类似的 IDE。

本文包含 C# 源代码形式的 IDE Windows 应用程序,包括脚本引擎本身的代码、IDE,以及一个说明性的宿主函数模块,提供三角函数和渲染 2D 图形的能力。默认情况下,IDE 应用程序本身就是一个宿主函数模块,提供一个 Print 函数,允许在 IDE 的输出窗口中进行文本输出。有关通过宿主函数扩展脚本语言的详细信息,将在 Conscript 系列文章中作为“Dungeon of Despair”脚本游戏文章进行说明。将 Conscript 脚本引擎集成到 IDE 应用程序中的技术已在之前的文章中说明,因此此处不再重复。

使用 Conscript IDE

IDE 窗口布局包括左侧的脚本源面板、右侧的虚拟机详细信息面板以及底部的输出窗口。此外,输出窗口下方的状态栏提供编译状态和文本光标坐标。

脚本面板是一个选项卡控件,允许编辑多个脚本。IDE 提供了一个 ScriptLoader 实现,它通过优先加载 IDE 中的脚本来覆盖默认的脚本加载行为。这允许 IDE 中的一个脚本包含 IDE 中的另一个脚本,即使它尚未保存到磁盘。

VM 面板也是一个选项卡控件,提供对编译后的 Conscript 字节码、全局、脚本和局部作用域、调用堆栈和参数堆栈以及线程锁定状态的访问。VM 面板内的字节码选项卡允许设置断点,并在调试期间高亮显示当前执行的指令。

Debugging a script using single-stepping

作用域选项卡允许在调试期间查看和编辑全局、脚本和局部作用域中的变量。堆栈选项卡允许查看当前调用堆栈和调节函数内变量作用域的参数堆栈。最后,锁定选项卡显示多线程脚本中使用的同步锁的状态。

Debugging a script using single-stepping

输出面板提供编译日志,并充当默认提供的 Print() 宿主函数的输出设备。

Registering a host function module within the IDE

应用程序的菜单栏采用传统布局,包括文件、编辑、构建、调试和帮助菜单。文件菜单提供脚本源管理和 IDE 终止功能。编辑菜单提供标准的撤销/重做和剪切/复制/粘贴功能。构建菜单允许增量或完全重新构建脚本。增量构建实际上只编译已修改的脚本,而重新构建则丢弃所有已编译脚本并从头开始重新编译它们。构建菜单还提供对构建设置对话框的访问,以控制调试代码生成和代码优化,以及对宿主环境对话框的访问,以允许注册宿主函数模块插件。调试菜单提供标准的调试功能,包括单步执行、监视执行、进入、越过和退出函数的能力,以及切换和清除断点。最后,帮助菜单提供对信息对话框的访问。

使用图形宿主函数模块

源代码中包含的示例模块插件实现了两个宿主函数模块:一个用于基本的三角函数,另一个用于简单的 2D 图形。提供的三角函数是

any   math_abs(any);
float math_acos(float);
float math_asin(float);
float math_atan(float);
float math_atan2(float, float);
float math_ceiling(float);
float math_cos(float);
float math_cosh(float);
float math_e();
float math_floor(float);
float math_log(float);
float math_log2(float, float);
float math_max(float);
float math_min(float);
float math_pi();
int   math_round(float);
float math_round2(float, int);
any   math_sign(any);
float math_sin(float);
float math_sinh(float);
float math_sqrt(float);
float math_tan(float);
float math_tanh(float);
float math_rand(float);

图形模块提供的函数是

bool Gfx_Initialise(int, int);
bool Gfx_Shutdown();
bool Gfx_Clear();
bool Gfx_SetColour(int, int, int);
bool Gfx_SetLineWidth(int, int, int);
bool Gfx_DrawLine(int, int, int, int);
bool Gfx_DrawRectangle(int, int, int, int);
bool Gfx_FillRectangle(int, int, int, int);
bool Gfx_DrawEllipse(int, int, int, int);
bool Gfx_FillEllipse(int, int, int, int);
bool Gfx_DrawString(int, int, string);

以下脚本(也包含在模块插件中)演示了图形宿主函数的使用

function main()
{
    Gfx_Initialise(640, 480);
    var intensity = 0;
    for (var index = 0; index < 400; index += 10)
    {
        Gfx_SetColour(255 - intensity, 0, intensity);
        intensity += 5;

        Gfx_DrawLine(0, index, 400 - index, 0);

        Gfx_SetColour(intensity, 255, 0);
        Gfx_FillEllipse(index, 200, index / 4, index / 4);

        Gfx_SetColour(0, 0, 0);
        Gfx_DrawEllipse(index, 200, index / 4, index / 4);
    }

    // pause
    for (var pause = 0; pause < 200000; pause++); 

    Gfx_Shutdown();
}

A demo script illustrating the use of the graphics host function module

相关文章

历史

  • 2008 年 3 月 14 日 - 发布第一个版本。
© . All rights reserved.