Add Library
This commit is contained in:
		
							parent
							
								
									4667333e7c
								
							
						
					
					
						commit
						48d85a1e97
					
				|  | @ -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" /> | ||||||
|  |  | ||||||
|  | @ -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> | ||||||
|  | @ -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 | ||||||
| 				{ | 				{ | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
| 			}; | 			}; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -49,97 +49,97 @@ 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; | ||||||
|  | @ -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 }); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -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_; | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -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()); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -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_) | ||||||
|  |  | ||||||
|  | @ -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()); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -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_; | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -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 | ||||||
| 			{ | 			{ | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
| 		}; | 		}; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue