#pragma once #include #include // Squirrel核心头文件 #include // Squirrel标准IO库 #include // 新增:包含 sqstd_seterrorhandlers 等辅助函数 #include // 新增:包含 sqstd_register_bloblib 函数 #include // 新增:包含 sqstd_register_systemlib 函数 #include // 新增:包含 sqstd_register_mathlib 函数 #include // 新增:包含 sqstd_register_stringlib 函数 #include "EngineCore/Asset_ImagePack.h" #include "EngineCore/Game.h" #include #include #include // 辅助函数:检查SDL错误并抛出Squirrel异常 static void checkSDLError(HSQUIRRELVM v) { const char *err = SDL_GetError(); if (err && *err) { sq_throwerror(v, err); SDL_ClearError(); } } // SDL_GetTicks 绑定 static SQInteger sdl_GetTicks(HSQUIRRELVM v) { sq_pushinteger(v, SDL_GetTicks()); return 1; } static SQInteger sdl_CreateTexture(HSQUIRRELVM v) { const SQChar *imgPath; SQInteger Index; sq_getstring(v, 2, &imgPath); sq_getinteger(v, 3, &Index); Asset_ImagePack::IMG *Info = Asset_ImagePack::GetInstance().GetIMG(imgPath); Asset_ImagePack::ImgInfo &Buf = Info->lp_lplist[Index]; SDL_Texture *m_texture = SDL_CreateTexture( Game::GetInstance().GetRenderer(), SDL_PIXELFORMAT_ARGB8888, // 匹配RGBA数据格式 SDL_TEXTUREACCESS_STREAMING, Buf.Width, Buf.Height); int pitch = Buf.Width * 4; SDL_UpdateTexture(m_texture, NULL, Buf.PNGdata, pitch); sq_pushuserpointer(v, m_texture); return 1; } static SQInteger sdl_DrawImg(HSQUIRRELVM v) { SQUserPointer m_texture; SQInteger PosX, PosY, Width, Height; sq_getuserpointer(v, 2, &m_texture); sq_getinteger(v, 3, &PosX); sq_getinteger(v, 4, &PosY); sq_getinteger(v, 5, &Width); sq_getinteger(v, 6, &Height); SDL_Rect Rect = {(int)PosX, (int)PosY, (int)Width, (int)Height}; SDL_RenderCopy(Game::GetInstance().GetRenderer(), (SDL_Texture *)m_texture, NULL, &Rect); return 0; } static SQInteger sdl_DrawImgEx(HSQUIRRELVM v) { const SQChar *imgPath; SQInteger Index, PosX, PosY, BlendMode; SQFloat Rotate; sq_getstring(v, 2, &imgPath); sq_getinteger(v, 3, &Index); sq_getinteger(v, 4, &PosX); sq_getinteger(v, 5, &PosY); sq_getinteger(v, 6, &BlendMode); sq_getfloat(v, 7, &Rotate); Asset_ImagePack::IMG *Info = Asset_ImagePack::GetInstance().GetIMG(imgPath); Asset_ImagePack::ImgInfo &Buf = Info->lp_lplist[Index]; SDL_Point pivotPoint = { (int)(0.5 * Buf.Width), (int)(0.5 * Buf.Height)}; SDL_Texture *m_texture = SDL_CreateTexture( Game::GetInstance().GetRenderer(), SDL_PIXELFORMAT_ARGB8888, // 匹配RGBA数据格式 SDL_TEXTUREACCESS_STREAMING, Buf.Width, Buf.Height); SDL_SetTextureBlendMode(m_texture, (SDL_BlendMode)BlendMode); int pitch = Buf.Width * 4; SDL_UpdateTexture(m_texture, NULL, Buf.PNGdata, pitch); SDL_Rect Rect = {(int)PosX, (int)PosY, Buf.Width, Buf.Height}; SDL_RenderCopyEx(Game::GetInstance().GetRenderer(), m_texture, NULL, &Rect, Rotate, &pivotPoint, SDL_FLIP_NONE); SDL_DestroyTexture(m_texture); return 0; } void RegisterSDLFunctions(HSQUIRRELVM v) { // 创建SDL命名空间 sq_pushstring(v, "SDL", -1); sq_newtable(v); // 注册SDL函数 // 获取Ticks函数 sq_pushstring(v, "GetTicks", -1); sq_newclosure(v, sdl_GetTicks, 0); sq_setparamscheck(v, 1, NULL); sq_rawset(v, -3); // 创建纹理 sq_pushstring(v, "CreateTexture", -1); sq_newclosure(v, sdl_CreateTexture, 0); // sq_setparamscheck(v, 3, NULL); sq_rawset(v, -3); // 渲染一个Img sq_pushstring(v, "DrawImg", -1); sq_newclosure(v, sdl_DrawImg, 0); // sq_setparamscheck(v, 5, NULL); sq_rawset(v, -3); // 渲染一个ImgEx sq_pushstring(v, "DrawImgEx", -1); sq_newclosure(v, sdl_DrawImgEx, 0); sq_rawset(v, -3); // 注册SDL常量 sq_pushstring(v, "RENDERER_ACCELERATED", -1); sq_pushinteger(v, SDL_RENDERER_ACCELERATED); sq_rawset(v, -3); // 将SDL表添加到全局命名空间 sq_rawset(v, -3); }