SwitchGame/source/squirrel/sqr_sdl.hpp

146 lines
4.2 KiB
C++
Raw Normal View History

2025-09-15 11:28:54 +08:00
#pragma once
#include <string>
#include <squirrel.h> // Squirrel核心头文件
#include <sqstdio.h> // Squirrel标准IO库
#include <sqstdaux.h> // 新增:包含 sqstd_seterrorhandlers 等辅助函数
#include <sqstdblob.h> // 新增:包含 sqstd_register_bloblib 函数
#include <sqstdsystem.h> // 新增:包含 sqstd_register_systemlib 函数
#include <sqstdmath.h> // 新增:包含 sqstd_register_mathlib 函数
#include <sqstdstring.h> // 新增:包含 sqstd_register_stringlib 函数
#include "EngineCore/Asset_ImagePack.h"
#include "EngineCore/Game.h"
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_ttf.h>
// 辅助函数检查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);
}