SwitchGame/source/squirrel/sqr_sdl.hpp

146 lines
4.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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);
}