#include "SpriteEx.h" #include "SquirrelClassEx.h" //#include "kiwano/render/DirectX/D3DDeviceResources.h" //#include "kiwano/render/DirectX/NativePtr.h" //#include "d2d1effects_2.h" std::unordered_mapImageRecShadowObject; #pragma comment(lib, "d2d1.lib") #pragma comment(lib, "dxguid.lib") extern NPK_M* npk; SpriteEx::SpriteEx(const std::string imgpath, const int frame) { SetFrame(SquirrelClassEx::GetTexturePtrByImg(imgpath, frame)); } void SpriteEx::SetPosition(const Point& point) { TexturePtr t = GetTexture(); ImgInfo Img = *(ImgInfo*)t->GetUserData(); Actor::SetPosition(Point((point.x + Img.Xpos), (point.y + Img.Ypos) * GetScale().y)); } void SpriteEx::SetScale(const Point& point) { //if (ShadowObject) { // ShadowObject->GetTransform().skew = Vec2((-20.0) * (GetParent()->GetScale().x), 0.0); //} Sprite::SetScale(point); } void SpriteEx::OnRender(RenderContext& ctx) { //if (INTERPOLATION_MODE != D2D1_INTERPOLATION_MODE_FORCE_DWORD && COMPOSITE_MODE != D2D1_COMPOSITE_MODE_FORCE_DWORD) //{ // auto bitmap = NativePtr::Get(GetFrame().GetTexture()); // auto d2d_res = graphics::directx::GetD2DDeviceResources(); // d2d_res->GetDeviceContext()->DrawImage( // bitmap.Get(), // INTERPOLATION_MODE, // COMPOSITE_MODE // ); // //auto bitmap = NativePtr::Get(GetFrame().GetTexture()); // //auto m_d2dContext = graphics::directx::GetD2DDeviceResources()->GetDeviceContext(); // //ComPtr chromakeyEffect; // //m_d2dContext->CreateEffect(CLSID_D2D1Emboss, &chromakeyEffect); // // // //chromakeyEffect->SetInput(0, bitmap.Get()); // ////chromakeyEffect->SetValue(D2D1_CHROMAKEY_PROP_COLOR, Color{ 1.0f, 1.0f, 1.0f, 1.0f }); // ////chromakeyEffect->SetValue(D2D1_CHROMAKEY_PROP_TOLERANCE, 0.2f); // ////chromakeyEffect->SetValue(D2D1_CHROMAKEY_PROP_INVERT_ALPHA, true); // //chromakeyEffect->SetValue(D2D1_EMBOSS_PROP_HEIGHT, 1.0f); // //chromakeyEffect->SetValue(D2D1_EMBOSS_PROP_DIRECTION, 0.0f); // //m_d2dContext->DrawImage(chromakeyEffect.Get()); //} //else { // this->Sprite::OnRender(ctx); //} switch (MyModel) { case -1: //-1原始模式 ctx.SetBlendMode(BlendMode::SourceOver); break; case 0: //0线性减淡 ctx.SetBlendMode(BlendMode::Add); break; default: ctx.SetBlendMode(BlendMode::SourceOver); break; } this->Sprite::OnRender(ctx); } //void SpriteEx::OnUpdate(Duration dt) { // //当处于播放状态 // if (is_Animotion_Play) { // //当前帧小于总帧时执行逻辑 // if (NowFrameIndex < MaxFrameCount) { // if (OffsetTime == 0)OffsetTime = clock(); // if ((clock() - OffsetTime) >= MyDelay[NowFrameIndex]) { // OffsetTime = clock(); // NowFrameIndex++; // SquirrelClassEx::RunUpdateScript("AnimotionUpdateCallBack", this->GetObjectID(), NowFrameIndex); // } // } // //否则重置时间 重置当前帧 // else { // OffsetTime = 0; // NowFrameIndex = 0; // MyLoop--; // if (MyLoop != 0) { // SquirrelClassEx::RunUpdateScript("AnimotionUpdateCallBack", this->GetObjectID(), NowFrameIndex); // } // else { // is_Animotion_Play = false; // } // } // } //} void SpriteEx::SetFrameInfo(std::vector FrameDaley , const int Loop) { MyDelay = FrameDaley; MaxFrameCount = FrameDaley.size(); MyLoop = Loop; } void SpriteEx::SetAnimotionPlay(bool Type) { is_Animotion_Play = Type; //开始播放以后 第一次先传入第0帧 SquirrelClassEx::RunUpdateScript("AnimotionUpdateCallBack", this->GetObjectID(), NowFrameIndex); } void SpriteEx::SetAnimotionFrame(const int gFrame) { this->NowFrameIndex = gFrame; } void SpriteEx::SetShadow() { TexturePtr t; ImgInfo Img = *(ImgInfo*)GetTexture()->GetUserData(); if (ImageRecShadowObject.count(GetTexture()->GetObjectID())) { t = ImageRecShadowObject[GetTexture()->GetObjectID()]; } else { BYTE* Data = Img.PNGdata; BYTE* NewData = new BYTE[Img.Height * Img.Width * 4]; for (size_t i = 0; i < Img.Height * Img.Width * 4; i++) { if ((i + 1) % 4 == 0) NewData[i] = Data[i]; else NewData[i] = 0; } BinaryData data = { ((void*)NewData) ,(uint32_t)(Img.Height * Img.Width * 4) }; t = new Texture(); t->Load(PixelSize(Img.Width, Img.Height), data, PixelFormat::Bpp32BGRA); t->SetUserData(&Img); ImageRecShadowObject[GetTexture()->GetObjectID()] = t; } if (ShadowObject) { ShadowObject->SetFrame(t); } else { ShadowObject = new SpriteEx(t); ShadowObject->SetAnchor(1, 1); ShadowObject->SetOpacity(0.4); ShadowObject->SetZOrder(-1); AddChild(ShadowObject); //GetParent()->GetParent()->AddChild(ShadowObject); } Transform B; B.scale = Vec2(1.0, 0.29); B.position = Point(GetWidth(), GetHeight() - 5); B.skew = Vec2((-20.0) * (GetParent()->GetScale().x), 0.0); ShadowObject->SetTransform(B); }