146 lines
4.2 KiB
C++
146 lines
4.2 KiB
C++
#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);
|
||
} |