Add Library

This commit is contained in:
Nomango 2019-11-07 18:16:28 +08:00
parent 4667333e7c
commit 48d85a1e97
12 changed files with 608 additions and 190 deletions

View File

@ -12,6 +12,7 @@
<ClInclude Include="..\..\src\kiwano\2d\Frame.h" /> <ClInclude Include="..\..\src\kiwano\2d\Frame.h" />
<ClInclude Include="..\..\src\kiwano\2d\GifSprite.h" /> <ClInclude Include="..\..\src\kiwano\2d\GifSprite.h" />
<ClInclude Include="..\..\src\kiwano\base\Director.h" /> <ClInclude Include="..\..\src\kiwano\base\Director.h" />
<ClInclude Include="..\..\src\kiwano\base\Library.h" />
<ClInclude Include="..\..\src\kiwano\base\win32\ComPtr.hpp" /> <ClInclude Include="..\..\src\kiwano\base\win32\ComPtr.hpp" />
<ClInclude Include="..\..\src\kiwano\base\win32\helper.h" /> <ClInclude Include="..\..\src\kiwano\base\win32\helper.h" />
<ClInclude Include="..\..\src\kiwano\core\any.hpp" /> <ClInclude Include="..\..\src\kiwano\core\any.hpp" />
@ -118,6 +119,7 @@
<ClCompile Include="..\..\src\kiwano\base\EventDispatcher.cpp" /> <ClCompile Include="..\..\src\kiwano\base\EventDispatcher.cpp" />
<ClCompile Include="..\..\src\kiwano\base\EventListener.cpp" /> <ClCompile Include="..\..\src\kiwano\base\EventListener.cpp" />
<ClCompile Include="..\..\src\kiwano\base\Input.cpp" /> <ClCompile Include="..\..\src\kiwano\base\Input.cpp" />
<ClCompile Include="..\..\src\kiwano\base\Library.cpp" />
<ClCompile Include="..\..\src\kiwano\base\Logger.cpp" /> <ClCompile Include="..\..\src\kiwano\base\Logger.cpp" />
<ClCompile Include="..\..\src\kiwano\base\ObjectBase.cpp" /> <ClCompile Include="..\..\src\kiwano\base\ObjectBase.cpp" />
<ClCompile Include="..\..\src\kiwano\base\Resource.cpp" /> <ClCompile Include="..\..\src\kiwano\base\Resource.cpp" />

View File

@ -300,6 +300,9 @@
<ClInclude Include="..\..\src\kiwano\utils\UserData.h"> <ClInclude Include="..\..\src\kiwano\utils\UserData.h">
<Filter>utils</Filter> <Filter>utils</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\src\kiwano\base\Library.h">
<Filter>base</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\..\src\kiwano\ui\Button.cpp"> <ClCompile Include="..\..\src\kiwano\ui\Button.cpp">
@ -476,5 +479,8 @@
<ClCompile Include="..\..\src\kiwano\utils\UserData.cpp"> <ClCompile Include="..\..\src\kiwano\utils\UserData.cpp">
<Filter>utils</Filter> <Filter>utils</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\src\kiwano\base\Library.cpp">
<Filter>base</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -28,7 +28,7 @@ namespace kiwano
namespace modules namespace modules
{ {
XAudio2::XAudio2() XAudio2::XAudio2()
: xaudio2(nullptr) : xaudio2()
, XAudio2Create(nullptr) , XAudio2Create(nullptr)
{ {
const auto xaudio2_dll_names = const auto xaudio2_dll_names =
@ -40,16 +40,17 @@ namespace kiwano
for (const auto& name : xaudio2_dll_names) for (const auto& name : xaudio2_dll_names)
{ {
xaudio2 = LoadLibraryW(name); if (xaudio2.Load(name))
if (xaudio2)
{ {
XAudio2Create = (PFN_XAudio2Create)
GetProcAddress(xaudio2, "XAudio2Create");
break; break;
} }
} }
if (!xaudio2) if (xaudio2.IsValid())
{
XAudio2Create = xaudio2.GetProcess<PFN_XAudio2Create>(L"XAudio2Create");
}
else
{ {
KGE_ERROR_LOG(L"Load xaudio2.dll failed"); KGE_ERROR_LOG(L"Load xaudio2.dll failed");
throw std::runtime_error("Load xaudio2.dll failed"); throw std::runtime_error("Load xaudio2.dll failed");
@ -57,8 +58,8 @@ namespace kiwano
} }
MediaFoundation::MediaFoundation() MediaFoundation::MediaFoundation()
: mfplat(nullptr) : mfplat()
, mfreadwrite(nullptr) , mfreadwrite()
, MFStartup(nullptr) , MFStartup(nullptr)
, MFShutdown(nullptr) , MFShutdown(nullptr)
, MFCreateMediaType(nullptr) , MFCreateMediaType(nullptr)
@ -67,23 +68,13 @@ namespace kiwano
, MFCreateSourceReaderFromByteStream(nullptr) , MFCreateSourceReaderFromByteStream(nullptr)
, MFCreateMFByteStreamOnStream(nullptr) , MFCreateMFByteStreamOnStream(nullptr)
{ {
mfplat = LoadLibraryW(L"Mfplat.dll"); if (mfplat.Load(L"Mfplat.dll"))
if (mfplat)
{ {
MFStartup = (PFN_MFStartup) MFStartup = mfplat.GetProcess<PFN_MFStartup>(L"MFStartup");
GetProcAddress(mfplat, "MFStartup"); MFShutdown = mfplat.GetProcess<PFN_MFShutdown>(L"MFShutdown");
MFCreateMediaType = mfplat.GetProcess<PFN_MFCreateMediaType>(L"MFCreateMediaType");
MFShutdown = (PFN_MFShutdown) MFCreateWaveFormatExFromMFMediaType = mfplat.GetProcess<PFN_MFCreateWaveFormatExFromMFMediaType>(L"MFCreateWaveFormatExFromMFMediaType");
GetProcAddress(mfplat, "MFShutdown"); MFCreateMFByteStreamOnStream = mfplat.GetProcess<PFN_MFCreateMFByteStreamOnStream>(L"MFCreateMFByteStreamOnStream");
MFCreateMediaType = (PFN_MFCreateMediaType)
GetProcAddress(mfplat, "MFCreateMediaType");
MFCreateWaveFormatExFromMFMediaType = (PFN_MFCreateWaveFormatExFromMFMediaType)
GetProcAddress(mfplat, "MFCreateWaveFormatExFromMFMediaType");
MFCreateMFByteStreamOnStream = (PFN_MFCreateMFByteStreamOnStream)
GetProcAddress(mfplat, "MFCreateMFByteStreamOnStream");
} }
else else
{ {
@ -91,14 +82,10 @@ namespace kiwano
throw std::runtime_error("Load Mfplat.dll failed"); throw std::runtime_error("Load Mfplat.dll failed");
} }
mfreadwrite = LoadLibraryW(L"Mfreadwrite.dll"); if (mfreadwrite.Load(L"Mfreadwrite.dll"))
if (mfreadwrite)
{ {
MFCreateSourceReaderFromURL = (PFN_MFCreateSourceReaderFromURL) MFCreateSourceReaderFromURL = mfreadwrite.GetProcess<PFN_MFCreateSourceReaderFromURL>(L"MFCreateSourceReaderFromURL");
GetProcAddress(mfreadwrite, "MFCreateSourceReaderFromURL"); MFCreateSourceReaderFromByteStream = mfreadwrite.GetProcess<PFN_MFCreateSourceReaderFromByteStream>(L"MFCreateSourceReaderFromByteStream");
MFCreateSourceReaderFromByteStream = (PFN_MFCreateSourceReaderFromByteStream)
GetProcAddress(mfreadwrite, "MFCreateSourceReaderFromByteStream");
} }
else else
{ {

View File

@ -19,6 +19,7 @@
// THE SOFTWARE. // THE SOFTWARE.
#pragma once #pragma once
#include <kiwano/base/Library.h>
#include <xaudio2.h> #include <xaudio2.h>
#include <mfapi.h> #include <mfapi.h>
#include <mfidl.h> #include <mfidl.h>
@ -32,13 +33,6 @@ namespace kiwano
{ {
class KGE_API XAudio2 class KGE_API XAudio2
{ {
XAudio2();
HMODULE xaudio2;
// XAudio2 functions
typedef HRESULT(WINAPI* PFN_XAudio2Create)(IXAudio2**, UINT32, XAUDIO2_PROCESSOR);
public: public:
static inline XAudio2& Get() static inline XAudio2& Get()
{ {
@ -46,16 +40,29 @@ namespace kiwano
return instance; return instance;
} }
// XAudio2 functions
typedef HRESULT(WINAPI* PFN_XAudio2Create)(IXAudio2**, UINT32, XAUDIO2_PROCESSOR);
PFN_XAudio2Create XAudio2Create; PFN_XAudio2Create XAudio2Create;
private:
XAudio2();
XAudio2(const XAudio2&) = delete;
XAudio2& operator=(const XAudio2&) = delete;
Library xaudio2;
}; };
class KGE_API MediaFoundation class KGE_API MediaFoundation
{ {
MediaFoundation(); public:
static inline MediaFoundation& Get()
HMODULE mfplat; {
HMODULE mfreadwrite; static MediaFoundation instance;
return instance;
}
// MediaFoundation functions // MediaFoundation functions
typedef HRESULT(WINAPI* PFN_MFStartup)(ULONG, DWORD); typedef HRESULT(WINAPI* PFN_MFStartup)(ULONG, DWORD);
@ -66,13 +73,6 @@ namespace kiwano
typedef HRESULT(WINAPI* PFN_MFCreateSourceReaderFromByteStream)(IMFByteStream*, IMFAttributes*, IMFSourceReader**); typedef HRESULT(WINAPI* PFN_MFCreateSourceReaderFromByteStream)(IMFByteStream*, IMFAttributes*, IMFSourceReader**);
typedef HRESULT(WINAPI* PFN_MFCreateMFByteStreamOnStream)(IStream*, IMFByteStream**); typedef HRESULT(WINAPI* PFN_MFCreateMFByteStreamOnStream)(IStream*, IMFByteStream**);
public:
static inline MediaFoundation& Get()
{
static MediaFoundation instance;
return instance;
}
PFN_MFStartup MFStartup; PFN_MFStartup MFStartup;
PFN_MFShutdown MFShutdown; PFN_MFShutdown MFShutdown;
PFN_MFCreateMediaType MFCreateMediaType; PFN_MFCreateMediaType MFCreateMediaType;
@ -80,6 +80,15 @@ namespace kiwano
PFN_MFCreateSourceReaderFromURL MFCreateSourceReaderFromURL; PFN_MFCreateSourceReaderFromURL MFCreateSourceReaderFromURL;
PFN_MFCreateSourceReaderFromByteStream MFCreateSourceReaderFromByteStream; PFN_MFCreateSourceReaderFromByteStream MFCreateSourceReaderFromByteStream;
PFN_MFCreateMFByteStreamOnStream MFCreateMFByteStreamOnStream; PFN_MFCreateMFByteStreamOnStream MFCreateMFByteStreamOnStream;
private:
MediaFoundation();
MediaFoundation(const MediaFoundation&) = delete;
MediaFoundation& operator=(const MediaFoundation&) = delete;
Library mfplat;
Library mfreadwrite;
}; };
} }
} }

View File

@ -49,109 +49,109 @@ namespace kiwano
Actor(); Actor();
// 更新角色 // 更新角色
virtual void OnUpdate(Duration dt) { KGE_NOT_USED(dt); } virtual void OnUpdate(Duration dt);
// 渲染角色 // 渲染角色
virtual void OnRender(RenderTarget* rt) { KGE_NOT_USED(rt); } virtual void OnRender(RenderTarget* rt);
// 获取显示状态 // 获取显示状态
bool IsVisible() const { return visible_; } bool IsVisible() const;
// 获取响应状态 // 获取响应状态
bool IsResponsible() const { return responsible_; } bool IsResponsible() const;
// 是否启用级联透明度 // 是否启用级联透明度
bool IsCascadeOpacityEnabled() const { return cascade_opacity_; } bool IsCascadeOpacityEnabled() const;
// 获取名称的 Hash 值 // 获取名称的 Hash 值
size_t GetHashName() const { return hash_name_; } size_t GetHashName() const;
// 获取 Z 轴顺序 // 获取 Z 轴顺序
int GetZOrder() const { return z_order_; } int GetZOrder() const;
// 获取坐标 // 获取坐标
Point const& GetPosition() const { return transform_.position; } Point const& GetPosition() const;
// 获取 x 坐标 // 获取 x 坐标
float GetPositionX() const { return GetPosition().x; } float GetPositionX() const;
// 获取 y 坐标 // 获取 y 坐标
float GetPositionY() const { return GetPosition().y; } float GetPositionY() const;
// 获取缩放比例 // 获取缩放比例
Point const& GetScale() const { return transform_.scale; } Point const& GetScale() const;
// 获取横向缩放比例 // 获取横向缩放比例
float GetScaleX() const { return GetScale().x; } float GetScaleX() const;
// 获取纵向缩放比例 // 获取纵向缩放比例
float GetScaleY() const { return GetScale().y; } float GetScaleY() const;
// 获取错切角度 // 获取错切角度
Point const& GetSkew() const { return transform_.skew; } Point const& GetSkew() const;
// 获取横向错切角度 // 获取横向错切角度
float GetSkewX() const { return GetSkew().x; } float GetSkewX() const;
// 获取纵向错切角度 // 获取纵向错切角度
float GetSkewY() const { return GetSkew().y; } float GetSkewY() const;
// 获取旋转角度 // 获取旋转角度
float GetRotation() const { return transform_.rotation; } float GetRotation() const;
// 获取宽度 // 获取宽度
float GetWidth() const { return GetSize().x; } float GetWidth() const;
// 获取高度 // 获取高度
float GetHeight() const { return GetSize().y; } float GetHeight() const;
// 获取大小 // 获取大小
Size const& GetSize() const { return size_; } Size const& GetSize() const;
// 获取缩放后的宽度 // 获取缩放后的宽度
float GetScaledWidth() const { return GetWidth() * GetScaleX(); } float GetScaledWidth() const;
// 获取缩放后的高度 // 获取缩放后的高度
float GetScaledHeight() const { return GetHeight() * GetScaleY(); } float GetScaledHeight() const;
// 获取缩放后的大小 // 获取缩放后的大小
Size GetScaledSize() const { return Size{ GetScaledWidth(), GetScaledHeight() }; } Size GetScaledSize() const;
// 获取锚点 // 获取锚点
Point const& GetAnchor() const { return anchor_; } Point const& GetAnchor() const;
// 获取 x 方向锚点 // 获取 x 方向锚点
float GetAnchorX() const { return GetAnchor().x; } float GetAnchorX() const;
// 获取 y 方向锚点 // 获取 y 方向锚点
float GetAnchorY() const { return GetAnchor().y; } float GetAnchorY() const;
// 获取透明度 // 获取透明度
float GetOpacity() const { return opacity_; } float GetOpacity() const;
// 获取显示透明度 // 获取显示透明度
float GetDisplayedOpacity() const { return displayed_opacity_; } float GetDisplayedOpacity() const;
// 获取变换 // 获取变换
Transform GetTransform() const { return transform_; } Transform GetTransform() const;
// 获取父角色 // 获取父角色
inline Actor* GetParent() const { return parent_; } Actor* GetParent() const;
// 获取所在舞台 // 获取所在舞台
inline Stage* GetStage() const { return stage_; } Stage* GetStage() const;
// 获取边框 // 获取边框
virtual Rect GetBounds() const; virtual Rect GetBounds() const;
// 获取外切包围盒 // 获取外切包围盒
virtual Rect GetBoundingBox() const; virtual Rect GetBoundingBox() const;
// 获取二维变换矩阵 // 获取二维变换矩阵
Matrix3x2 const& GetTransformMatrix() const; Matrix3x2 const& GetTransformMatrix() const;
// 获取二维变换的逆矩阵 // 获取二维变换的逆矩阵
Matrix3x2 const& GetTransformInverseMatrix() const; Matrix3x2 const& GetTransformInverseMatrix() const;
// 设置是否显示 // 设置是否显示
void SetVisible( void SetVisible(
@ -169,13 +169,10 @@ namespace kiwano
); );
// 设置坐标 // 设置坐标
inline void SetPosition( void SetPosition(
float x, float x,
float y float y
) );
{
SetPosition(Point{ x, y });
}
// 设置横坐标 // 设置横坐标
void SetPositionX( void SetPositionX(
@ -193,13 +190,10 @@ namespace kiwano
); );
// 移动坐标 // 移动坐标
inline void Move( void Move(
float vx, float vx,
float vy float vy
) );
{
Move(Vec2{ vx, vy });
}
// 设置缩放比例 // 设置缩放比例
// 默认为 (1.0, 1.0) // 默认为 (1.0, 1.0)
@ -209,13 +203,10 @@ namespace kiwano
// 设置缩放比例 // 设置缩放比例
// 默认为 (1.0, 1.0) // 默认为 (1.0, 1.0)
inline void SetScale( void SetScale(
float scalex, float scalex,
float scaley float scaley
) );
{
SetScale(Vec2{ scalex, scaley });
}
// 设置错切角度 // 设置错切角度
// 默认为 (0, 0) // 默认为 (0, 0)
@ -225,13 +216,10 @@ namespace kiwano
// 设置错切角度 // 设置错切角度
// 默认为 (0, 0) // 默认为 (0, 0)
inline void SetSkew( void SetSkew(
float skewx, float skewx,
float skewy float skewy
) );
{
SetSkew(Vec2{ skewx, skewy });
}
// 设置旋转角度 // 设置旋转角度
// 默认为 0 // 默认为 0
@ -247,13 +235,10 @@ namespace kiwano
// 设置锚点位置 // 设置锚点位置
// 默认为 (0, 0), 范围 [0, 1] // 默认为 (0, 0), 范围 [0, 1]
inline void SetAnchor( void SetAnchor(
float anchorx, float anchorx,
float anchory float anchory
) );
{
SetAnchor(Vec2{ anchorx, anchory });
}
// 修改宽度 // 修改宽度
virtual void SetWidth( virtual void SetWidth(
@ -271,13 +256,10 @@ namespace kiwano
); );
// 修改大小 // 修改大小
inline void SetSize( void SetSize(
float width, float width,
float height float height
) );
{
SetSize(Size{ width, height });
}
// 设置透明度 // 设置透明度
// 默认为 1.0, 范围 [0, 1] // 默认为 1.0, 范围 [0, 1]
@ -364,6 +346,24 @@ namespace kiwano
// 判断点是否在角色内 // 判断点是否在角色内
virtual bool ContainsPoint(const Point& point) const; virtual bool ContainsPoint(const Point& point) const;
// 暂停角色更新
void PauseUpdating();
// 继续角色更新
void ResumeUpdating();
// 角色更新是否暂停
bool IsUpdatePausing() const;
// 设置更新时的回调函数
void SetCallbackOnUpdate(UpdateCallback const& cb);
// 获取更新时的回调函数
UpdateCallback GetCallbackOnUpdate() const;
// 渲染角色边界
void ShowBorder(bool show);
// 事件分发 // 事件分发
void Dispatch(Event& evt) override; void Dispatch(Event& evt) override;
@ -373,24 +373,6 @@ namespace kiwano
float anchor_y float anchor_y
); );
// 暂停角色更新
inline void PauseUpdating() { update_pausing_ = true; }
// 继续角色更新
inline void ResumeUpdating() { update_pausing_ = false; }
// 角色更新是否暂停
inline bool IsUpdatePausing() const { return update_pausing_; }
// 设置更新时的回调函数
inline void SetCallbackOnUpdate(UpdateCallback const& cb) { cb_update_ = cb; }
// 获取更新时的回调函数
inline UpdateCallback GetCallbackOnUpdate() const { return cb_update_; }
// 渲染角色边界
inline void ShowBorder(bool show) { show_border_ = show; }
protected: protected:
virtual void Update(Duration dt); virtual void Update(Duration dt);
@ -439,4 +421,219 @@ namespace kiwano
mutable Matrix3x2 transform_matrix_inverse_; mutable Matrix3x2 transform_matrix_inverse_;
}; };
inline void Actor::OnUpdate(Duration dt)
{
KGE_NOT_USED(dt);
}
inline void Actor::OnRender(RenderTarget* rt)
{
KGE_NOT_USED(rt);
}
inline bool Actor::IsVisible() const
{
return visible_;
}
inline bool Actor::IsResponsible() const
{
return responsible_;
}
inline bool Actor::IsCascadeOpacityEnabled() const
{
return cascade_opacity_;
}
inline size_t Actor::GetHashName() const
{
return hash_name_;
}
inline int Actor::GetZOrder() const
{
return z_order_;
}
inline Point const& Actor::GetPosition() const
{
return transform_.position;
}
inline float Actor::GetPositionX() const
{
return GetPosition().x;
}
inline float Actor::GetPositionY() const
{
return GetPosition().y;
}
inline Point const& Actor::GetScale() const
{
return transform_.scale;
}
inline float Actor::GetScaleX() const
{
return GetScale().x;
}
inline float Actor::GetScaleY() const
{
return GetScale().y;
}
inline Point const& Actor::GetSkew() const
{
return transform_.skew;
}
inline float Actor::GetSkewX() const
{
return GetSkew().x;
}
inline float Actor::GetSkewY() const
{
return GetSkew().y;
}
inline float Actor::GetRotation() const
{
return transform_.rotation;
}
inline float Actor::GetWidth() const
{
return GetSize().x;
}
inline float Actor::GetHeight() const
{
return GetSize().y;
}
inline Size const& Actor::GetSize() const
{
return size_;
}
inline float Actor::GetScaledWidth() const
{
return GetWidth() * GetScaleX();
}
inline float Actor::GetScaledHeight() const
{
return GetHeight() * GetScaleY();
}
inline Size Actor::GetScaledSize() const
{
return Size{ GetScaledWidth(), GetScaledHeight() };
}
inline Point const& Actor::GetAnchor() const
{
return anchor_;
}
inline float Actor::GetAnchorX() const
{
return GetAnchor().x;
}
inline float Actor::GetAnchorY() const
{
return GetAnchor().y;
}
inline float Actor::GetOpacity() const
{
return opacity_;
}
inline float Actor::GetDisplayedOpacity() const
{
return displayed_opacity_;
}
inline Transform Actor::GetTransform() const
{
return transform_;
}
inline Actor* Actor::GetParent() const
{
return parent_;
}
inline Stage* Actor::GetStage() const
{
return stage_;
}
inline void Actor::PauseUpdating()
{
update_pausing_ = true;
}
inline void Actor::ResumeUpdating()
{
update_pausing_ = false;
}
inline bool Actor::IsUpdatePausing() const
{
return update_pausing_;
}
inline void Actor::SetCallbackOnUpdate(UpdateCallback const& cb)
{
cb_update_ = cb;
}
inline Actor::UpdateCallback Actor::GetCallbackOnUpdate() const
{
return cb_update_;
}
inline void Actor::ShowBorder(bool show)
{
show_border_ = show;
}
inline void Actor::SetPosition(float x, float y)
{
SetPosition(Point{ x, y });
}
inline void Actor::Move(float vx, float vy)
{
Move(Vec2{ vx, vy });
}
inline void Actor::SetScale(float scalex, float scaley)
{
SetScale(Vec2{ scalex, scaley });
}
inline void Actor::SetAnchor(float anchorx, float anchory)
{
SetAnchor(Vec2{ anchorx, anchory });
}
inline void Actor::SetSize(float width, float height)
{
SetSize(Size{ width, height });
}
inline void Actor::SetSkew(float skewx, float skewy)
{
SetSkew(Vec2{ skewx, skewy });
}
} }

View File

@ -36,42 +36,33 @@ namespace kiwano
friend IntrusiveList<ActionPtr>; friend IntrusiveList<ActionPtr>;
public: public:
enum class Status
{
NotStarted,
Delayed,
Started,
Done,
Removeable
};
Action(); Action();
virtual ~Action(); virtual ~Action();
// 继续动作 // 继续动作
inline void Resume() { running_ = true; } void Resume();
// 暂停动作 // 暂停动作
inline void Pause() { running_ = false; } void Pause();
// 停止动作 // 停止动作
inline void Stop() { status_ = Status::Removeable; } void Stop();
// 设置动作延时 // 设置动作延时
inline void SetDelay(Duration delay) { delay_ = delay; } void SetDelay(Duration delay);
// 设置循环次数 (-1 为永久循环) // 设置循环次数 (-1 为永久循环)
inline void SetLoops(int loops) { loops_ = loops; } void SetLoops(int loops);
// 动作结束时移除目标角色 // 动作结束时移除目标角色
inline void RemoveTargetWhenDone() { detach_target_ = true; } void RemoveTargetWhenDone();
// 设置动作结束时的回调函数 // 设置动作结束时的回调函数
inline void SetDoneCallback(ActionCallback const& cb) { cb_done_ = cb; } void SetDoneCallback(ActionCallback const& cb);
// 设置动作循环结束时的回调函数 // 设置动作循环结束时的回调函数
inline void SetLoopDoneCallback(ActionCallback const& cb) { cb_loop_done_ = cb; } void SetLoopDoneCallback(ActionCallback const& cb);
// 获取动作的拷贝 // 获取动作的拷贝
virtual ActionPtr Clone() const = 0; virtual ActionPtr Clone() const = 0;
@ -79,25 +70,15 @@ namespace kiwano
// 获取动作的倒转 // 获取动作的倒转
virtual ActionPtr Reverse() const = 0; virtual ActionPtr Reverse() const = 0;
inline void Done() { status_ = Status::Done; } bool IsRunning() const;
inline Status GetStatus() const { return status_; } int GetLoops() const;
inline bool IsRunning() const { return running_; } Duration GetDelay() const;
inline bool IsDone() const { return status_ == Status::Done || status_ == Status::Removeable; } ActionCallback GetDoneCallback() const;
inline bool IsRemoveable() const { return status_ == Status::Removeable; } ActionCallback GetLoopDoneCallback() const;
inline int GetLoops() const { return loops_; }
inline Duration GetDelay() const { return delay_; }
inline Duration GetElapsed() const { return elapsed_; }
inline ActionCallback GetDoneCallback() const { return cb_done_; }
inline ActionCallback GetLoopDoneCallback() const { return cb_loop_done_; }
protected: protected:
virtual void Init(ActorPtr target); virtual void Init(ActorPtr target);
@ -110,7 +91,28 @@ namespace kiwano
void Restart(ActorPtr target); void Restart(ActorPtr target);
protected: enum class Status
{
NotStarted,
Delayed,
Started,
Done,
Removeable
};
Status GetStatus() const;
Duration GetElapsed() const;
int GetLoopsDone() const;
void Done();
bool IsDone() const;
bool IsRemoveable() const;
private:
Status status_; Status status_;
bool running_; bool running_;
bool detach_target_; bool detach_target_;
@ -121,4 +123,100 @@ namespace kiwano
ActionCallback cb_done_; ActionCallback cb_done_;
ActionCallback cb_loop_done_; ActionCallback cb_loop_done_;
}; };
inline void Action::Resume()
{
running_ = true;
}
inline void Action::Pause()
{
running_ = false;
}
inline void Action::Stop()
{
Done();
}
inline void Action::SetDelay(Duration delay)
{
delay_ = delay;
}
inline void Action::SetLoops(int loops)
{
loops_ = loops;
}
inline void Action::RemoveTargetWhenDone()
{
detach_target_ = true;
}
inline void Action::SetDoneCallback(ActionCallback const& cb)
{
cb_done_ = cb;
}
inline void Action::SetLoopDoneCallback(ActionCallback const& cb)
{
cb_loop_done_ = cb;
}
inline void Action::Done()
{
status_ = Status::Done;
}
inline Action::Status Action::GetStatus() const
{
return status_;
}
inline bool Action::IsRunning() const
{
return running_;
}
inline bool Action::IsDone() const
{
return status_ == Status::Done || status_ == Status::Removeable;
}
inline bool Action::IsRemoveable() const
{
return status_ == Status::Removeable;
}
inline int Action::GetLoops() const
{
return loops_;
}
inline Duration Action::GetDelay() const
{
return delay_;
}
inline Duration Action::GetElapsed() const
{
return elapsed_;
}
inline int Action::GetLoopsDone() const
{
return loops_done_;
}
inline ActionCallback Action::GetDoneCallback() const
{
return cb_done_;
}
inline ActionCallback Action::GetLoopDoneCallback() const
{
return cb_loop_done_;
}
} }

View File

@ -29,12 +29,12 @@ namespace kiwano
ActionPtr ActionDelay::Clone() const ActionPtr ActionDelay::Clone() const
{ {
return new ActionDelay(delay_); return new ActionDelay(GetDelay());
} }
ActionPtr ActionDelay::Reverse() const ActionPtr ActionDelay::Reverse() const
{ {
return new ActionDelay(delay_); return new ActionDelay(GetDelay());
} }
} }

View File

@ -108,15 +108,15 @@ namespace kiwano
} }
else else
{ {
Duration elapsed = elapsed_ - delay_; Duration elapsed = GetElapsed() - GetDelay();
float loops_done = elapsed / dur_; float loops_done = elapsed / dur_;
while (loops_done_ < static_cast<int>(loops_done)) while (GetLoopsDone() < static_cast<int>(loops_done))
{ {
Complete(target); // loops_done_++ Complete(target); // loops_done_++
} }
percent = (status_ == Status::Done) ? 1.f : (loops_done - static_cast<float>(loops_done_)); percent = (GetStatus() == Status::Done) ? 1.f : (loops_done - static_cast<float>(GetLoopsDone()));
} }
if (ease_func_) if (ease_func_)

View File

@ -0,0 +1,68 @@
// Copyright (c) 2016-2018 Kiwano - Nomango
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include <kiwano/base/Library.h>
namespace kiwano
{
Library::Library()
: instance_(nullptr)
{
}
Library::Library(String const& lib)
: instance_(nullptr)
{
Load(lib);
}
Library::~Library()
{
Free();
}
bool Library::Load(String const& lib)
{
instance_ = ::LoadLibraryW(lib.c_str());
return IsValid();
}
bool Library::IsValid() const
{
return instance_ != nullptr;
}
void Library::Free()
{
if (instance_)
{
::FreeLibrary(instance_);
instance_ = nullptr;
}
}
FARPROC Library::GetProcess(String const& proc_name)
{
KGE_ASSERT(instance_ != nullptr);
return GetProcAddress(instance_, wide_to_string(proc_name).c_str());
}
}

54
src/kiwano/base/Library.h Normal file
View File

@ -0,0 +1,54 @@
// Copyright (c) 2016-2018 Kiwano - Nomango
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#pragma once
#include <kiwano/macros.h>
#include <kiwano/base/time.h>
#include <kiwano/base/Event.hpp>
namespace kiwano
{
// DLL ¿â
class KGE_API Library
{
public:
Library();
Library(String const& lib);
virtual ~Library();
bool Load(String const& lib);
bool IsValid() const;
void Free();
FARPROC GetProcess(String const& proc_name);
template <typename _Proc>
inline _Proc GetProcess(String const& proc_name)
{
return reinterpret_cast<_Proc>(GetProcess(proc_name));
}
private:
HMODULE instance_;
};
}

View File

@ -26,18 +26,14 @@ namespace kiwano
namespace modules namespace modules
{ {
Shlwapi::Shlwapi() Shlwapi::Shlwapi()
: shlwapi(nullptr) : shlwapi()
, PathFileExistsW(nullptr) , PathFileExistsW(nullptr)
, SHCreateMemStream(nullptr) , SHCreateMemStream(nullptr)
{ {
shlwapi = LoadLibraryW(L"shlwapi.dll"); if (shlwapi.Load(L"shlwapi.dll"))
if (shlwapi)
{ {
PathFileExistsW = (PFN_PathFileExistsW) PathFileExistsW = shlwapi.GetProcess<PFN_PathFileExistsW>(L"PathFileExistsW");
GetProcAddress(shlwapi, "PathFileExistsW"); SHCreateMemStream = shlwapi.GetProcess<PFN_SHCreateMemStream>(L"SHCreateMemStream");
SHCreateMemStream = (PFN_SHCreateMemStream)
GetProcAddress(shlwapi, "SHCreateMemStream");
} }
else else
{ {

View File

@ -20,10 +20,7 @@
#pragma once #pragma once
#include <kiwano/macros.h> #include <kiwano/macros.h>
#include <xaudio2.h> #include <kiwano/base/Library.h>
#include <mfapi.h>
#include <mfidl.h>
#include <mfreadwrite.h>
namespace kiwano namespace kiwano
{ {
@ -31,14 +28,6 @@ namespace kiwano
{ {
class KGE_API Shlwapi class KGE_API Shlwapi
{ {
Shlwapi();
HMODULE shlwapi;
// Shlwapi functions
typedef BOOL(WINAPI *PFN_PathFileExistsW)(LPCWSTR);
typedef IStream*(WINAPI *PFN_SHCreateMemStream)(const BYTE*, UINT);
public: public:
static inline Shlwapi& Get() static inline Shlwapi& Get()
{ {
@ -46,8 +35,20 @@ namespace kiwano
return instance; return instance;
} }
// Shlwapi functions
typedef BOOL(WINAPI* PFN_PathFileExistsW)(LPCWSTR);
typedef IStream* (WINAPI* PFN_SHCreateMemStream)(const BYTE*, UINT);
PFN_PathFileExistsW PathFileExistsW; PFN_PathFileExistsW PathFileExistsW;
PFN_SHCreateMemStream SHCreateMemStream; PFN_SHCreateMemStream SHCreateMemStream;
private:
Shlwapi();
Shlwapi(const Shlwapi&) = delete;
Shlwapi& operator=(const Shlwapi&) = delete;
Library shlwapi;
}; };
} }
} }