Yosin_Game/CanvasActorRegister.h

219 lines
5.6 KiB
C
Raw Normal View History

2024-05-04 18:30:32 +08:00
#pragma once
//<2F><>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>Map
extern std::map<uint64_t, ActorPtr>ActorPtrMapObject;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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));
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΨһID
uint64_t UUID = _Canvas->GetObjectID();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Map<61><70><EFBFBD><EFBFBD>
ActorPtrMapObject[UUID] = _Canvas;
sq_pushinteger(v, UUID);
return 1;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ⱦ
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;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦ
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;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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();
//ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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);
//<2F>õ<EFBFBD>Squirrel<65>ַ<EFBFBD><D6B7><EFBFBD> <20><><EFBFBD><EFBFBD>·<EFBFBD><C2B7>Key
const SQChar* OutPutBuffer;
sq_getstring(v, 3, &OutPutBuffer);
//<2F>˲<EFBFBD><CBB2><EFBFBD><EFBFBD><EFBFBD>New<65><77>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>
char* OutPutTextbuf = SquirrelClassEx::SquirrelU2W((char*)OutPutBuffer);
std::string OutPutText = OutPutTextbuf;
//<2F><><EFBFBD><EFBFBD>New<65><77><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
delete[]OutPutTextbuf;
//ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5B4B4><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>ʽ
if (Top == 7) {
//<2F>õ<EFBFBD>Squirrel<65>ַ<EFBFBD><D6B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const SQChar* TextStringBuffer;
sq_getstring(v, 4, &TextStringBuffer);
//<2F>˲<EFBFBD><CBB2><EFBFBD><EFBFBD><EFBFBD>New<65><77>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>
char* TextStringbuf = SquirrelClassEx::SquirrelU2W((char*)TextStringBuffer);
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::string TextString = TextStringbuf;
//<2F><><EFBFBD><EFBFBD>New<65><77><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
delete[]TextStringbuf;
SQInteger FontColor;
sq_getinteger(v, 5, &FontColor);
SQFloat Xpos;
sq_getfloat(v, 6, &Xpos);
SQFloat Ypos;
sq_getfloat(v, 7, &Ypos);
//<2F><>ȫ<EFBFBD><C8AB>Map<61>л<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
/*
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD>ʽ
LinearGradientStyle fill_style = LinearGradientStyle(
Point(_Canvas->GetWidth() / 3, 0.0f), // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
Point(_Canvas->GetWidth() * 2 / 3, _Canvas->GetHeight()), // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD>յ<EFBFBD>
{ 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;
}