This commit is contained in:
2025-10-06 04:18:49 +08:00
commit df2cacdb92
2784 changed files with 1280840 additions and 0 deletions

View File

@@ -0,0 +1,57 @@
#pragma once
#include "squirrel/SquirrelEx.h"
#include "Actor/Object/ActiveObject.h"
static ActiveObject *GetActiveObject(HSQUIRRELVM v)
{
SQUserPointer ptr;
sq_getuserpointer(v, 2, &ptr);
ActiveObject *obj = (ActiveObject *)ptr;
return obj;
}
static SQInteger SQR_SetSpeed(HSQUIRRELVM v)
{
ActiveObject *obj = GetActiveObject(v);
SQFloat speedX, speedY, speedZ;
sq_getfloat(v, 3, &speedX);
sq_getfloat(v, 4, &speedY);
sq_getfloat(v, 5, &speedZ);
obj->SetSpeed(VecSpeed3(speedX, speedY, speedZ));
return 0;
}
static SQInteger SQR_GetSpeed(HSQUIRRELVM v)
{
ActiveObject *obj = GetActiveObject(v);
VecSpeed3 speed = obj->GetSpeed();
sq_newtable(v);
sq_pushstring(v, _SC("x"), -1);
sq_pushfloat(v, speed.x);
sq_newslot(v, 3, SQFalse);
sq_pushstring(v, _SC("y"), -1);
sq_pushfloat(v, speed.y);
sq_newslot(v, 3, SQFalse);
sq_pushstring(v, _SC("z"), -1);
sq_pushfloat(v, speed.z);
sq_newslot(v, 3, SQFalse);
return 1;
}
static void RegisterActiveObjectNutApi(const SQChar *funcName, SQFUNCTION funcAddr, HSQUIRRELVM v)
{
sq_pushroottable(v);
sq_pushstring(v, funcName, -1);
sq_newclosure(v, funcAddr, 0);
sq_newslot(v, -3, false);
sq_poptop(v);
}
static void RegisterActiveObject()
{
SDL_Log("初始化 动态对象-松鼠脚本!");
HSQUIRRELVM v = SquirrelEx::GetInstance().GetSquirrelVM();
// 设置速度
RegisterActiveObjectNutApi(_SC("sq_SetSpeed"), SQR_SetSpeed, v);
RegisterActiveObjectNutApi(_SC("sq_GetSpeed"), SQR_GetSpeed, v);
}

View File

@@ -0,0 +1,197 @@
#pragma once
#include "squirrel/SquirrelEx.h"
#include "Actor/Object/BaseObject.h"
static BaseObject *GetBaseObject(HSQUIRRELVM v)
{
SQUserPointer ptr;
sq_getuserpointer(v, 2, &ptr);
BaseObject *obj = (BaseObject *)ptr;
return obj;
}
static SQInteger SQR_GetPosition(HSQUIRRELVM v)
{
SQUserPointer ptr;
sq_getuserpointer(v, 2, &ptr);
BaseObject *obj = (BaseObject *)ptr;
VecFPos3 Pos = obj->GetPosition();
sq_newtable(v);
sq_pushstring(v, _SC("x"), -1);
sq_pushfloat(v, Pos.x);
sq_newslot(v, 3, SQFalse);
sq_pushstring(v, _SC("y"), -1);
sq_pushfloat(v, Pos.y);
sq_newslot(v, 3, SQFalse);
sq_pushstring(v, _SC("z"), -1);
sq_pushfloat(v, Pos.z);
sq_newslot(v, 3, SQFalse);
return 1;
}
static SQInteger SQR_SetPosition(HSQUIRRELVM v)
{
SQUserPointer ptr;
sq_getuserpointer(v, 2, &ptr);
BaseObject *obj = (BaseObject *)ptr;
SQFloat PosX, PosY, PosZ;
sq_getfloat(v, 3, &PosX);
sq_getfloat(v, 4, &PosY);
sq_getfloat(v, 5, &PosZ);
obj->SetPosition(VecFPos3(PosX, PosY, PosZ));
return 0;
}
static SQInteger SQR_GetDirection(HSQUIRRELVM v)
{
BaseObject *obj = GetBaseObject(v);
sq_pushinteger(v, obj->GetDirection());
return 1;
}
static SQInteger SQR_SetDirection(HSQUIRRELVM v)
{
BaseObject *obj = GetBaseObject(v);
SQInteger Dir;
sq_getinteger(v, 3, &Dir);
obj->SetDirection(Dir);
return 0;
}
static SQInteger SQR_GetVars(HSQUIRRELVM v)
{
SQUserPointer ptr;
sq_getuserpointer(v, 2, &ptr);
BaseObject *obj = (BaseObject *)ptr;
const SQChar *KeyBuf;
const SQChar *TypeBuf;
sq_getstring(v, 3, &KeyBuf);
sq_getstring(v, 4, &TypeBuf);
std::string Key(KeyBuf);
std::string Type(TypeBuf);
if (Type == "int")
{
std::vector<int> ArrBuf = obj->GetObjectVars().GetArray<int>(Key);
sq_newarray(v, 0);
for (int i = 0; i < ArrBuf.size(); i++)
{
sq_pushinteger(v, ArrBuf[i]);
sq_arrayappend(v, -2);
}
}
else if (Type == "float")
{
std::vector<float> ArrBuf = obj->GetObjectVars().GetArray<float>(Key);
sq_newarray(v, 0);
for (int i = 0; i < ArrBuf.size(); i++)
{
sq_pushfloat(v, ArrBuf[i]);
sq_arrayappend(v, -2);
}
}
else if (Type == "string")
{
std::vector<std::string> ArrBuf = obj->GetObjectVars().GetArray<std::string>(Key);
sq_newarray(v, 0);
for (int i = 0; i < ArrBuf.size(); i++)
{
sq_pushstring(v, ArrBuf[i].c_str(), -1);
sq_arrayappend(v, -2);
}
}
return 1;
}
static SQInteger SQR_SetVars(HSQUIRRELVM v)
{
SQUserPointer ptr;
sq_getuserpointer(v, 2, &ptr);
BaseObject *obj = (BaseObject *)ptr;
const SQChar *KeyBuf;
const SQChar *TypeBuf;
sq_getstring(v, 3, &KeyBuf);
sq_getstring(v, 4, &TypeBuf);
std::string Key(KeyBuf);
std::string Type(TypeBuf);
if (Type == "int")
{
std::vector<int> ArrBuf;
sq_pushnull(v); // null iterator
while (SQ_SUCCEEDED(sq_next(v, 5)))
{
SQInteger value;
sq_getinteger(v, -1, &value);
const SQChar *key;
sq_getstring(v, -2, &key);
ArrBuf.push_back(value);
sq_pop(v, 2);
}
sq_pop(v, 1);
obj->GetObjectVars().AddAll(Key, ArrBuf);
}
else if (Type == "float")
{
std::vector<float> ArrBuf;
sq_pushnull(v); // null iterator
while (SQ_SUCCEEDED(sq_next(v, 5)))
{
SQFloat value;
sq_getfloat(v, -1, &value);
const SQChar *key;
sq_getstring(v, -2, &key);
ArrBuf.push_back(value);
sq_pop(v, 2);
}
sq_pop(v, 1);
obj->GetObjectVars().SetArray(Key, ArrBuf);
}
else if (Type == "string")
{
std::vector<std::string> ArrBuf;
sq_pushnull(v); // null iterator
while (SQ_SUCCEEDED(sq_next(v, 5)))
{
const SQChar *value;
sq_getstring(v, -1, &value);
const SQChar *key;
sq_getstring(v, -2, &key);
ArrBuf.push_back(value);
sq_pop(v, 2);
}
sq_pop(v, 1);
obj->GetObjectVars().AddAll(Key, ArrBuf);
}
return 0;
}
static void RegisterBaseObjectNutApi(const SQChar *funcName, SQFUNCTION funcAddr, HSQUIRRELVM v)
{
sq_pushroottable(v);
sq_pushstring(v, funcName, -1);
sq_newclosure(v, funcAddr, 0);
sq_newslot(v, -3, false);
sq_poptop(v);
}
static void RegisterBaseObject()
{
SDL_Log("初始化 基础对象-松鼠脚本!");
HSQUIRRELVM v = SquirrelEx::GetInstance().GetSquirrelVM();
// 坐标
RegisterBaseObjectNutApi(_SC("sq_GetPosition"), SQR_GetPosition, v);
RegisterBaseObjectNutApi(_SC("sq_SetPosition"), SQR_SetPosition, v);
// 朝向
RegisterBaseObjectNutApi(_SC("sq_GetDirection"), SQR_GetDirection, v);
RegisterBaseObjectNutApi(_SC("sq_SetDirection"), SQR_SetDirection, v);
// 数据储存器
RegisterBaseObjectNutApi(_SC("sq_GetVars"), SQR_GetVars, v);
RegisterBaseObjectNutApi(_SC("sq_SetVars"), SQR_SetVars, v);
}

View File

@@ -0,0 +1,57 @@
#pragma once
#include "squirrel/SquirrelEx.h"
#include "Actor/Object/CharacterObject.h"
static CharacterObject *GetCharacterObject(HSQUIRRELVM v)
{
SQUserPointer ptr;
sq_getuserpointer(v, 2, &ptr);
CharacterObject *obj = (CharacterObject *)ptr;
return obj;
}
static SQInteger SQR_GetState(HSQUIRRELVM v)
{
CharacterObject *obj = GetCharacterObject(v);
sq_pushinteger(v, obj->_StateMachine->GetState());
return 1;
}
static SQInteger SQR_SetState(HSQUIRRELVM v)
{
CharacterObject *obj = GetCharacterObject(v);
SQInteger state;
sq_getinteger(v, 3, &state);
obj->_StateMachine->ChangeState(state);
return 0;
}
static SQInteger SQR_SetAction(HSQUIRRELVM v)
{
CharacterObject *obj = GetCharacterObject(v);
const SQChar *ActionNameBuf;
sq_getstring(v, 3, &ActionNameBuf);
obj->_AnimationManager->SetAction(ActionNameBuf);
return 0;
}
static void RegisterCharacterObjectNutApi(const SQChar *funcName, SQFUNCTION funcAddr, HSQUIRRELVM v)
{
sq_pushroottable(v);
sq_pushstring(v, funcName, -1);
sq_newclosure(v, funcAddr, 0);
sq_newslot(v, -3, false);
sq_poptop(v);
}
static void RegisterCharacterObject()
{
SDL_Log("初始化 角色对象-松鼠脚本!");
HSQUIRRELVM v = SquirrelEx::GetInstance().GetSquirrelVM();
// 获取状态
RegisterCharacterObjectNutApi(_SC("sq_GetState"), SQR_GetState, v);
// 设置状态
RegisterCharacterObjectNutApi(_SC("sq_SetState"), SQR_SetState, v);
// 设置动画
RegisterCharacterObjectNutApi(_SC("sq_SetAction"), SQR_SetAction, v);
}

View File

@@ -0,0 +1,12 @@
#include "SquirrelManager.h"
void SquirrelManager::Init()
{
SDL_Log("开始初始化sqr管理器!");
// 基础对象
RegisterBaseObject();
// 动态对象
RegisterActiveObject();
// 角色对象
RegisterCharacterObject();
}

View File

@@ -0,0 +1,31 @@
#pragma once
#include "Asset/Squirrel/Sqr_BaseObject.hpp"
#include "Asset/Squirrel/Sqr_ActiveObject.hpp"
#include "Asset/Squirrel/Sqr_CharacterObject.hpp"
class SquirrelManager
{
public:
// 删除拷贝构造和赋值运算符,确保无法复制
SquirrelManager(const SquirrelManager &) = delete;
SquirrelManager &operator=(const SquirrelManager &) = delete;
// 移动构造和赋值也删除,避免意外转移
SquirrelManager(SquirrelManager &&) = delete;
SquirrelManager &operator=(SquirrelManager &&) = delete;
// 全局访问点
static SquirrelManager &GetInstance()
{
static SquirrelManager instance; // 局部静态变量,保证只初始化一次
return instance;
}
private:
// 构造函数和析构函数设为私有,防止外部创建和销毁
SquirrelManager() = default;
~SquirrelManager() = default;
public:
// 初始化
void Init();
};