SonolusHaniwa
  • 1. 概述
  • 2. ハニプレ
  • 3. ユメステ
  • 4. Stellarity
  • 5. Phigros
  • 首页

    • 1. 概述
  • 玩家

    • 2. 安装服务
    • 3. 配置文件标准
    • 4. 服务使用方法
  • 开发者

    • 5. 自定义搜索函数
    • 6. 自定义资源创建接口
    • 7. 插件开发标准
  • 其他

    • 8. 更新日志
    • 9. 关于 srp 资源包
  • 1. 搭建开发环境
  • 2. Sonolus 基础
  • 3. 配置项目信息
  • 4. 基本数据类型
  • 5. 函数与语句块
  • 6. 注意事项
  • 1. 游玩模式基础
  • 1. 概述
  • 2. ハニプレ
  • 3. ユメステ
  • 4. Stellarity
  • 5. Phigros
  • 首页

    • 1. 概述
  • 玩家

    • 2. 安装服务
    • 3. 配置文件标准
    • 4. 服务使用方法
  • 开发者

    • 5. 自定义搜索函数
    • 6. 自定义资源创建接口
    • 7. 插件开发标准
  • 其他

    • 8. 更新日志
    • 9. 关于 srp 资源包
  • 1. 搭建开发环境
  • 2. Sonolus 基础
  • 3. 配置项目信息
  • 4. 基本数据类型
  • 5. 函数与语句块
  • 6. 注意事项
  • 1. 游玩模式基础
  • 基础知识

    • 1. 搭建开发环境
    • 2. Sonolus 基础
    • 3. 配置项目信息
    • 4. 基本数据类型
    • 5. 函数与语句块
    • 6. 注意事项
  • 游玩模式

    • 1. 游玩模式基础

函数与语句块

函数定义

Sonolus 的引擎数据本身是由 json 来进行编写的,可读性非常差,这就需要 Sonolus.h 或 Sonolus.js 来辅助您将 C/C++ 或 JavaScript/TypeScript 的代码转为机器可读的 json 代码。

为了使您所编写出来的代码更具现代高级语言的风格,我们采用了侵入式写法,这导致了 Sonolus.h 中函数的定义方法不同于正常 C/C++ 函数的定义方法。

下面是基本的 C/C++ 函数的定义方法与 Sonolus.h 函数的定义方法。

int add(int a, int b) {
    return a + b;
}
void add2(int a, int b) {
    cout << a + b << endl;
    return;
}

SonolusApi add(var a, var b) {
    return a + b;
}
SonolusApi add2(var a, var b) {
    DebugLog(a + b);
}

首先,只要是 Sonolus.h 的函数定义,返回值类型都必须是 SonolusApi。

接下来看具体实现上的差别。在原生 C/C++ 中,您需要指定该函数是否有返回值。但是在 Sonolus.h 中,您不需要指定是否有返回值。因为默认所有的 Sonolus.h 函数定义都是具有返回值的,如果您没有 return,解释器将默认该函数返回 0。

语句块

由于新版本 Sonolus.h 解释器的存在,您不再需要使用复杂的宏定义来使用语句块。您在原生 C/C++ 中使用它们的方法,在 Sonolus.h 中仍然适用。

下面是基本使用示例:

SonolusApi TestFunc(var a) {
    if (a == 114514 || a == 1919810) {
        DebugLog(a);
    }
    if (a == 114514 || a == 1919810) DebugLog(a);

    for (var i = 0; i < a; i++) {
        if (i == 114514 || i == 1919810) continue;
        else DebugLog(114514);
        DebugLog(i);
        break;
    }

    var it = a;
    while (it >= 0) {
        DebugLog(it);
        it--;
    }

    switch(a) {
        case 1: DebugLog(1); 
        case 2: DebugLog(2); break;
        default: DebugLog(-1); break;
    }
}

下面是您需要注意的点:

  • 对于 Sonolus.h 函数中的 for 循环,默认都是 Sonolus 运行时 for 循环。如果您使用了编译期 for 循环(也就是在程序运行时执行的 for 循环,非 Sonolus 运行时),可能会导致死循环或不执行的异常情况。
  • 如果您想要 Sonolus.h 函数中使用编译期 for 循环,您需要在初始化语句块最前面添加 CppLoop 宏定义,例如 for (CppLoop int i = 0; i < 100; i++)。
  • 对于 switch 函数,不支持多个 case 对应一种分支的情况。
  • 对于 switch 函数,如果您有大量 case 分支,请使用 SonolusRun(Switch(...)) 语句,否则解释器会生成大量代码,减慢 g++ 的编译速度。
最近更新:: 2025/4/27 15:17
Contributors: LittleYang0531
Prev
4. 基本数据类型
Next
6. 注意事项