feat(脚本引擎): 添加SquirrelVM运行功能并重构主脚本

为SquirrelVM添加run()方法用于执行脚本中的main函数
重构main.nut脚本结构,将打印和错误调用封装到main函数中
在Application启动时自动执行脚本的main函数
This commit is contained in:
2026-03-31 04:16:26 +08:00
parent d25ff7655b
commit ac4d2ffc9a
4 changed files with 38 additions and 3 deletions

View File

@@ -25,9 +25,11 @@ public:
bool init(); bool init();
void shutdown(); void shutdown();
void loadScript(); void loadScript();
void run();
HSQUIRRELVM getVM() const { return vm_; } HSQUIRRELVM getVM() const { return vm_; }
bool isValid() const { return vm_ != nullptr; } bool isValid() const { return vm_ != nullptr; }
bool isInitialized() const { return initialized_; }
private: private:
SquirrelVM() = default; SquirrelVM() = default;

View File

@@ -18,6 +18,7 @@
#include <frostbite2D/platform/windows.h> #include <frostbite2D/platform/windows.h>
#include <frostbite2D/resource/asset.h> #include <frostbite2D/resource/asset.h>
#include <frostbite2D/resource/npk_archive.h> #include <frostbite2D/resource/npk_archive.h>
#include <frostbite2D/script/squirrel_vm.h>
#include <frostbite2D/resource/pvf_archive.h> #include <frostbite2D/resource/pvf_archive.h>
#include <frostbite2D/resource/sound_pack_archive.h> #include <frostbite2D/resource/sound_pack_archive.h>
#include <frostbite2D/scene/scene.h> #include <frostbite2D/scene/scene.h>
@@ -191,7 +192,7 @@ void Application::run() {
return; return;
} }
SDL_Log("Starting application...");
running_ = true; running_ = true;
shouldQuit_ = false; shouldQuit_ = false;
paused_ = false; paused_ = false;
@@ -203,6 +204,10 @@ void Application::run() {
fpsTimer_ = 0.0f; fpsTimer_ = 0.0f;
currentFps_ = 0; currentFps_ = 0;
if (SquirrelVM::get().isInitialized()) {
SquirrelVM::get().run();
}
mainLoop(); mainLoop();
running_ = false; running_ = false;

View File

@@ -76,6 +76,28 @@ void SquirrelVM::loadScript() {
} }
} }
void SquirrelVM::run() {
if (!initialized_ || !vm_) {
return;
}
sq_pushroottable(vm_);
sq_pushstring(vm_, "main", -1);
if (SQ_SUCCEEDED(sq_get(vm_, -2))) {
sq_pushroottable(vm_);
if (SQ_FAILED(sq_call(vm_, 1, SQFalse, SQTrue))) {
SDL_LogError(SDL_LOG_CATEGORY_ERROR,
"[Squirrel] Failed to call main function");
}
sq_pop(vm_, 2);
} else {
sq_pop(vm_, 1);
}
}
bool SquirrelVM::loadScriptFile(const std::string &path) { bool SquirrelVM::loadScriptFile(const std::string &path) {
Asset &asset = Asset::get(); Asset &asset = Asset::get();
std::optional<std::string> content = asset.readFileToString(path); std::optional<std::string> content = asset.readFileToString(path);

View File

@@ -1,2 +1,8 @@
print("中文测试!")
error("中文测试错误!")
function main()
{
print("中文测试!")
error("中文测试错误!")
}