Files
DNF_DEV/source_game/Asset/Squirrel/Sqr_UI.hpp
2025-10-23 15:21:12 +08:00

366 lines
9.0 KiB
C++

#pragma once
#include "squirrel/SquirrelEx.h"
#include "EngineFrame/Actor/Actor.h"
#include "EngineFrame/Component/Sprite.h"
static SQInteger _file_releasehook(SQUserPointer p, SQInteger SQ_UNUSED_ARG(size))
{
Actor *Abli = (Actor *)p;
Abli->Release();
return 0;
}
static SQInteger SQR_RegisterDestruction(HSQUIRRELVM v)
{
// 析构函数测试
SQUserPointer P;
sq_getuserpointer(v, 2, &P);
sq_setinstanceup(v, 3, P);
sq_setreleasehook(v, 3, _file_releasehook);
return 0;
}
static SQInteger SQR_CreateActor(HSQUIRRELVM v)
{
RefPtr<Actor> act = new Actor();
act->Retain();
sq_pushuserpointer(v, act.Get());
return 1;
}
static SQInteger SQR_AddChild(HSQUIRRELVM v)
{
SQUserPointer A_obj;
sq_getuserpointer(v, 2, &A_obj);
SQUserPointer B_obj;
sq_getuserpointer(v, 3, &B_obj);
Actor *Aobj = (Actor *)A_obj;
Actor *Bobj = (Actor *)B_obj;
Aobj->AddChild(Bobj);
return 0;
}
static SQInteger SQR_RemoveChild(HSQUIRRELVM v)
{
SQUserPointer A_obj;
sq_getuserpointer(v, 2, &A_obj);
SQUserPointer B_obj;
sq_getuserpointer(v, 3, &B_obj);
Actor *Aobj = (Actor *)A_obj;
Actor *Bobj = (Actor *)B_obj;
Aobj->RemoveChild(Bobj);
return 0;
}
static SQInteger SQR_GetZOrder(HSQUIRRELVM v)
{
SQUserPointer A_obj;
sq_getuserpointer(v, 2, &A_obj);
Actor *Aobj = (Actor *)A_obj;
sq_pushinteger(v, Aobj->GetRenderZOrder());
return 1;
}
static SQInteger SQR_SetZOrder(HSQUIRRELVM v)
{
SQUserPointer A_obj;
sq_getuserpointer(v, 2, &A_obj);
SQInteger Value;
sq_getinteger(v, 3, &Value);
Actor *Aobj = (Actor *)A_obj;
Aobj->SetRenderZOrder(Value);
return 0;
}
static SQInteger SQR_GetPos(HSQUIRRELVM v)
{
SQUserPointer A_obj;
sq_getuserpointer(v, 2, &A_obj);
Actor *Aobj = (Actor *)A_obj;
VecFPos Pos = Aobj->GetPos();
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);
return 1;
}
static SQInteger SQR_SetPos(HSQUIRRELVM v)
{
SQUserPointer A_obj;
sq_getuserpointer(v, 2, &A_obj);
if (sq_gettop(v) == 3)
{
VecFPos Pos;
sq_pushnull(v); // null iterator
while (SQ_SUCCEEDED(sq_next(v, 3)))
{
SQFloat value;
sq_getfloat(v, -1, &value);
const SQChar *key;
sq_getstring(v, -2, &key);
if (strcmp(key, _SC("x")) == 0)
{
Pos.x = value;
}
else if (strcmp(key, _SC("y")) == 0)
{
Pos.y = value;
}
sq_pop(v, 2);
}
sq_pop(v, 1);
Actor *Aobj = (Actor *)A_obj;
Aobj->SetPos(Pos);
}
else if (sq_gettop(v) == 4)
{
SQFloat X, Y;
sq_getfloat(v, 3, &X);
sq_getfloat(v, 4, &Y);
Actor *Aobj = (Actor *)A_obj;
Aobj->SetPos(VecFPos(X, Y));
}
return 0;
}
static SQInteger SQR_GetWorldPos(HSQUIRRELVM v)
{
SQUserPointer A_obj;
sq_getuserpointer(v, 2, &A_obj);
Actor *Aobj = (Actor *)A_obj;
VecFPos Pos = Aobj->GetWorldPos();
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);
return 1;
}
static SQInteger SQR_GetAlpha(HSQUIRRELVM v)
{
SQUserPointer A_obj;
sq_getuserpointer(v, 2, &A_obj);
Actor *Aobj = (Actor *)A_obj;
sq_pushfloat(v, Aobj->GetAlpha());
return 1;
}
static SQInteger SQR_SetAlpha(HSQUIRRELVM v)
{
SQUserPointer A_obj;
sq_getuserpointer(v, 2, &A_obj);
SQFloat Value;
sq_getfloat(v, 3, &Value);
Actor *Aobj = (Actor *)A_obj;
Aobj->SetAlpha(Value);
return 0;
}
static SQInteger SQR_GetScale(HSQUIRRELVM v)
{
SQUserPointer A_obj;
sq_getuserpointer(v, 2, &A_obj);
Actor *Aobj = (Actor *)A_obj;
VecFPos Pos = Aobj->GetScale();
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);
return 1;
}
static SQInteger SQR_SetScale(HSQUIRRELVM v)
{
SQUserPointer A_obj;
sq_getuserpointer(v, 2, &A_obj);
if (sq_gettop(v) == 3)
{
VecFPos Pos;
sq_pushnull(v); // null iterator
while (SQ_SUCCEEDED(sq_next(v, 3)))
{
SQFloat value;
sq_getfloat(v, -1, &value);
const SQChar *key;
sq_getstring(v, -2, &key);
if (strcmp(key, _SC("x")) == 0)
{
Pos.x = value;
}
else if (strcmp(key, _SC("y")) == 0)
{
Pos.y = value;
}
sq_pop(v, 2);
}
sq_pop(v, 1);
Actor *Aobj = (Actor *)A_obj;
Aobj->SetScale(Pos);
}
else if (sq_gettop(v) == 4)
{
SQFloat X, Y;
sq_getfloat(v, 3, &X);
sq_getfloat(v, 4, &Y);
Actor *Aobj = (Actor *)A_obj;
Aobj->SetScale(VecFPos(X, Y));
}
return 0;
}
static SQInteger SQR_GetRotation(HSQUIRRELVM v)
{
SQUserPointer A_obj;
sq_getuserpointer(v, 2, &A_obj);
Actor *Aobj = (Actor *)A_obj;
sq_pushfloat(v, Aobj->GetRotation());
}
static SQInteger SQR_SetRotation(HSQUIRRELVM v)
{
SQUserPointer A_obj;
sq_getuserpointer(v, 2, &A_obj);
SQFloat Value;
sq_getfloat(v, 3, &Value);
Actor *Aobj = (Actor *)A_obj;
Aobj->SetRotation(Value);
return 0;
}
static SQInteger SQR_GetSize(HSQUIRRELVM v)
{
SQUserPointer A_obj;
sq_getuserpointer(v, 2, &A_obj);
Actor *Aobj = (Actor *)A_obj;
VecSize Pos = Aobj->GetSize();
sq_newtable(v);
sq_pushstring(v, _SC("w"), -1);
sq_pushfloat(v, Pos.width);
sq_newslot(v, 3, SQFalse);
sq_pushstring(v, _SC("h"), -1);
sq_pushfloat(v, Pos.height);
sq_newslot(v, 3, SQFalse);
return 1;
}
static SQInteger SQR_SetSize(HSQUIRRELVM v)
{
SQUserPointer A_obj;
sq_getuserpointer(v, 2, &A_obj);
if (sq_gettop(v) == 3)
{
VecSize Size;
sq_pushnull(v); // null iterator
while (SQ_SUCCEEDED(sq_next(v, 3)))
{
SQFloat value;
sq_getfloat(v, -1, &value);
const SQChar *key;
sq_getstring(v, -2, &key);
if (strcmp(key, _SC("w")) == 0)
{
Size.width = value;
}
else if (strcmp(key, _SC("h")) == 0)
{
Size.height = value;
}
sq_pop(v, 2);
}
sq_pop(v, 1);
Actor *Aobj = (Actor *)A_obj;
Aobj->SetSize(Size);
}
else if (sq_gettop(v) == 4)
{
SQFloat X, Y;
sq_getfloat(v, 3, &X);
sq_getfloat(v, 4, &Y);
Actor *Aobj = (Actor *)A_obj;
Aobj->SetSize(VecSize(X, Y));
}
return 0;
}
static SQInteger SQR_SetVisible(HSQUIRRELVM v){
SQUserPointer A_obj;
sq_getuserpointer(v, 2, &A_obj);
SQBool Value;
sq_getbool(v, 3, &Value);
Actor *Aobj = (Actor *)A_obj;
Aobj->SetVisible(Value);
return 0;
}
static SQInteger SQR_CreateSprite(HSQUIRRELVM v)
{
const SQChar *ImgPath;
SQInteger Idx;
sq_getstring(v, 2, &ImgPath);
sq_getinteger(v, 3, &Idx);
RefPtr<Sprite> act = new Sprite(ImgPath, Idx);
act->Retain();
sq_pushuserpointer(v, act.Get());
return 1;
}
static void RegisterUINutApi(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 RegisterUI()
{
SDL_Log("初始化 UI函数-松鼠脚本!");
HSQUIRRELVM v = SquirrelEx::GetInstance().GetSquirrelVM();
// 析构函数
RegisterUINutApi(_SC("sq_RegisterDestruction"), SQR_RegisterDestruction, v);
RegisterUINutApi(_SC("sq_CreateActor"), SQR_CreateActor, v);
RegisterUINutApi(_SC("sq_AddChild"), SQR_AddChild, v);
RegisterUINutApi(_SC("sq_RemoveChild"), SQR_RemoveChild, v);
RegisterUINutApi(_SC("sq_GetZOrder"), SQR_GetZOrder, v);
RegisterUINutApi(_SC("sq_SetZOrder"), SQR_SetZOrder, v);
RegisterUINutApi(_SC("sq_GetPos"), SQR_GetPos, v);
RegisterUINutApi(_SC("sq_SetPos"), SQR_SetPos, v);
RegisterUINutApi(_SC("sq_GetWorldPos"), SQR_GetWorldPos, v);
RegisterUINutApi(_SC("sq_GetAlpha"), SQR_GetAlpha, v);
RegisterUINutApi(_SC("sq_SetAlpha"), SQR_SetAlpha, v);
RegisterUINutApi(_SC("sq_GetScale"), SQR_GetScale, v);
RegisterUINutApi(_SC("sq_SetScale"), SQR_SetScale, v);
RegisterUINutApi(_SC("sq_GetRotation"), SQR_GetRotation, v);
RegisterUINutApi(_SC("sq_SetRotation"), SQR_SetRotation, v);
RegisterUINutApi(_SC("sq_GetSize"), SQR_GetSize, v);
RegisterUINutApi(_SC("sq_SetSize"), SQR_SetSize, v);
RegisterUINutApi(_SC("sq_SetVisible"), SQR_SetVisible, v);
RegisterUINutApi(_SC("sq_CreateSprite"), SQR_CreateSprite, v);
}