219 lines
5.6 KiB
C++
219 lines
5.6 KiB
C++
#pragma once
|
|
//演员对象智能指针Map
|
|
extern std::map<uint64_t, ActorPtr>ActorPtrMapObject;
|
|
|
|
//创建画布
|
|
static SQInteger Create_Canvas(HSQUIRRELVM v)
|
|
{
|
|
SQInteger Top = sq_gettop(v);
|
|
if (Top <= 0)
|
|
{
|
|
sq_throwerror(v, _SST("Incorrect function argument"));
|
|
return 0;
|
|
}
|
|
|
|
SQFloat X;
|
|
sq_getfloat(v, 2, &X);
|
|
SQFloat Y;
|
|
sq_getfloat(v, 3, &Y);
|
|
|
|
CanvasPtr _Canvas = new Canvas(PixelSize(X, Y));
|
|
//获取对象的唯一ID
|
|
uint64_t UUID = _Canvas->GetObjectID();
|
|
|
|
//将画布对象存入Map管理
|
|
ActorPtrMapObject[UUID] = _Canvas;
|
|
|
|
sq_pushinteger(v, UUID);
|
|
|
|
return 1;
|
|
}
|
|
|
|
//画布开始渲染
|
|
static SQInteger Canvas_BeginDraw(HSQUIRRELVM v)
|
|
{
|
|
SQInteger Top = sq_gettop(v);
|
|
if (Top <= 0)
|
|
{
|
|
sq_throwerror(v, _SST("Incorrect function argument"));
|
|
return 0;
|
|
}
|
|
|
|
SQInteger ActorUUID;
|
|
sq_getinteger(v, 2, &ActorUUID);
|
|
|
|
if (ActorPtrMapObject.count(ActorUUID)) {
|
|
CanvasPtr _Canvas = dynamic_cast<Canvas*>(ActorPtrMapObject[ActorUUID].Get());
|
|
CanvasRenderContextPtr _CanvasRenderContextPtr = _Canvas->GetContext2D();
|
|
_CanvasRenderContextPtr->SetTextAntialiasMode(TextAntialiasMode::None);
|
|
_CanvasRenderContextPtr->BeginDraw();
|
|
sq_pushbool(v, true);
|
|
}
|
|
else {
|
|
sq_pushbool(v, false);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//画布结束渲染
|
|
static SQInteger Canvas_EndDraw(HSQUIRRELVM v)
|
|
{
|
|
SQInteger Top = sq_gettop(v);
|
|
if (Top <= 0)
|
|
{
|
|
sq_throwerror(v, _SST("Incorrect function argument"));
|
|
return 0;
|
|
}
|
|
|
|
SQInteger ActorUUID;
|
|
sq_getinteger(v, 2, &ActorUUID);
|
|
|
|
if (ActorPtrMapObject.count(ActorUUID)) {
|
|
CanvasPtr _Canvas = dynamic_cast<Canvas*>(ActorPtrMapObject[ActorUUID].Get());
|
|
CanvasRenderContextPtr _CanvasRenderContextPtr = _Canvas->GetContext2D();
|
|
_CanvasRenderContextPtr->EndDraw();
|
|
sq_pushbool(v, true);
|
|
}
|
|
else {
|
|
sq_pushbool(v, false);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//画布绘制纹理
|
|
static SQInteger Canvas_DrawTexture(HSQUIRRELVM v)
|
|
{
|
|
SQInteger Top = sq_gettop(v);
|
|
if (Top <= 0)
|
|
{
|
|
sq_throwerror(v, _SST("Incorrect function argument"));
|
|
return 0;
|
|
}
|
|
|
|
SQInteger ActorUUID;
|
|
sq_getinteger(v, 2, &ActorUUID);
|
|
|
|
const SQChar* OutPutBuffer;
|
|
sq_getstring(v, 3, &OutPutBuffer);
|
|
|
|
SQInteger gFrame;
|
|
sq_getinteger(v, 4, &gFrame);
|
|
|
|
SQFloat X;
|
|
sq_getfloat(v, 5, &X);
|
|
SQFloat Y;
|
|
sq_getfloat(v, 6, &Y);
|
|
|
|
if (ActorPtrMapObject.count(ActorUUID)) {
|
|
CanvasPtr _Canvas = dynamic_cast<Canvas*>(ActorPtrMapObject[ActorUUID].Get());
|
|
|
|
CanvasRenderContextPtr _CanvasRenderContextPtr = _Canvas->GetContext2D();
|
|
|
|
//只有坐标参数
|
|
if (Top == 6) {
|
|
Vec2 POS = Vec2(X, Y);
|
|
|
|
TexturePtr t = SquirrelClassEx::GetTexturePtrByImg((char*)OutPutBuffer, gFrame);
|
|
_CanvasRenderContextPtr->DrawTexture(t, POS);
|
|
}
|
|
else if (Top == 8) {
|
|
SQFloat XSize;
|
|
sq_getfloat(v, 7, &XSize);
|
|
SQFloat YSize;
|
|
sq_getfloat(v, 8, &YSize);
|
|
|
|
Vec2 POS = Vec2(X, Y);
|
|
Vec2 Size = Vec2(X + XSize, Y + YSize);
|
|
|
|
TexturePtr t = SquirrelClassEx::GetTexturePtrByImg((char*)OutPutBuffer, gFrame);
|
|
_CanvasRenderContextPtr->DrawTexture(t, POS, Size);
|
|
}
|
|
sq_pushbool(v, true);
|
|
}
|
|
else {
|
|
sq_pushbool(v, false);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
|
|
|
|
//画布绘制文字
|
|
static SQInteger Canvas_DrawText(HSQUIRRELVM v)
|
|
{
|
|
SQInteger Top = sq_gettop(v);
|
|
if (Top <= 0)
|
|
{
|
|
sq_throwerror(v, _SST("Incorrect function argument"));
|
|
return 0;
|
|
}
|
|
|
|
SQInteger ActorUUID;
|
|
sq_getinteger(v, 2, &ActorUUID);
|
|
|
|
//得到Squirrel字符串 字体路径Key
|
|
const SQChar* OutPutBuffer;
|
|
sq_getstring(v, 3, &OutPutBuffer);
|
|
|
|
|
|
//此操作会New出一个字符串需要手动销毁
|
|
char* OutPutTextbuf = SquirrelClassEx::SquirrelU2W((char*)OutPutBuffer);
|
|
std::string OutPutText = OutPutTextbuf;
|
|
//销毁New出来的字符串
|
|
delete[]OutPutTextbuf;
|
|
|
|
//通过字体创建文本样式
|
|
if (Top == 7) {
|
|
//得到Squirrel字符串 文字内容
|
|
const SQChar* TextStringBuffer;
|
|
sq_getstring(v, 4, &TextStringBuffer);
|
|
//此操作会New出一个字符串需要手动销毁
|
|
char* TextStringbuf = SquirrelClassEx::SquirrelU2W((char*)TextStringBuffer);
|
|
//需要绘制的文字内容
|
|
std::string TextString = TextStringbuf;
|
|
//销毁New出来的字符串
|
|
delete[]TextStringbuf;
|
|
|
|
SQInteger FontColor;
|
|
sq_getinteger(v, 5, &FontColor);
|
|
|
|
SQFloat Xpos;
|
|
sq_getfloat(v, 6, &Xpos);
|
|
|
|
SQFloat Ypos;
|
|
sq_getfloat(v, 7, &Ypos);
|
|
|
|
|
|
//从全局Map中获取画布对象
|
|
if (ActorPtrMapObject.count(ActorUUID)) {
|
|
CanvasPtr _Canvas = dynamic_cast<Canvas*>(ActorPtrMapObject[ActorUUID].Get());
|
|
CanvasRenderContextPtr _CanvasRenderContextPtr = _Canvas->GetContext2D();
|
|
TextStyle TsP = TextStyle(FontRecObject[OutPutText]);
|
|
TsP.alignment = TextAlign::Center;
|
|
/*
|
|
// 创建线性渐变样式
|
|
LinearGradientStyle fill_style = LinearGradientStyle(
|
|
Point(_Canvas->GetWidth() / 3, 0.0f), // 线性样式起点
|
|
Point(_Canvas->GetWidth() * 2 / 3, _Canvas->GetHeight()), // 线性样式终点
|
|
{ GradientStop(0.0f, Color::Yellow), GradientStop(1.0f, Color::Green) }
|
|
);
|
|
*/
|
|
|
|
|
|
BrushPtr fill_brush = new Brush(FontColor);
|
|
_CanvasRenderContextPtr->SetFillBrush(fill_brush);
|
|
_CanvasRenderContextPtr->DrawTextLayout(TextString, TsP, Point(Xpos, Ypos));
|
|
|
|
sq_pushbool(v, true);
|
|
}
|
|
}
|
|
else {
|
|
sq_pushbool(v, false);
|
|
}
|
|
|
|
|
|
return 1;
|
|
}
|