[deploy] Merge pull request #49 from KiwanoEngine/dev

Change source charset to utf-8 & add exceptions
This commit is contained in:
Haibo 2020-02-10 18:38:30 +08:00 committed by GitHub
commit 64319fb996
157 changed files with 28692 additions and 5123 deletions

View File

@ -11,7 +11,7 @@ insert_final_newline = true
# Matches multiple files with brace expansion notation # Matches multiple files with brace expansion notation
# Set default charset # Set default charset
[*.{h,hpp,cpp}] [*.{h,hpp,cpp}]
charset = gb2312 charset = utf8
# 4 space indentation # 4 space indentation
indent_style = space indent_style = space

View File

@ -32,7 +32,7 @@ SHOW_NAMESPACES = YES
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
INPUT = src/ INPUT = src/
INPUT_ENCODING = gb2312 INPUT_ENCODING = UTF-8
FILE_PATTERNS = *.c \ FILE_PATTERNS = *.c \
*.cc \ *.cc \
*.cxx \ *.cxx \

View File

@ -74,6 +74,7 @@
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories>
<MinimalRebuild>false</MinimalRebuild> <MinimalRebuild>false</MinimalRebuild>
<AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
@ -92,6 +93,7 @@
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories>
<MinimalRebuild>false</MinimalRebuild> <MinimalRebuild>false</MinimalRebuild>
<AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>

View File

@ -73,6 +73,7 @@
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories>
<MinimalRebuild>false</MinimalRebuild> <MinimalRebuild>false</MinimalRebuild>
<AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
@ -91,6 +92,7 @@
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories>
<MinimalRebuild>false</MinimalRebuild> <MinimalRebuild>false</MinimalRebuild>
<AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>

View File

@ -69,6 +69,7 @@
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories>
<MinimalRebuild>false</MinimalRebuild> <MinimalRebuild>false</MinimalRebuild>
<AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
@ -87,6 +88,7 @@
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories>
<MinimalRebuild>false</MinimalRebuild> <MinimalRebuild>false</MinimalRebuild>
<AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>

View File

@ -79,6 +79,7 @@
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories>
<MinimalRebuild>false</MinimalRebuild> <MinimalRebuild>false</MinimalRebuild>
<AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
@ -97,6 +98,7 @@
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories>
<MinimalRebuild>false</MinimalRebuild> <MinimalRebuild>false</MinimalRebuild>
<AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>

View File

@ -19,6 +19,7 @@
<ClInclude Include="..\..\src\kiwano\core\event\KeyEvent.h" /> <ClInclude Include="..\..\src\kiwano\core\event\KeyEvent.h" />
<ClInclude Include="..\..\src\kiwano\core\event\MouseEvent.h" /> <ClInclude Include="..\..\src\kiwano\core\event\MouseEvent.h" />
<ClInclude Include="..\..\src\kiwano\core\event\WindowEvent.h" /> <ClInclude Include="..\..\src\kiwano\core\event\WindowEvent.h" />
<ClInclude Include="..\..\src\kiwano\core\Exception.h" />
<ClInclude Include="..\..\src\kiwano\core\Keys.h" /> <ClInclude Include="..\..\src\kiwano\core\Keys.h" />
<ClInclude Include="..\..\src\kiwano\core\Library.h" /> <ClInclude Include="..\..\src\kiwano\core\Library.h" />
<ClInclude Include="..\..\src\kiwano\core\Singleton.h" /> <ClInclude Include="..\..\src\kiwano\core\Singleton.h" />
@ -30,7 +31,7 @@
<ClInclude Include="..\..\src\kiwano\2d\DebugActor.h" /> <ClInclude Include="..\..\src\kiwano\2d\DebugActor.h" />
<ClInclude Include="..\..\src\kiwano\2d\FrameSequence.h" /> <ClInclude Include="..\..\src\kiwano\2d\FrameSequence.h" />
<ClInclude Include="..\..\src\kiwano\2d\ShapeActor.h" /> <ClInclude Include="..\..\src\kiwano\2d\ShapeActor.h" />
<ClInclude Include="..\..\src\kiwano\2d\Layer.h" /> <ClInclude Include="..\..\src\kiwano\2d\LayerActor.h" />
<ClInclude Include="..\..\src\kiwano\2d\Actor.h" /> <ClInclude Include="..\..\src\kiwano\2d\Actor.h" />
<ClInclude Include="..\..\src\kiwano\2d\Stage.h" /> <ClInclude Include="..\..\src\kiwano\2d\Stage.h" />
<ClInclude Include="..\..\src\kiwano\2d\Sprite.h" /> <ClInclude Include="..\..\src\kiwano\2d\Sprite.h" />
@ -62,6 +63,7 @@
<ClInclude Include="..\..\src\kiwano\platform\win32\ComPtr.hpp" /> <ClInclude Include="..\..\src\kiwano\platform\win32\ComPtr.hpp" />
<ClInclude Include="..\..\src\kiwano\platform\win32\helper.h" /> <ClInclude Include="..\..\src\kiwano\platform\win32\helper.h" />
<ClInclude Include="..\..\src\kiwano\platform\win32\libraries.h" /> <ClInclude Include="..\..\src\kiwano\platform\win32\libraries.h" />
<ClInclude Include="..\..\src\kiwano\platform\win32\WindowImpl.h" />
<ClInclude Include="..\..\src\kiwano\platform\Window.h" /> <ClInclude Include="..\..\src\kiwano\platform\Window.h" />
<ClInclude Include="..\..\src\kiwano\render\Brush.h" /> <ClInclude Include="..\..\src\kiwano\render\Brush.h" />
<ClInclude Include="..\..\src\kiwano\render\Color.h" /> <ClInclude Include="..\..\src\kiwano\render\Color.h" />
@ -71,12 +73,15 @@
<ClInclude Include="..\..\src\kiwano\render\DirectX\D3DDeviceResourcesBase.h" /> <ClInclude Include="..\..\src\kiwano\render\DirectX\D3DDeviceResourcesBase.h" />
<ClInclude Include="..\..\src\kiwano\render\DirectX\FontCollectionLoader.h" /> <ClInclude Include="..\..\src\kiwano\render\DirectX\FontCollectionLoader.h" />
<ClInclude Include="..\..\src\kiwano\render\DirectX\helper.h" /> <ClInclude Include="..\..\src\kiwano\render\DirectX\helper.h" />
<ClInclude Include="..\..\src\kiwano\render\DirectX\RenderContextImpl.h" />
<ClInclude Include="..\..\src\kiwano\render\DirectX\RendererImpl.h" />
<ClInclude Include="..\..\src\kiwano\render\DirectX\TextRenderer.h" /> <ClInclude Include="..\..\src\kiwano\render\DirectX\TextRenderer.h" />
<ClInclude Include="..\..\src\kiwano\render\DirectX\TextureRenderContextImpl.h" />
<ClInclude Include="..\..\src\kiwano\render\Font.h" /> <ClInclude Include="..\..\src\kiwano\render\Font.h" />
<ClInclude Include="..\..\src\kiwano\render\Shape.h" /> <ClInclude Include="..\..\src\kiwano\render\Shape.h" />
<ClInclude Include="..\..\src\kiwano\render\ShapeSink.h" /> <ClInclude Include="..\..\src\kiwano\render\ShapeSink.h" />
<ClInclude Include="..\..\src\kiwano\render\GifImage.h" /> <ClInclude Include="..\..\src\kiwano\render\GifImage.h" />
<ClInclude Include="..\..\src\kiwano\render\LayerArea.h" /> <ClInclude Include="..\..\src\kiwano\render\Layer.h" />
<ClInclude Include="..\..\src\kiwano\render\RenderContext.h" /> <ClInclude Include="..\..\src\kiwano\render\RenderContext.h" />
<ClInclude Include="..\..\src\kiwano\render\Renderer.h" /> <ClInclude Include="..\..\src\kiwano\render\Renderer.h" />
<ClInclude Include="..\..\src\kiwano\render\StrokeStyle.h" /> <ClInclude Include="..\..\src\kiwano\render\StrokeStyle.h" />
@ -84,6 +89,7 @@
<ClInclude Include="..\..\src\kiwano\render\TextStyle.hpp" /> <ClInclude Include="..\..\src\kiwano\render\TextStyle.hpp" />
<ClInclude Include="..\..\src\kiwano\render\Texture.h" /> <ClInclude Include="..\..\src\kiwano\render\Texture.h" />
<ClInclude Include="..\..\src\kiwano\render\TextureCache.h" /> <ClInclude Include="..\..\src\kiwano\render\TextureCache.h" />
<ClInclude Include="..\..\src\kiwano\render\TextureRenderContext.h" />
<ClInclude Include="..\..\src\kiwano\utils\LocalStorage.h" /> <ClInclude Include="..\..\src\kiwano\utils\LocalStorage.h" />
<ClInclude Include="..\..\src\kiwano\utils\ResourceCache.h" /> <ClInclude Include="..\..\src\kiwano\utils\ResourceCache.h" />
<ClInclude Include="..\..\src\kiwano\utils\UserData.h" /> <ClInclude Include="..\..\src\kiwano\utils\UserData.h" />
@ -103,7 +109,7 @@
<ClCompile Include="..\..\src\kiwano\2d\FrameSequence.cpp" /> <ClCompile Include="..\..\src\kiwano\2d\FrameSequence.cpp" />
<ClCompile Include="..\..\src\kiwano\2d\ShapeActor.cpp" /> <ClCompile Include="..\..\src\kiwano\2d\ShapeActor.cpp" />
<ClCompile Include="..\..\src\kiwano\2d\GifSprite.cpp" /> <ClCompile Include="..\..\src\kiwano\2d\GifSprite.cpp" />
<ClCompile Include="..\..\src\kiwano\2d\Layer.cpp" /> <ClCompile Include="..\..\src\kiwano\2d\LayerActor.cpp" />
<ClCompile Include="..\..\src\kiwano\2d\Actor.cpp" /> <ClCompile Include="..\..\src\kiwano\2d\Actor.cpp" />
<ClCompile Include="..\..\src\kiwano\2d\Stage.cpp" /> <ClCompile Include="..\..\src\kiwano\2d\Stage.cpp" />
<ClCompile Include="..\..\src\kiwano\2d\Sprite.cpp" /> <ClCompile Include="..\..\src\kiwano\2d\Sprite.cpp" />
@ -118,6 +124,7 @@
<ClCompile Include="..\..\src\kiwano\core\event\KeyEvent.cpp" /> <ClCompile Include="..\..\src\kiwano\core\event\KeyEvent.cpp" />
<ClCompile Include="..\..\src\kiwano\core\event\MouseEvent.cpp" /> <ClCompile Include="..\..\src\kiwano\core\event\MouseEvent.cpp" />
<ClCompile Include="..\..\src\kiwano\core\event\WindowEvent.cpp" /> <ClCompile Include="..\..\src\kiwano\core\event\WindowEvent.cpp" />
<ClCompile Include="..\..\src\kiwano\core\Exception.cpp" />
<ClCompile Include="..\..\src\kiwano\core\Library.cpp" /> <ClCompile Include="..\..\src\kiwano\core\Library.cpp" />
<ClCompile Include="..\..\src\kiwano\core\Logger.cpp" /> <ClCompile Include="..\..\src\kiwano\core\Logger.cpp" />
<ClCompile Include="..\..\src\kiwano\core\ObjectBase.cpp" /> <ClCompile Include="..\..\src\kiwano\core\ObjectBase.cpp" />
@ -139,18 +146,22 @@
<ClCompile Include="..\..\src\kiwano\render\DirectX\D3D10DeviceResources.cpp" /> <ClCompile Include="..\..\src\kiwano\render\DirectX\D3D10DeviceResources.cpp" />
<ClCompile Include="..\..\src\kiwano\render\DirectX\D3D11DeviceResources.cpp" /> <ClCompile Include="..\..\src\kiwano\render\DirectX\D3D11DeviceResources.cpp" />
<ClCompile Include="..\..\src\kiwano\render\DirectX\FontCollectionLoader.cpp" /> <ClCompile Include="..\..\src\kiwano\render\DirectX\FontCollectionLoader.cpp" />
<ClCompile Include="..\..\src\kiwano\render\DirectX\RenderContextImpl.cpp" />
<ClCompile Include="..\..\src\kiwano\render\DirectX\RendererImpl.cpp" />
<ClCompile Include="..\..\src\kiwano\render\DirectX\TextRenderer.cpp" /> <ClCompile Include="..\..\src\kiwano\render\DirectX\TextRenderer.cpp" />
<ClCompile Include="..\..\src\kiwano\render\DirectX\TextureRenderContextImpl.cpp" />
<ClCompile Include="..\..\src\kiwano\render\Font.cpp" /> <ClCompile Include="..\..\src\kiwano\render\Font.cpp" />
<ClCompile Include="..\..\src\kiwano\render\Shape.cpp" /> <ClCompile Include="..\..\src\kiwano\render\Shape.cpp" />
<ClCompile Include="..\..\src\kiwano\render\ShapeSink.cpp" /> <ClCompile Include="..\..\src\kiwano\render\ShapeSink.cpp" />
<ClCompile Include="..\..\src\kiwano\render\GifImage.cpp" /> <ClCompile Include="..\..\src\kiwano\render\GifImage.cpp" />
<ClCompile Include="..\..\src\kiwano\render\LayerArea.cpp" /> <ClCompile Include="..\..\src\kiwano\render\Layer.cpp" />
<ClCompile Include="..\..\src\kiwano\render\RenderContext.cpp" /> <ClCompile Include="..\..\src\kiwano\render\RenderContext.cpp" />
<ClCompile Include="..\..\src\kiwano\render\Renderer.cpp" /> <ClCompile Include="..\..\src\kiwano\render\Renderer.cpp" />
<ClCompile Include="..\..\src\kiwano\render\StrokeStyle.cpp" /> <ClCompile Include="..\..\src\kiwano\render\StrokeStyle.cpp" />
<ClCompile Include="..\..\src\kiwano\render\TextLayout.cpp" /> <ClCompile Include="..\..\src\kiwano\render\TextLayout.cpp" />
<ClCompile Include="..\..\src\kiwano\render\Texture.cpp" /> <ClCompile Include="..\..\src\kiwano\render\Texture.cpp" />
<ClCompile Include="..\..\src\kiwano\render\TextureCache.cpp" /> <ClCompile Include="..\..\src\kiwano\render\TextureCache.cpp" />
<ClCompile Include="..\..\src\kiwano\render\TextureRenderContext.cpp" />
<ClCompile Include="..\..\src\kiwano\utils\LocalStorage.cpp" /> <ClCompile Include="..\..\src\kiwano\utils\LocalStorage.cpp" />
<ClCompile Include="..\..\src\kiwano\utils\ResourceCache.cpp" /> <ClCompile Include="..\..\src\kiwano\utils\ResourceCache.cpp" />
<ClCompile Include="..\..\src\kiwano\utils\UserData.cpp" /> <ClCompile Include="..\..\src\kiwano\utils\UserData.cpp" />
@ -212,6 +223,7 @@
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<MinimalRebuild>false</MinimalRebuild> <MinimalRebuild>false</MinimalRebuild>
<AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories>
<AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
@ -230,6 +242,7 @@
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<MinimalRebuild>false</MinimalRebuild> <MinimalRebuild>false</MinimalRebuild>
<AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>../../src;</AdditionalIncludeDirectories>
<AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>

View File

@ -36,9 +36,6 @@
<ClInclude Include="..\..\src\kiwano\2d\Canvas.h"> <ClInclude Include="..\..\src\kiwano\2d\Canvas.h">
<Filter>2d</Filter> <Filter>2d</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\src\kiwano\2d\Layer.h">
<Filter>2d</Filter>
</ClInclude>
<ClInclude Include="..\..\src\kiwano\2d\Sprite.h"> <ClInclude Include="..\..\src\kiwano\2d\Sprite.h">
<Filter>2d</Filter> <Filter>2d</Filter>
</ClInclude> </ClInclude>
@ -216,9 +213,6 @@
<ClInclude Include="..\..\src\kiwano\render\GifImage.h"> <ClInclude Include="..\..\src\kiwano\render\GifImage.h">
<Filter>render</Filter> <Filter>render</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\src\kiwano\render\LayerArea.h">
<Filter>render</Filter>
</ClInclude>
<ClInclude Include="..\..\src\kiwano\render\RenderContext.h"> <ClInclude Include="..\..\src\kiwano\render\RenderContext.h">
<Filter>render</Filter> <Filter>render</Filter>
</ClInclude> </ClInclude>
@ -285,14 +279,35 @@
<ClInclude Include="..\..\src\kiwano\math\Scalar.h"> <ClInclude Include="..\..\src\kiwano\math\Scalar.h">
<Filter>math</Filter> <Filter>math</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\src\kiwano\render\TextureRenderContext.h">
<Filter>render</Filter>
</ClInclude>
<ClInclude Include="..\..\src\kiwano\render\DirectX\RenderContextImpl.h">
<Filter>render\DirectX</Filter>
</ClInclude>
<ClInclude Include="..\..\src\kiwano\render\DirectX\TextureRenderContextImpl.h">
<Filter>render\DirectX</Filter>
</ClInclude>
<ClInclude Include="..\..\src\kiwano\render\DirectX\RendererImpl.h">
<Filter>render\DirectX</Filter>
</ClInclude>
<ClInclude Include="..\..\src\kiwano\platform\win32\WindowImpl.h">
<Filter>platform\win32</Filter>
</ClInclude>
<ClInclude Include="..\..\src\kiwano\core\Exception.h">
<Filter>core</Filter>
</ClInclude>
<ClInclude Include="..\..\src\kiwano\2d\LayerActor.h">
<Filter>2d</Filter>
</ClInclude>
<ClInclude Include="..\..\src\kiwano\render\Layer.h">
<Filter>render</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\..\src\kiwano\2d\Canvas.cpp"> <ClCompile Include="..\..\src\kiwano\2d\Canvas.cpp">
<Filter>2d</Filter> <Filter>2d</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\src\kiwano\2d\Layer.cpp">
<Filter>2d</Filter>
</ClCompile>
<ClCompile Include="..\..\src\kiwano\2d\Sprite.cpp"> <ClCompile Include="..\..\src\kiwano\2d\Sprite.cpp">
<Filter>2d</Filter> <Filter>2d</Filter>
</ClCompile> </ClCompile>
@ -440,9 +455,6 @@
<ClCompile Include="..\..\src\kiwano\render\GifImage.cpp"> <ClCompile Include="..\..\src\kiwano\render\GifImage.cpp">
<Filter>render</Filter> <Filter>render</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\src\kiwano\render\LayerArea.cpp">
<Filter>render</Filter>
</ClCompile>
<ClCompile Include="..\..\src\kiwano\render\RenderContext.cpp"> <ClCompile Include="..\..\src\kiwano\render\RenderContext.cpp">
<Filter>render</Filter> <Filter>render</Filter>
</ClCompile> </ClCompile>
@ -482,5 +494,26 @@
<ClCompile Include="..\..\src\kiwano\render\ShapeSink.cpp"> <ClCompile Include="..\..\src\kiwano\render\ShapeSink.cpp">
<Filter>render</Filter> <Filter>render</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\src\kiwano\render\TextureRenderContext.cpp">
<Filter>render</Filter>
</ClCompile>
<ClCompile Include="..\..\src\kiwano\render\DirectX\RenderContextImpl.cpp">
<Filter>render\DirectX</Filter>
</ClCompile>
<ClCompile Include="..\..\src\kiwano\render\DirectX\TextureRenderContextImpl.cpp">
<Filter>render\DirectX</Filter>
</ClCompile>
<ClCompile Include="..\..\src\kiwano\render\DirectX\RendererImpl.cpp">
<Filter>render\DirectX</Filter>
</ClCompile>
<ClCompile Include="..\..\src\kiwano\core\Exception.cpp">
<Filter>core</Filter>
</ClCompile>
<ClCompile Include="..\..\src\kiwano\2d\LayerActor.cpp">
<Filter>2d</Filter>
</ClCompile>
<ClCompile Include="..\..\src\kiwano\render\Layer.cpp">
<Filter>render</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -93,11 +93,11 @@ struct json_lexer
break; break;
case 't': case 't':
return scan_literal(L"true", token_type::LITERAL_TRUE); return scan_literal("true", token_type::LITERAL_TRUE);
case 'f': case 'f':
return scan_literal(L"false", token_type::LITERAL_FALSE); return scan_literal("false", token_type::LITERAL_FALSE);
case 'n': case 'n':
return scan_literal(L"null", token_type::LITERAL_NULL); return scan_literal("null", token_type::LITERAL_NULL);
case '\"': case '\"':
return scan_string(); return scan_string();

View File

@ -18,6 +18,7 @@ class vector
public: public:
using value_type = _Ty; using value_type = _Ty;
using size_type = size_t; using size_type = size_t;
using difference_type = ptrdiff_t;
using reference = value_type&; using reference = value_type&;
using const_reference = const value_type&; using const_reference = const value_type&;
using iterator = value_type*; using iterator = value_type*;
@ -70,6 +71,7 @@ public:
inline bool empty() const { return size_ == 0; } inline bool empty() const { return size_ == 0; }
inline size_type size() const { return size_; } inline size_type size() const { return size_; }
inline size_type size_in_bytes() const { return size_ * ((size_type)sizeof(_Ty)); } inline size_type size_in_bytes() const { return size_ * ((size_type)sizeof(_Ty)); }
inline size_type max_size() const { return std::numeric_limits<difference_type>::max(); }
inline size_type capacity() const { return capacity_; } inline size_type capacity() const { return capacity_; }
inline reference operator[](size_type off) { if (off < 0 || off >= size_) throw std::out_of_range("vector subscript out of range"); return data_[off]; } inline reference operator[](size_type off) { if (off < 0 || off >= size_) throw std::out_of_range("vector subscript out of range"); return data_[off]; }
inline const_reference operator[](size_type off) const { if (off < 0 || off >= size_) throw std::out_of_range("vector subscript out of range"); return data_[off]; } inline const_reference operator[](size_type off) const { if (off < 0 || off >= size_) throw std::out_of_range("vector subscript out of range"); return data_[off]; }

22875
src/3rd-party/nlohmann/json.hpp vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -15,7 +15,7 @@
#define HEADER_PUGICONFIG_HPP #define HEADER_PUGICONFIG_HPP
// Uncomment this to enable wchar_t mode // Uncomment this to enable wchar_t mode
#define PUGIXML_WCHAR_MODE // #define PUGIXML_WCHAR_MODE
// Uncomment this to enable compact mode // Uncomment this to enable compact mode
// #define PUGIXML_COMPACT // #define PUGIXML_COMPACT

View File

@ -37,7 +37,7 @@ AudioEngine::~AudioEngine() {}
void AudioEngine::SetupComponent() void AudioEngine::SetupComponent()
{ {
KGE_SYS_LOG(L"Creating audio resources"); KGE_SYS_LOG("Creating audio resources");
HRESULT hr = dlls::MediaFoundation::Get().MFStartup(MF_VERSION, MFSTARTUP_FULL); HRESULT hr = dlls::MediaFoundation::Get().MFStartup(MF_VERSION, MFSTARTUP_FULL);
@ -51,12 +51,12 @@ void AudioEngine::SetupComponent()
hr = x_audio2_->CreateMasteringVoice(&mastering_voice_); hr = x_audio2_->CreateMasteringVoice(&mastering_voice_);
} }
win32::ThrowIfFailed(hr); win32::ThrowIfFailed(hr, "Create audio resources failed");
} }
void AudioEngine::DestroyComponent() void AudioEngine::DestroyComponent()
{ {
KGE_SYS_LOG(L"Destroying audio resources"); KGE_SYS_LOG("Destroying audio resources");
if (mastering_voice_) if (mastering_voice_)
{ {
@ -100,7 +100,7 @@ bool AudioEngine::CreateSound(Sound& sound, const Transcoder::Buffer& buffer)
} }
} }
win32::WarnIfFailed(hr); win32::WarnIfFailed(hr, "Create sound failed");
return SUCCEEDED(hr); return SUCCEEDED(hr);
} }

View File

@ -32,7 +32,7 @@ namespace audio
/** /**
* \~chinese * \~chinese
* \defgroup Audio * \defgroup Audio
*/ */
/** /**
@ -42,7 +42,7 @@ namespace audio
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API AudioEngine class KGE_API AudioEngine
: public Singleton<AudioEngine> : public Singleton<AudioEngine>
@ -52,15 +52,15 @@ class KGE_API AudioEngine
public: public:
/// \~chinese /// \~chinese
/// @brief 开启音频设备 /// @brief 开启音频设备
void Open(); void Open();
/// \~chinese /// \~chinese
/// @brief 关闭音频设备 /// @brief 关闭音频设备
void Close(); void Close();
/// \~chinese /// \~chinese
/// @brief 从解码器数据缓冲中创建音频对象 /// @brief 从解码器数据缓冲中创建音频对象
bool CreateSound(Sound& sound, const Transcoder::Buffer& buffer); bool CreateSound(Sound& sound, const Transcoder::Buffer& buffer);
public: public:

View File

@ -63,9 +63,9 @@ Sound::~Sound()
bool Sound::Load(String const& file_path) bool Sound::Load(String const& file_path)
{ {
if (!FileSystem::Instance().IsFileExists(file_path)) if (!FileSystem::GetInstance().IsFileExists(file_path))
{ {
KGE_WARN(L"Media file '%s' not found", file_path.c_str()); KGE_WARN("Media file '%s' not found", file_path.c_str());
return false; return false;
} }
@ -74,16 +74,16 @@ bool Sound::Load(String const& file_path)
Close(); Close();
} }
String full_path = FileSystem::Instance().GetFullPathForFile(file_path); String full_path = FileSystem::GetInstance().GetFullPathForFile(file_path);
HRESULT hr = transcoder_.LoadMediaFile(full_path); HRESULT hr = transcoder_.LoadMediaFile(full_path);
if (FAILED(hr)) if (FAILED(hr))
{ {
KGE_ERROR(L"Load media file failed with HRESULT of %08X", hr); KGE_ERROR("Load media file failed with HRESULT of %08X", hr);
return false; return false;
} }
if (!AudioEngine::Instance().CreateSound(*this, transcoder_.GetBuffer())) if (!AudioEngine::GetInstance().CreateSound(*this, transcoder_.GetBuffer()))
{ {
Close(); Close();
return false; return false;
@ -103,11 +103,11 @@ bool Sound::Load(Resource const& res)
HRESULT hr = transcoder_.LoadMediaResource(res); HRESULT hr = transcoder_.LoadMediaResource(res);
if (FAILED(hr)) if (FAILED(hr))
{ {
KGE_ERROR(L"Load media resource failed with HRESULT of %08X", hr); KGE_ERROR("Load media resource failed with HRESULT of %08X", hr);
return false; return false;
} }
if (!AudioEngine::Instance().CreateSound(*this, transcoder_.GetBuffer())) if (!AudioEngine::GetInstance().CreateSound(*this, transcoder_.GetBuffer()))
{ {
Close(); Close();
return false; return false;
@ -126,7 +126,7 @@ void Sound::Play(int loop_count)
{ {
if (!opened_) if (!opened_)
{ {
KGE_ERROR(L"Sound must be opened first!"); KGE_ERROR("Sound must be opened first!");
return; return;
} }
@ -157,7 +157,7 @@ void Sound::Play(int loop_count)
if (FAILED(hr)) if (FAILED(hr))
{ {
KGE_ERROR(L"Submitting source buffer failed with HRESULT of %08X", hr); KGE_ERROR("Submitting source buffer failed with HRESULT of %08X", hr);
} }
playing_ = SUCCEEDED(hr); playing_ = SUCCEEDED(hr);

View File

@ -40,7 +40,7 @@ KGE_DECLARE_SMART_PTR(Sound);
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API Sound : public virtual ObjectBase class KGE_API Sound : public virtual ObjectBase
{ {
@ -48,13 +48,13 @@ class KGE_API Sound : public virtual ObjectBase
public: public:
/// \~chinese /// \~chinese
/// @brief 创建音频对象 /// @brief 创建音频对象
/// @param res 本地音频文件路径 /// @param res 本地音频文件路径
static SoundPtr Create(String const& file_path); static SoundPtr Create(String const& file_path);
/// \~chinese /// \~chinese
/// @brief 创建音频对象 /// @brief 创建音频对象
/// @param res 音频资源 /// @param res 音频资源
static SoundPtr Create(Resource const& res); static SoundPtr Create(Resource const& res);
Sound(); Sound();
@ -62,51 +62,51 @@ public:
virtual ~Sound(); virtual ~Sound();
/// \~chinese /// \~chinese
/// @brief 打开本地音频文件 /// @brief 打开本地音频文件
/// @param res 本地音频文件路径 /// @param res 本地音频文件路径
bool Load(String const& file_path); bool Load(String const& file_path);
/// \~chinese /// \~chinese
/// @brief 打开音频资源 /// @brief 打开音频资源
/// @param res 音频资源 /// @param res 音频资源
bool Load(Resource const& res); bool Load(Resource const& res);
/// \~chinese /// \~chinese
/// @brief 是否有效 /// @brief 是否有效
bool IsValid() const; bool IsValid() const;
/// \~chinese /// \~chinese
/// @brief 播放 /// @brief 播放
/// @param loop_count 播放循环次数,设置 -1 为循环播放 /// @param loop_count 播放循环次数,设置 -1 为循环播放
void Play(int loop_count = 0); void Play(int loop_count = 0);
/// \~chinese /// \~chinese
/// @brief 暂停 /// @brief 暂停
void Pause(); void Pause();
/// \~chinese /// \~chinese
/// @brief 继续 /// @brief 继续
void Resume(); void Resume();
/// \~chinese /// \~chinese
/// @brief 停止 /// @brief 停止
void Stop(); void Stop();
/// \~chinese /// \~chinese
/// @brief 关闭并销毁资源 /// @brief 关闭并销毁资源
void Close(); void Close();
/// \~chinese /// \~chinese
/// @brief 是否正在播放 /// @brief 是否正在播放
bool IsPlaying() const; bool IsPlaying() const;
/// \~chinese /// \~chinese
/// @brief 获取音量 /// @brief 获取音量
float GetVolume() const; float GetVolume() const;
/// \~chinese /// \~chinese
/// @brief 设置音量 /// @brief 设置音量
/// @param volume 音量大小1.0 为原始音量, 大于 1 为放大音量, 0 为最小音量 /// @param volume 音量大小1.0 为原始音量, 大于 1 为放大音量, 0 为最小音量
void SetVolume(float volume); void SetVolume(float volume);
private: private:

View File

@ -35,13 +35,13 @@ KGE_DECLARE_SMART_PTR(SoundPlayer);
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API SoundPlayer : public virtual ObjectBase class KGE_API SoundPlayer : public virtual ObjectBase
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 创建音频播放器 /// @brief 创建音频播放器
static SoundPlayerPtr Create(); static SoundPlayerPtr Create();
SoundPlayer(); SoundPlayer();
@ -49,66 +49,66 @@ public:
~SoundPlayer(); ~SoundPlayer();
/// \~chinese /// \~chinese
/// @brief 加载本地音频文件 /// @brief 加载本地音频文件
/// @param file_path 本地音频文件路径 /// @param file_path 本地音频文件路径
/// @return 音频标识符 /// @return 音频标识符
size_t Load(String const& file_path); size_t Load(String const& file_path);
/// \~chinese /// \~chinese
/// @brief 加载音频资源 /// @brief 加载音频资源
/// @param res 音频资源 /// @param res 音频资源
/// @return 音频标识符 /// @return 音频标识符
size_t Load(Resource const& res); size_t Load(Resource const& res);
/// \~chinese /// \~chinese
/// @brief 播放音频 /// @brief 播放音频
/// @param id 音频标识符 /// @param id 音频标识符
/// @param loop_count 播放循环次数,设置 -1 为循环播放 /// @param loop_count 播放循环次数,设置 -1 为循环播放
void Play(size_t id, int loop_count = 0); void Play(size_t id, int loop_count = 0);
/// \~chinese /// \~chinese
/// @brief 暂停音频 /// @brief 暂停音频
/// @param id 音频标识符 /// @param id 音频标识符
void Pause(size_t id); void Pause(size_t id);
/// \~chinese /// \~chinese
/// @brief 继续播放音频 /// @brief 继续播放音频
/// @param id 音频标识符 /// @param id 音频标识符
void Resume(size_t id); void Resume(size_t id);
/// \~chinese /// \~chinese
/// @brief 停止音频 /// @brief 停止音频
/// @param id 音频标识符 /// @param id 音频标识符
void Stop(size_t id); void Stop(size_t id);
/// \~chinese /// \~chinese
/// @brief 获取音频播放状态 /// @brief 获取音频播放状态
/// @param id 音频标识符 /// @param id 音频标识符
bool IsPlaying(size_t id); bool IsPlaying(size_t id);
/// \~chinese /// \~chinese
/// @brief 获取音量 /// @brief 获取音量
float GetVolume() const; float GetVolume() const;
/// \~chinese /// \~chinese
/// @brief 设置音量 /// @brief 设置音量
/// @param volume 音量大小1.0 为原始音量, 大于 1 为放大音量, 0 为最小音量 /// @param volume 音量大小1.0 为原始音量, 大于 1 为放大音量, 0 为最小音量
void SetVolume(float volume); void SetVolume(float volume);
/// \~chinese /// \~chinese
/// @brief 暂停所有音频 /// @brief 暂停所有音频
void PauseAll(); void PauseAll();
/// \~chinese /// \~chinese
/// @brief 继续播放所有音频 /// @brief 继续播放所有音频
void ResumeAll(); void ResumeAll();
/// \~chinese /// \~chinese
/// @brief 停止所有音频 /// @brief 停止所有音频
void StopAll(); void StopAll();
/// \~chinese /// \~chinese
/// @brief 清除缓存 /// @brief 清除缓存
void ClearCache(); void ClearCache();
private: private:

View File

@ -76,7 +76,7 @@ HRESULT Transcoder::LoadMediaFile(String const& file_path)
ComPtr<IMFSourceReader> reader; ComPtr<IMFSourceReader> reader;
hr = dlls::MediaFoundation::Get().MFCreateSourceReaderFromURL(file_path.c_str(), nullptr, &reader); hr = dlls::MediaFoundation::Get().MFCreateSourceReaderFromURL(MultiByteToWide(file_path).c_str(), nullptr, &reader);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
@ -105,7 +105,7 @@ HRESULT Transcoder::LoadMediaResource(Resource const& res)
if (stream == nullptr) if (stream == nullptr)
{ {
KGE_ERROR(L"SHCreateMemStream failed"); KGE_ERROR("SHCreateMemStream failed");
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
} }
@ -147,25 +147,25 @@ HRESULT Transcoder::ReadSource(IMFSourceReader* reader)
hr = partial_type->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_PCM); hr = partial_type->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_PCM);
} }
// 设置 source reader 的媒体类型,它将使用合适的解码器去解码这个音频 // 设置 source reader 的媒体类型,它将使用合适的解码器去解码这个音频
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
hr = reader->SetCurrentMediaType((DWORD)MF_SOURCE_READER_FIRST_AUDIO_STREAM, 0, partial_type.get()); hr = reader->SetCurrentMediaType((DWORD)MF_SOURCE_READER_FIRST_AUDIO_STREAM, 0, partial_type.get());
} }
// 从 IMFMediaType 中获取 WAVEFORMAT 结构 // 从 IMFMediaType 中获取 WAVEFORMAT 结构
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
hr = reader->GetCurrentMediaType((DWORD)MF_SOURCE_READER_FIRST_AUDIO_STREAM, &uncompressed_type); hr = reader->GetCurrentMediaType((DWORD)MF_SOURCE_READER_FIRST_AUDIO_STREAM, &uncompressed_type);
} }
// 指定音频流 // 指定音频流
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
hr = reader->SetStreamSelection((DWORD)MF_SOURCE_READER_FIRST_AUDIO_STREAM, true); hr = reader->SetStreamSelection((DWORD)MF_SOURCE_READER_FIRST_AUDIO_STREAM, true);
} }
// 获取 WAVEFORMAT 数据 // 获取 WAVEFORMAT 数据
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
uint32_t size = 0; uint32_t size = 0;
@ -173,7 +173,7 @@ HRESULT Transcoder::ReadSource(IMFSourceReader* reader)
uncompressed_type.get(), &wave_format_, &size, (DWORD)MFWaveFormatExConvertFlag_Normal); uncompressed_type.get(), &wave_format_, &size, (DWORD)MFWaveFormatExConvertFlag_Normal);
} }
// 估算音频流大小 // 估算音频流大小
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
PROPVARIANT prop; PROPVARIANT prop;
@ -186,7 +186,7 @@ HRESULT Transcoder::ReadSource(IMFSourceReader* reader)
PropVariantClear(&prop); PropVariantClear(&prop);
} }
// 读取音频数据 // 读取音频数据
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
DWORD flags = 0; DWORD flags = 0;
@ -198,7 +198,7 @@ HRESULT Transcoder::ReadSource(IMFSourceReader* reader)
if (data == nullptr) if (data == nullptr)
{ {
KGE_ERROR(L"Low memory"); KGE_ERROR("Low memory");
hr = E_OUTOFMEMORY; hr = E_OUTOFMEMORY;
} }
else else

View File

@ -37,7 +37,7 @@ class Sound;
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API Transcoder class KGE_API Transcoder
{ {
@ -46,13 +46,13 @@ class KGE_API Transcoder
public: public:
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
struct Buffer struct Buffer
{ {
BYTE* data; ///< 音频数据 BYTE* data; ///< 音频数据
uint32_t size; ///< 音频数据大小 uint32_t size; ///< 音频数据大小
const WAVEFORMATEX* format; ///< 音频数据格式 const WAVEFORMATEX* format; ///< 音频数据格式
}; };
Transcoder(); Transcoder();
@ -60,24 +60,24 @@ public:
~Transcoder(); ~Transcoder();
/// \~chinese /// \~chinese
/// @brief 获取数据缓冲 /// @brief 获取数据缓冲
Buffer GetBuffer() const; Buffer GetBuffer() const;
/// \~chinese /// \~chinese
/// @brief 清空数据缓冲 /// @brief 清空数据缓冲
void ClearBuffer(); void ClearBuffer();
private: private:
/// \~chinese /// \~chinese
/// @brief 解码本地音频文件 /// @brief 解码本地音频文件
HRESULT LoadMediaFile(String const& file_path); HRESULT LoadMediaFile(String const& file_path);
/// \~chinese /// \~chinese
/// @brief 解码音频资源 /// @brief 解码音频资源
HRESULT LoadMediaResource(Resource const& res); HRESULT LoadMediaResource(Resource const& res);
/// \~chinese /// \~chinese
/// @brief 读取音频源数据 /// @brief 读取音频源数据
HRESULT ReadSource(IMFSourceReader* reader); HRESULT ReadSource(IMFSourceReader* reader);
private: private:

View File

@ -51,7 +51,7 @@ XAudio2::XAudio2()
} }
else else
{ {
KGE_ERROR(L"Load xaudio2.dll failed"); KGE_ERROR("Load xaudio2.dll failed");
throw std::runtime_error("Load xaudio2.dll failed"); throw std::runtime_error("Load xaudio2.dll failed");
} }
} }
@ -79,7 +79,7 @@ MediaFoundation::MediaFoundation()
} }
else else
{ {
KGE_ERROR(L"Load Mfplat.dll failed"); KGE_ERROR("Load Mfplat.dll failed");
throw std::runtime_error("Load Mfplat.dll failed"); throw std::runtime_error("Load Mfplat.dll failed");
} }
@ -92,7 +92,7 @@ MediaFoundation::MediaFoundation()
} }
else else
{ {
KGE_ERROR(L"Load Mfreadwrite.dll failed"); KGE_ERROR("Load Mfreadwrite.dll failed");
throw std::runtime_error("Load Mfreadwrite.dll failed"); throw std::runtime_error("Load Mfreadwrite.dll failed");
} }
} }

View File

@ -19,7 +19,7 @@
// THE SOFTWARE. // THE SOFTWARE.
#pragma once #pragma once
#include <kiwano/2d/Layer.h> #include <kiwano/2d/LayerActor.h>
namespace kiwano namespace kiwano
{ {
@ -28,24 +28,24 @@ namespace imgui
KGE_DECLARE_SMART_PTR(ImGuiLayer); KGE_DECLARE_SMART_PTR(ImGuiLayer);
/// \~chinese /// \~chinese
/// @brief ImGui管道 /// @brief ImGui管道
using ImGuiPipeline = Function<void()>; using ImGuiPipeline = Function<void()>;
/** /**
* \~chinese * \~chinese
* @brief ImGui图层 * @brief ImGui图层
*/ */
class ImGuiLayer : public Layer class ImGuiLayer : public LayerActor
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 创建ImGui图层 /// @brief 创建ImGui图层
static ImGuiLayerPtr Create(); static ImGuiLayerPtr Create();
/// \~chinese /// \~chinese
/// @brief 创建ImGui图层 /// @brief 创建ImGui图层
/// @param name 元素名称 /// @param name 元素名称
/// @param item 管道 /// @param item 管道
static ImGuiLayerPtr Create(String const& name, ImGuiPipeline const& item); static ImGuiLayerPtr Create(String const& name, ImGuiPipeline const& item);
ImGuiLayer(); ImGuiLayer();
@ -53,19 +53,19 @@ public:
virtual ~ImGuiLayer(); virtual ~ImGuiLayer();
/// \~chinese /// \~chinese
/// @brief 添加 ImGui 元素 /// @brief 添加 ImGui 元素
/// @param name 元素名称 /// @param name 元素名称
/// @param item 管道 /// @param item 管道
void AddItem(String const& name, ImGuiPipeline const& item); void AddItem(String const& name, ImGuiPipeline const& item);
/// \~chinese /// \~chinese
/// @brief 移除 ImGui 元素 /// @brief 移除 ImGui 元素
/// @param name 元素名称 /// @param name 元素名称
void RemoveItem(String const& name); void RemoveItem(String const& name);
// 移除所有元素 // 移除所有元素
/// \~chinese /// \~chinese
/// @brief 移除所有元素 /// @brief 移除所有元素
void RemoveAllItems(); void RemoveAllItems();
public: public:

View File

@ -5,7 +5,7 @@
#include <kiwano/core/event/KeyEvent.h> #include <kiwano/core/event/KeyEvent.h>
#include <kiwano/core/event/MouseEvent.h> #include <kiwano/core/event/MouseEvent.h>
#include <kiwano/platform/Input.h> #include <kiwano/platform/Input.h>
#include <kiwano/platform/Window.h> #include <kiwano/platform/win32/WindowImpl.h>
#include <kiwano/render/Renderer.h> #include <kiwano/render/Renderer.h>
#include <kiwano-imgui/ImGuiModule.h> #include <kiwano-imgui/ImGuiModule.h>
#include <kiwano-imgui/imgui_impl.h> #include <kiwano-imgui/imgui_impl.h>
@ -15,7 +15,6 @@ namespace kiwano
namespace imgui namespace imgui
{ {
ImGuiModule::ImGuiModule() ImGuiModule::ImGuiModule()
: target_window_(nullptr)
{ {
} }
@ -31,13 +30,11 @@ void ImGuiModule::SetupComponent()
ImGui::StyleColorsDark(); ImGui::StyleColorsDark();
// Setup Platform/Renderer bindings // Setup Platform/Renderer bindings
target_window_ = Renderer::Instance().GetTargetWindow();
io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional) io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional)
io.BackendFlags |= io.BackendFlags |=
ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used) ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used)
io.BackendPlatformName = "imgui_impl_win32"; io.BackendPlatformName = "imgui_impl_win32";
io.ImeWindowHandle = target_window_; io.ImeWindowHandle = WindowImpl::GetInstance().GetHandle();
// Keyboard mapping. ImGui will use those indices to peek into the io.KeysDown[] array that we will update during // Keyboard mapping. ImGui will use those indices to peek into the io.KeysDown[] array that we will update during
// the application lifetime. // the application lifetime.
@ -58,7 +55,7 @@ void ImGuiModule::SetupComponent()
io.KeyMap[ImGuiKey_Y] = (int)KeyCode::Y; io.KeyMap[ImGuiKey_Y] = (int)KeyCode::Y;
io.KeyMap[ImGuiKey_Z] = (int)KeyCode::Z; io.KeyMap[ImGuiKey_Z] = (int)KeyCode::Z;
ImGui_Impl_Init(Renderer::Instance()); ImGui_Impl_Init();
} }
void ImGuiModule::DestroyComponent() void ImGuiModule::DestroyComponent()
@ -75,10 +72,10 @@ void ImGuiModule::OnUpdate(Duration dt)
io.DeltaTime = dt.Seconds(); io.DeltaTime = dt.Seconds();
// Read keyboard modifiers inputs // Read keyboard modifiers inputs
io.KeyCtrl = Input::Instance().IsDown(KeyCode::Ctrl); io.KeyCtrl = Input::GetInstance().IsDown(KeyCode::Ctrl);
io.KeyShift = Input::Instance().IsDown(KeyCode::Shift); io.KeyShift = Input::GetInstance().IsDown(KeyCode::Shift);
io.KeyAlt = Input::Instance().IsDown(KeyCode::Alt); io.KeyAlt = Input::GetInstance().IsDown(KeyCode::Alt);
io.KeySuper = Input::Instance().IsDown(KeyCode::Super); io.KeySuper = Input::GetInstance().IsDown(KeyCode::Super);
// io.KeysDown[], io.MousePos, io.MouseDown[], io.MouseWheel: filled by the HandleEvent function below. // io.KeysDown[], io.MousePos, io.MouseDown[], io.MouseWheel: filled by the HandleEvent function below.
// Update OS mouse position // Update OS mouse position
@ -96,7 +93,7 @@ void ImGuiModule::BeforeRender()
KGE_ASSERT(io.Fonts->IsBuilt() && "Font atlas not built!"); KGE_ASSERT(io.Fonts->IsBuilt() && "Font atlas not built!");
// Setup display size (every frame to accommodate for window resizing) // Setup display size (every frame to accommodate for window resizing)
Size display_size = Renderer::Instance().GetOutputSize(); Size display_size = Renderer::GetInstance().GetOutputSize();
io.DisplaySize = ImVec2(display_size.x, display_size.y); io.DisplaySize = ImVec2(display_size.x, display_size.y);
ImGui::NewFrame(); ImGui::NewFrame();
@ -177,11 +174,11 @@ void ImGuiModule::UpdateMousePos()
if (io.WantSetMousePos) if (io.WantSetMousePos)
{ {
POINT pos = { (int)io.MousePos.x, (int)io.MousePos.y }; POINT pos = { (int)io.MousePos.x, (int)io.MousePos.y };
::ClientToScreen(target_window_, &pos); ::ClientToScreen(WindowImpl::GetInstance().GetHandle(), &pos);
::SetCursorPos(pos.x, pos.y); ::SetCursorPos(pos.x, pos.y);
} }
Point pos = Input::Instance().GetMousePos(); Point pos = Input::GetInstance().GetMousePos();
io.MousePos = ImVec2(pos.x, pos.y); io.MousePos = ImVec2(pos.x, pos.y);
} }
@ -219,7 +216,7 @@ void ImGuiModule::UpdateMouseCursor()
break; break;
} }
Window::Instance().SetCursor(cursor); Window::GetInstance().SetCursor(cursor);
} }
} // namespace imgui } // namespace imgui

View File

@ -26,9 +26,10 @@ namespace kiwano
{ {
namespace imgui namespace imgui
{ {
/** /**
* \~chinese * \~chinese
* @brief ImGuiÄ£¿é * @brief ImGui模块
*/ */
class ImGuiModule class ImGuiModule
: public Singleton<ImGuiModule> : public Singleton<ImGuiModule>
@ -57,9 +58,7 @@ private:
void UpdateMousePos(); void UpdateMousePos();
void UpdateMouseCursor(); void UpdateMouseCursor();
private:
WindowHandle target_window_;
}; };
} // namespace imgui } // namespace imgui
} // namespace kiwano } // namespace kiwano

View File

@ -7,20 +7,25 @@
#if !defined(KGE_USE_DIRECTX10) #if !defined(KGE_USE_DIRECTX10)
#include <kiwano-imgui/imgui_impl_dx11.h> #include <kiwano-imgui/imgui_impl_dx11.h>
#include <kiwano/render/DirectX/RendererImpl.h>
inline bool ImGui_Impl_Init(::kiwano::Renderer& renderer) inline bool ImGui_Impl_Init()
{ {
::kiwano::RendererImpl& renderer = ::kiwano::RendererImpl::GetInstance();
return ImGui_ImplDX11_Init(renderer.GetD3DDeviceResources()->GetDevice(), return ImGui_ImplDX11_Init(renderer.GetD3DDeviceResources()->GetDevice(),
renderer.GetD3DDeviceResources()->GetDeviceContext()); renderer.GetD3DDeviceResources()->GetDeviceContext());
} }
inline void ImGui_Impl_Shutdown() inline void ImGui_Impl_Shutdown()
{ {
ImGui_ImplDX11_Shutdown(); ImGui_ImplDX11_Shutdown();
} }
inline void ImGui_Impl_NewFrame() inline void ImGui_Impl_NewFrame()
{ {
ImGui_ImplDX11_NewFrame(); ImGui_ImplDX11_NewFrame();
} }
inline void ImGui_Impl_RenderDrawData(ImDrawData* draw_data) inline void ImGui_Impl_RenderDrawData(ImDrawData* draw_data)
{ {
ImGui_ImplDX11_RenderDrawData(draw_data); ImGui_ImplDX11_RenderDrawData(draw_data);
@ -30,6 +35,7 @@ inline void ImGui_Impl_InvalidateDeviceObjects()
{ {
ImGui_ImplDX11_InvalidateDeviceObjects(); ImGui_ImplDX11_InvalidateDeviceObjects();
} }
inline bool ImGui_Impl_CreateDeviceObjects() inline bool ImGui_Impl_CreateDeviceObjects()
{ {
return ImGui_ImplDX11_CreateDeviceObjects(); return ImGui_ImplDX11_CreateDeviceObjects();
@ -39,18 +45,22 @@ inline bool ImGui_Impl_CreateDeviceObjects()
#include <kiwano-imgui/imgui_impl_dx10.h> #include <kiwano-imgui/imgui_impl_dx10.h>
inline bool ImGui_Impl_Init(::kiwano::Renderer& renderer) inline bool ImGui_Impl_Init()
{ {
::kiwano::RendererImpl& renderer = ::kiwano::RendererImpl::GetInstance();
return ImGui_ImplDX10_Init(renderer.GetD3DDeviceResources()->GetDevice()); return ImGui_ImplDX10_Init(renderer.GetD3DDeviceResources()->GetDevice());
} }
inline void ImGui_Impl_Shutdown() inline void ImGui_Impl_Shutdown()
{ {
ImGui_ImplDX10_Shutdown(); ImGui_ImplDX10_Shutdown();
} }
inline void ImGui_Impl_NewFrame() inline void ImGui_Impl_NewFrame()
{ {
ImGui_ImplDX10_NewFrame(); ImGui_ImplDX10_NewFrame();
} }
inline void ImGui_Impl_RenderDrawData(ImDrawData* draw_data) inline void ImGui_Impl_RenderDrawData(ImDrawData* draw_data)
{ {
ImGui_ImplDX10_RenderDrawData(draw_data); ImGui_ImplDX10_RenderDrawData(draw_data);
@ -60,6 +70,7 @@ inline void ImGui_Impl_InvalidateDeviceObjects()
{ {
ImGui_ImplDX10_InvalidateDeviceObjects(); ImGui_ImplDX10_InvalidateDeviceObjects();
} }
inline bool ImGui_Impl_CreateDeviceObjects() inline bool ImGui_Impl_CreateDeviceObjects()
{ {
return ImGui_ImplDX10_CreateDeviceObjects(); return ImGui_ImplDX10_CreateDeviceObjects();

View File

@ -18,7 +18,6 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE. // THE SOFTWARE.
#include <codecvt>
#include <thread> #include <thread>
#include <kiwano/core/Logger.h> #include <kiwano/core/Logger.h>
#include <kiwano/platform/Application.h> #include <kiwano/platform/Application.h>
@ -34,7 +33,7 @@ using namespace kiwano::network;
uint32_t write_data(void* buffer, uint32_t size, uint32_t nmemb, void* userp) uint32_t write_data(void* buffer, uint32_t size, uint32_t nmemb, void* userp)
{ {
ByteString* recv_buffer = (ByteString*)userp; String* recv_buffer = (String*)userp;
uint32_t total = size * nmemb; uint32_t total = size * nmemb;
// add data to the end of recv_buffer // add data to the end of recv_buffer
@ -44,40 +43,6 @@ uint32_t write_data(void* buffer, uint32_t size, uint32_t nmemb, void* userp)
return total; return total;
} }
ByteString convert_to_utf8(String const& str)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>> utf8_conv;
ByteString result;
try
{
result = utf8_conv.to_bytes(str.c_str());
}
catch (std::range_error&)
{
// bad conversion
result = WideToMultiByte(str);
}
return result;
}
String convert_from_utf8(ByteString const& str)
{
oc::string_convert<std::codecvt_utf8<wchar_t>> utf8_conv;
String result;
try
{
result = utf8_conv.from_bytes(str);
}
catch (std::range_error&)
{
// bad conversion
result = MultiByteToWide(str);
}
return result;
}
class Curl class Curl
{ {
public: public:
@ -102,8 +67,8 @@ public:
} }
} }
bool Init(HttpClient* client, Vector<ByteString> const& headers, ByteString const& url, ByteString* response_data, bool Init(HttpClient* client, Vector<String> const& headers, String const& url, String* response_data,
ByteString* response_header, char* error_buffer) String* response_header, char* error_buffer)
{ {
if (!SetOption(CURLOPT_ERRORBUFFER, error_buffer)) if (!SetOption(CURLOPT_ERRORBUFFER, error_buffer))
return false; return false;
@ -112,7 +77,7 @@ public:
if (!SetOption(CURLOPT_CONNECTTIMEOUT, client->GetTimeoutForConnect())) if (!SetOption(CURLOPT_CONNECTTIMEOUT, client->GetTimeoutForConnect()))
return false; return false;
const auto ssl_ca_file = wide_to_string(client->GetSSLVerification()); const String& ssl_ca_file = client->GetSSLVerification();
if (ssl_ca_file.empty()) if (ssl_ca_file.empty())
{ {
if (!SetOption(CURLOPT_SSL_VERIFYPEER, 0L)) if (!SetOption(CURLOPT_SSL_VERIFYPEER, 0L))
@ -167,8 +132,8 @@ public:
} }
public: public:
static inline bool GetRequest(HttpClient* client, Vector<ByteString> const& headers, ByteString const& url, static inline bool GetRequest(HttpClient* client, Vector<String> const& headers, String const& url,
long* response_code, ByteString* response_data, ByteString* response_header, long* response_code, String* response_data, String* response_header,
char* error_buffer) char* error_buffer)
{ {
Curl curl; Curl curl;
@ -176,9 +141,9 @@ public:
&& curl.SetOption(CURLOPT_FOLLOWLOCATION, true) && curl.Perform(response_code); && curl.SetOption(CURLOPT_FOLLOWLOCATION, true) && curl.Perform(response_code);
} }
static inline bool PostRequest(HttpClient* client, Vector<ByteString> const& headers, ByteString const& url, static inline bool PostRequest(HttpClient* client, Vector<String> const& headers, String const& url,
ByteString const& request_data, long* response_code, ByteString* response_data, String const& request_data, long* response_code, String* response_data,
ByteString* response_header, char* error_buffer) String* response_header, char* error_buffer)
{ {
Curl curl; Curl curl;
return curl.Init(client, headers, url, response_data, response_header, error_buffer) return curl.Init(client, headers, url, response_data, response_header, error_buffer)
@ -186,9 +151,9 @@ public:
&& curl.SetOption(CURLOPT_POSTFIELDSIZE, request_data.size()) && curl.Perform(response_code); && curl.SetOption(CURLOPT_POSTFIELDSIZE, request_data.size()) && curl.Perform(response_code);
} }
static inline bool PutRequest(HttpClient* client, Vector<ByteString> const& headers, ByteString const& url, static inline bool PutRequest(HttpClient* client, Vector<String> const& headers, String const& url,
ByteString const& request_data, long* response_code, ByteString* response_data, String const& request_data, long* response_code, String* response_data,
ByteString* response_header, char* error_buffer) String* response_header, char* error_buffer)
{ {
Curl curl; Curl curl;
return curl.Init(client, headers, url, response_data, response_header, error_buffer) return curl.Init(client, headers, url, response_data, response_header, error_buffer)
@ -197,8 +162,8 @@ public:
&& curl.SetOption(CURLOPT_POSTFIELDSIZE, request_data.size()) && curl.Perform(response_code); && curl.SetOption(CURLOPT_POSTFIELDSIZE, request_data.size()) && curl.Perform(response_code);
} }
static inline bool DeleteRequest(HttpClient* client, Vector<ByteString> const& headers, ByteString const& url, static inline bool DeleteRequest(HttpClient* client, Vector<String> const& headers, String const& url,
long* response_code, ByteString* response_data, ByteString* response_header, long* response_code, String* response_data, String* response_header,
char* error_buffer) char* error_buffer)
{ {
Curl curl; Curl curl;
@ -279,17 +244,16 @@ void HttpClient::Perform(HttpRequestPtr request, HttpResponsePtr response)
bool ok = false; bool ok = false;
long response_code = 0; long response_code = 0;
char error_message[256] = { 0 }; char error_message[256] = { 0 };
ByteString response_header; String response_header;
ByteString response_data; String response_data;
String url = request->GetUrl();
String data = request->GetData();
ByteString url = convert_to_utf8(request->GetUrl()); Vector<String> headers;
ByteString data = convert_to_utf8(request->GetData());
Vector<ByteString> headers;
headers.reserve(request->GetHeaders().size()); headers.reserve(request->GetHeaders().size());
for (const auto& pair : request->GetHeaders()) for (const auto& pair : request->GetHeaders())
{ {
headers.push_back(wide_to_string(pair.first) + ":" + wide_to_string(pair.second)); headers.push_back(pair.first + ":" + pair.second);
} }
switch (request->GetType()) switch (request->GetType())
@ -309,17 +273,17 @@ void HttpClient::Perform(HttpRequestPtr request, HttpResponsePtr response)
ok = Curl::DeleteRequest(this, headers, url, &response_code, &response_data, &response_header, error_message); ok = Curl::DeleteRequest(this, headers, url, &response_code, &response_data, &response_header, error_message);
break; break;
default: default:
KGE_ERROR(L"HttpClient: unknown request type, only GET, POST, PUT or DELETE is supported"); KGE_ERROR("HttpClient: unknown request type, only GET, POST, PUT or DELETE is supported");
return; return;
} }
response->SetResponseCode(response_code); response->SetResponseCode(response_code);
response->SetHeader(MultiByteToWide(response_header)); response->SetHeader(response_header);
response->SetData(convert_from_utf8(response_data)); response->SetData(response_data);
if (!ok) if (!ok)
{ {
response->SetSucceed(false); response->SetSucceed(false);
response->SetError(MultiByteToWide(error_message)); response->SetError(error_message);
} }
else else
{ {

View File

@ -30,7 +30,7 @@ namespace network
{ {
/** /**
* \~chinese * \~chinese
* \defgroup Network * \defgroup Network
*/ */
/** /**
@ -40,7 +40,7 @@ namespace network
/** /**
* \~chinese * \~chinese
* @brief HTTP客户端 * @brief HTTP客户端
*/ */
class KGE_API HttpClient class KGE_API HttpClient
: public Singleton<HttpClient> : public Singleton<HttpClient>
@ -50,33 +50,33 @@ class KGE_API HttpClient
public: public:
/// \~chinese /// \~chinese
/// @brief 发送HTTP请求 /// @brief 发送HTTP请求
/// @param[in] request HTTP请求 /// @param[in] request HTTP请求
/// @details 发送请求后,无论结束或失败都将调用请求的响应回调函数 /// @details 发送请求后,无论结束或失败都将调用请求的响应回调函数
void Send(HttpRequestPtr request); void Send(HttpRequestPtr request);
/// \~chinese /// \~chinese
/// @brief 设置连接超时时长 /// @brief 设置连接超时时长
void SetTimeoutForConnect(Duration timeout); void SetTimeoutForConnect(Duration timeout);
/// \~chinese /// \~chinese
/// @brief 获取连接超时时长 /// @brief 获取连接超时时长
Duration GetTimeoutForConnect() const; Duration GetTimeoutForConnect() const;
/// \~chinese /// \~chinese
/// @brief 设置读取超时时长 /// @brief 设置读取超时时长
void SetTimeoutForRead(Duration timeout); void SetTimeoutForRead(Duration timeout);
/// \~chinese /// \~chinese
/// @brief 获取读取超时时长 /// @brief 获取读取超时时长
Duration GetTimeoutForRead() const; Duration GetTimeoutForRead() const;
/// \~chinese /// \~chinese
/// @brief 设置SSL证书地址 /// @brief 设置SSL证书地址
void SetSSLVerification(String const& root_certificate_path); void SetSSLVerification(String const& root_certificate_path);
/// \~chinese /// \~chinese
/// @brief 获取SSL证书地址 /// @brief 获取SSL证书地址
String const& GetSSLVerification() const; String const& GetSSLVerification() const;
public: public:

View File

@ -66,7 +66,7 @@ HttpRequestPtr HttpRequest::Create(String const& url, HttpType type, Json const&
void HttpRequest::SetJsonData(Json const& json) void HttpRequest::SetJsonData(Json const& json)
{ {
SetHeader(L"Content-Type", L"application/json;charset=UTF-8"); SetHeader("Content-Type", "application/json;charset=UTF-8");
data_ = json.dump(); data_ = json.dump();
} }

View File

@ -37,48 +37,48 @@ KGE_DECLARE_SMART_PTR(HttpRequest);
*/ */
/// \~chinese /// \~chinese
/// @brief HTTP请求类型 /// @brief HTTP请求类型
enum class HttpType enum class HttpType
{ {
Unknown, ///< 未知 Unknown, ///< 未知
Get, ///< HTTP GET请求 Get, ///< HTTP GET请求
Post, ///< HTTP POST请求 Post, ///< HTTP POST请求
Put, ///< HTTP PUT请求 Put, ///< HTTP PUT请求
Delete ///< HTTP DELETE请求 Delete ///< HTTP DELETE请求
}; };
/** /**
* \~chinese * \~chinese
* @brief HTTP请求 * @brief HTTP请求
*/ */
class KGE_API HttpRequest : public virtual ObjectBase class KGE_API HttpRequest : public virtual ObjectBase
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 响应回调函数 /// @brief 响应回调函数
using ResponseCallback = Function<void(HttpRequest* /* request */, HttpResponse* /* response */)>; using ResponseCallback = Function<void(HttpRequest* /* request */, HttpResponse* /* response */)>;
/// \~chinese /// \~chinese
/// @brief 创建HTTP请求 /// @brief 创建HTTP请求
/// @param url 请求地址 /// @param url 请求地址
/// @param type 请求类型 /// @param type 请求类型
/// @param callback 响应回调函数 /// @param callback 响应回调函数
static HttpRequestPtr Create(String const& url, HttpType type, ResponseCallback const& callback); static HttpRequestPtr Create(String const& url, HttpType type, ResponseCallback const& callback);
/// \~chinese /// \~chinese
/// @brief 创建HTTP请求 /// @brief 创建HTTP请求
/// @param url 请求地址 /// @param url 请求地址
/// @param type 请求类型 /// @param type 请求类型
/// @param data 请求数据 /// @param data 请求数据
/// @param callback 响应回调函数 /// @param callback 响应回调函数
static HttpRequestPtr Create(String const& url, HttpType type, String const& data, ResponseCallback const& callback); static HttpRequestPtr Create(String const& url, HttpType type, String const& data, ResponseCallback const& callback);
/// \~chinese /// \~chinese
/// @brief 创建HTTP请求 /// @brief 创建HTTP请求
/// @param url 请求地址 /// @param url 请求地址
/// @param type 请求类型 /// @param type 请求类型
/// @param json 请求的JSON数据 /// @param json 请求的JSON数据
/// @param callback 响应回调函数 /// @param callback 响应回调函数
static HttpRequestPtr Create(String const& url, HttpType type, Json const& json, ResponseCallback const& callback); static HttpRequestPtr Create(String const& url, HttpType type, Json const& json, ResponseCallback const& callback);
HttpRequest(); HttpRequest();
@ -86,55 +86,55 @@ public:
HttpRequest(HttpType type); HttpRequest(HttpType type);
/// \~chinese /// \~chinese
/// @brief 设置请求地址 /// @brief 设置请求地址
void SetUrl(String const& url); void SetUrl(String const& url);
/// \~chinese /// \~chinese
/// @brief 设置请求类型 /// @brief 设置请求类型
void SetType(HttpType type); void SetType(HttpType type);
/// \~chinese /// \~chinese
/// @brief 设置请求数据 /// @brief 设置请求数据
void SetData(String const& data); void SetData(String const& data);
/// \~chinese /// \~chinese
/// @brief 设置请求的JSON数据 /// @brief 设置请求的JSON数据
void SetJsonData(Json const& json); void SetJsonData(Json const& json);
/// \~chinese /// \~chinese
/// @brief 设置HTTP头 /// @brief 设置HTTP头
void SetHeaders(Map<String, String> const& headers); void SetHeaders(Map<String, String> const& headers);
/// \~chinese /// \~chinese
/// @brief 设置HTTP头 /// @brief 设置HTTP头
void SetHeader(String const& field, String const& content); void SetHeader(String const& field, String const& content);
/// \~chinese /// \~chinese
/// @brief 设置响应回调函数 /// @brief 设置响应回调函数
void SetResponseCallback(ResponseCallback const& callback); void SetResponseCallback(ResponseCallback const& callback);
/// \~chinese /// \~chinese
/// @brief 获取请求地址 /// @brief 获取请求地址
String const& GetUrl() const; String const& GetUrl() const;
/// \~chinese /// \~chinese
/// @brief 获取请求类型 /// @brief 获取请求类型
HttpType GetType() const; HttpType GetType() const;
/// \~chinese /// \~chinese
/// @brief 获取请求数据 /// @brief 获取请求数据
String const& GetData() const; String const& GetData() const;
/// \~chinese /// \~chinese
/// @brief 获取HTTP头 /// @brief 获取HTTP头
Map<String, String>& GetHeaders(); Map<String, String>& GetHeaders();
/// \~chinese /// \~chinese
/// @brief 获取HTTP头 /// @brief 获取HTTP头
String const& GetHeader(String const& header) const; String const& GetHeader(String const& header) const;
/// \~chinese /// \~chinese
/// @brief 获取响应回调函数 /// @brief 获取响应回调函数
ResponseCallback const& GetResponseCallback() const; ResponseCallback const& GetResponseCallback() const;
private: private:

View File

@ -34,7 +34,7 @@ KGE_DECLARE_SMART_PTR(HttpResponse);
/** /**
* \~chinese * \~chinese
* @brief HTTP响应 * @brief HTTP响应
*/ */
class KGE_API HttpResponse : public virtual ObjectBase class KGE_API HttpResponse : public virtual ObjectBase
{ {
@ -42,47 +42,47 @@ public:
HttpResponse(HttpRequestPtr request); HttpResponse(HttpRequestPtr request);
/// \~chinese /// \~chinese
/// @brief 获取对应的HTTP请求 /// @brief 获取对应的HTTP请求
HttpRequestPtr GetRequest() const; HttpRequestPtr GetRequest() const;
/// \~chinese /// \~chinese
/// @brief 获取响应状态 /// @brief 获取响应状态
bool IsSucceed() const; bool IsSucceed() const;
/// \~chinese /// \~chinese
/// @brief 获取HTTP状态码 /// @brief 获取HTTP状态码
long GetResponseCode() const; long GetResponseCode() const;
/// \~chinese /// \~chinese
/// @brief 获取响应头 /// @brief 获取响应头
String GetHeader() const; String GetHeader() const;
/// \~chinese /// \~chinese
/// @brief 获取响应数据 /// @brief 获取响应数据
String const& GetData() const; String const& GetData() const;
/// \~chinese /// \~chinese
/// @brief 获取错误信息 /// @brief 获取错误信息
String const& GetError() const; String const& GetError() const;
/// \~chinese /// \~chinese
/// @brief 设置响应状态 /// @brief 设置响应状态
void SetSucceed(bool succeed); void SetSucceed(bool succeed);
/// \~chinese /// \~chinese
/// @brief 设置HTTP状态码 /// @brief 设置HTTP状态码
void SetResponseCode(long response_code); void SetResponseCode(long response_code);
/// \~chinese /// \~chinese
/// @brief 设置响应头 /// @brief 设置响应头
void SetHeader(String const& response_header); void SetHeader(String const& response_header);
/// \~chinese /// \~chinese
/// @brief 设置响应数据 /// @brief 设置响应数据
void SetData(String const& response_data); void SetData(String const& response_data);
/// \~chinese /// \~chinese
/// @brief 设置错误信息 /// @brief 设置错误信息
void SetError(String const& error_buffer); void SetError(String const& error_buffer);
private: private:

View File

@ -37,31 +37,31 @@ KGE_DECLARE_SMART_PTR(Body);
*/ */
/// \~chinese /// \~chinese
/// @brief 物体 /// @brief 物体
class KGE_API Body : public virtual ObjectBase class KGE_API Body : public virtual ObjectBase
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 物体类型 /// @brief 物体类型
enum class Type enum class Type
{ {
Static = 0, ///< 静态物体 Static = 0, ///< 静态物体
Kinematic, ///< 动力学物体 Kinematic, ///< 动力学物体
Dynamic, ///< 动态物体 Dynamic, ///< 动态物体
}; };
/// \~chinese /// \~chinese
/// @brief 初始化 /// @brief 初始化
/// @param[in] world 物理世界 /// @param[in] world 物理世界
/// @param[in] actor 绑定的角色 /// @param[in] actor 绑定的角色
/// @param[in] type 物体类型 /// @param[in] type 物体类型
static BodyPtr Create(World* world, ActorPtr actor, Type type); static BodyPtr Create(World* world, ActorPtr actor, Type type);
/// \~chinese /// \~chinese
/// @brief 初始化 /// @brief 初始化
/// @param[in] world 物理世界 /// @param[in] world 物理世界
/// @param[in] actor 绑定的角色 /// @param[in] actor 绑定的角色
/// @param[in] type 物体类型 /// @param[in] type 物体类型
static BodyPtr Create(World* world, Actor* actor, Type type); static BodyPtr Create(World* world, Actor* actor, Type type);
Body(); Body();
@ -69,250 +69,250 @@ public:
virtual ~Body(); virtual ~Body();
/// \~chinese /// \~chinese
/// @brief 初始化 /// @brief 初始化
/// @param[in] world 物理世界 /// @param[in] world 物理世界
/// @param[in] actor 绑定的角色 /// @param[in] actor 绑定的角色
bool InitBody(World* world, ActorPtr actor); bool InitBody(World* world, ActorPtr actor);
/// \~chinese /// \~chinese
/// @brief 初始化 /// @brief 初始化
/// @param[in] world 物理世界 /// @param[in] world 物理世界
/// @param[in] actor 绑定的角色 /// @param[in] actor 绑定的角色
bool InitBody(World* world, Actor* actor); bool InitBody(World* world, Actor* actor);
/// \~chinese /// \~chinese
/// @brief 添加夹具 /// @brief 添加夹具
void AddFixture(FixturePtr fixture); void AddFixture(FixturePtr fixture);
/// \~chinese /// \~chinese
/// @brief 添加圆形夹具 /// @brief 添加圆形夹具
/// @param radius 圆形半径 /// @param radius 圆形半径
/// @param density 物体密度 /// @param density 物体密度
/// @param /// @param
Fixture* AddCircleShape(float radius, float density, float friction = 0.2f, float restitution = 0.f, Fixture* AddCircleShape(float radius, float density, float friction = 0.2f, float restitution = 0.f,
bool is_sensor = false); bool is_sensor = false);
/// \~chinese /// \~chinese
/// @brief 添加矩形夹具 /// @brief 添加矩形夹具
/// @param size 矩形大小 /// @param size 矩形大小
/// @param density 物体密度 /// @param density 物体密度
Fixture* AddRectShape(Vec2 const& size, float density, float friction = 0.2f, float restitution = 0.f, Fixture* AddRectShape(Vec2 const& size, float density, float friction = 0.2f, float restitution = 0.f,
bool is_sensor = false); bool is_sensor = false);
/// \~chinese /// \~chinese
/// @brief 添加多边形夹具 /// @brief 添加多边形夹具
/// @param vertexs 多边形端点 /// @param vertexs 多边形端点
/// @param density 物体密度 /// @param density 物体密度
Fixture* AddPolygonShape(Vector<Point> const& vertexs, float density, float friction = 0.2f, Fixture* AddPolygonShape(Vector<Point> const& vertexs, float density, float friction = 0.2f,
float restitution = 0.f, bool is_sensor = false); float restitution = 0.f, bool is_sensor = false);
/// \~chinese /// \~chinese
/// @brief 添加线段形夹具 /// @brief 添加线段形夹具
/// @param p1 线段起点 /// @param p1 线段起点
/// @param p2 线段终点 /// @param p2 线段终点
/// @param density 物体密度 /// @param density 物体密度
Fixture* AddEdgeShape(Point const& p1, Point const& p2, float density, float friction = 0.2f, Fixture* AddEdgeShape(Point const& p1, Point const& p2, float density, float friction = 0.2f,
float restitution = 0.f, bool is_sensor = false); float restitution = 0.f, bool is_sensor = false);
/// \~chinese /// \~chinese
/// @brief 添加链条形夹具 /// @brief 添加链条形夹具
/// @param vertexs 链条端点 /// @param vertexs 链条端点
/// @param loop 是否闭合 /// @param loop 是否闭合
/// @param density 物体密度 /// @param density 物体密度
Fixture* AddChainShape(Vector<Point> const& vertexs, bool loop, float density, float friction = 0.2f, Fixture* AddChainShape(Vector<Point> const& vertexs, bool loop, float density, float friction = 0.2f,
float restitution = 0.f, bool is_sensor = false); float restitution = 0.f, bool is_sensor = false);
/// \~chinese /// \~chinese
/// @brief 移除夹具 /// @brief 移除夹具
void RemoveFixture(FixturePtr fixture); void RemoveFixture(FixturePtr fixture);
/// \~chinese /// \~chinese
/// @brief 获取夹具列表 /// @brief 获取夹具列表
FixtureList GetFixtureList() const; FixtureList GetFixtureList() const;
/// \~chinese /// \~chinese
/// @brief 获取接触边列表 /// @brief 获取接触边列表
ContactEdgeList GetContactList() const; ContactEdgeList GetContactList() const;
/// \~chinese /// \~chinese
/// @brief 获取类别码 /// @brief 获取类别码
uint16_t GetCategoryBits() const; uint16_t GetCategoryBits() const;
/// \~chinese /// \~chinese
/// @brief 设置类别码 /// @brief 设置类别码
void SetCategoryBits(uint16_t category_bits); void SetCategoryBits(uint16_t category_bits);
/// \~chinese /// \~chinese
/// @brief 获取碰撞掩码 /// @brief 获取碰撞掩码
uint16_t GetMaskBits() const; uint16_t GetMaskBits() const;
/// \~chinese /// \~chinese
/// @brief 设置碰撞掩码 /// @brief 设置碰撞掩码
void SetMaskBits(uint16_t mask_bits); void SetMaskBits(uint16_t mask_bits);
/// \~chinese /// \~chinese
/// @brief 获取组索引 /// @brief 获取组索引
int16_t GetGroupIndex() const; int16_t GetGroupIndex() const;
/// \~chinese /// \~chinese
/// @brief 设置组索引 /// @brief 设置组索引
void SetGroupIndex(int16_t index); void SetGroupIndex(int16_t index);
/// \~chinese /// \~chinese
/// @brief 获取旋转角度 /// @brief 获取旋转角度
float GetBodyRotation() const; float GetBodyRotation() const;
/// \~chinese /// \~chinese
/// @brief 设置旋转角度 /// @brief 设置旋转角度
void SetBodyRotation(float angle); void SetBodyRotation(float angle);
/// \~chinese /// \~chinese
/// @brief 获取物体位置 /// @brief 获取物体位置
Point GetBodyPosition() const; Point GetBodyPosition() const;
/// \~chinese /// \~chinese
/// @brief 设置物体位置 /// @brief 设置物体位置
void SetBodyPosition(Point const& pos); void SetBodyPosition(Point const& pos);
/// \~chinese /// \~chinese
/// @brief 位置和旋转变换 /// @brief 位置和旋转变换
void SetBodyTransform(Point const& pos, float angle); void SetBodyTransform(Point const& pos, float angle);
/// \~chinese /// \~chinese
/// @brief 获取质量 [kg] /// @brief 获取质量 [kg]
float GetMass() const; float GetMass() const;
/// \~chinese /// \~chinese
/// @brief 获取惯性 /// @brief 获取惯性
float GetInertia() const; float GetInertia() const;
/// \~chinese /// \~chinese
/// @brief 获取质量数据 /// @brief 获取质量数据
/// @param[out] mass 物体质量 [kg] /// @param[out] mass 物体质量 [kg]
/// @param[out] center 质心位置 /// @param[out] center 质心位置
/// @param[out] inertia 惯性 /// @param[out] inertia 惯性
void GetMassData(float* mass, Point* center, float* inertia) const; void GetMassData(float* mass, Point* center, float* inertia) const;
/// \~chinese /// \~chinese
/// @brief 设置质量数据 /// @brief 设置质量数据
/// @param mass 物体质量 [kg] /// @param mass 物体质量 [kg]
/// @param center 质心位置 /// @param center 质心位置
/// @param inertia 惯性 /// @param inertia 惯性
void SetMassData(float mass, Point const& center, float inertia); void SetMassData(float mass, Point const& center, float inertia);
/// \~chinese /// \~chinese
/// @brief 重置质量数据 /// @brief 重置质量数据
void ResetMassData(); void ResetMassData();
/// \~chinese /// \~chinese
/// @brief 获取世界坐标系上的点在物体上的位置 /// @brief 获取世界坐标系上的点在物体上的位置
Point GetLocalPoint(Point const& world) const; Point GetLocalPoint(Point const& world) const;
/// \~chinese /// \~chinese
/// @brief 获取物体上的点在世界坐标系的位置 /// @brief 获取物体上的点在世界坐标系的位置
Point GetWorldPoint(Point const& local) const; Point GetWorldPoint(Point const& local) const;
/// \~chinese /// \~chinese
/// @brief 获取物体质心相对于物体的位置 /// @brief 获取物体质心相对于物体的位置
Point GetLocalCenter() const; Point GetLocalCenter() const;
/// \~chinese /// \~chinese
/// @brief 获取物体质心位置 /// @brief 获取物体质心位置
Point GetWorldCenter() const; Point GetWorldCenter() const;
/// \~chinese /// \~chinese
/// @brief 获取物体类型 /// @brief 获取物体类型
Type GetType() const; Type GetType() const;
/// \~chinese /// \~chinese
/// @brief 设置物体类型 /// @brief 设置物体类型
void SetType(Type type); void SetType(Type type);
/// \~chinese /// \~chinese
/// @brief 获取物体受重力的比例 /// @brief 获取物体受重力的比例
float GetGravityScale() const; float GetGravityScale() const;
/// \~chinese /// \~chinese
/// @brief 设置物体受重力的比例 /// @brief 设置物体受重力的比例
void SetGravityScale(float scale); void SetGravityScale(float scale);
/// \~chinese /// \~chinese
/// @brief 施力 /// @brief 施力
/// @param force 力的大小和方向 /// @param force 力的大小和方向
/// @param point 施力点 /// @param point 施力点
/// @param wake 是否唤醒物体 /// @param wake 是否唤醒物体
void ApplyForce(Vec2 const& force, Point const& point, bool wake = true); void ApplyForce(Vec2 const& force, Point const& point, bool wake = true);
/// \~chinese /// \~chinese
/// @brief 给物体中心施力 /// @brief 给物体中心施力
/// @param force 力的大小和方向 /// @param force 力的大小和方向
/// @param wake 是否唤醒物体 /// @param wake 是否唤醒物体
void ApplyForceToCenter(Vec2 const& force, bool wake = true); void ApplyForceToCenter(Vec2 const& force, bool wake = true);
/// \~chinese /// \~chinese
/// @brief 施加扭矩 /// @brief 施加扭矩
/// @param torque 扭矩 /// @param torque 扭矩
/// @param wake 是否唤醒物体 /// @param wake 是否唤醒物体
void ApplyTorque(float torque, bool wake = false); void ApplyTorque(float torque, bool wake = false);
/// \~chinese /// \~chinese
/// @brief 旋转角度是否固定 /// @brief 旋转角度是否固定
bool IsIgnoreRotation() const; bool IsIgnoreRotation() const;
/// \~chinese /// \~chinese
/// @brief 设置是否固定旋转角度 /// @brief 设置是否固定旋转角度
void SetIgnoreRotation(bool flag); void SetIgnoreRotation(bool flag);
/// \~chinese /// \~chinese
/// @brief 是否是子弹物体 /// @brief 是否是子弹物体
bool IsBullet() const; bool IsBullet() const;
/// \~chinese /// \~chinese
/// @brief 设置物体是否是子弹物体 /// @brief 设置物体是否是子弹物体
void SetBullet(bool flag); void SetBullet(bool flag);
/// \~chinese /// \~chinese
/// @brief 是否处于唤醒状态 /// @brief 是否处于唤醒状态
bool IsAwake() const; bool IsAwake() const;
/// \~chinese /// \~chinese
/// @brief 设置唤醒状态 /// @brief 设置唤醒状态
void SetAwake(bool flag); void SetAwake(bool flag);
/// \~chinese /// \~chinese
/// @brief 是否启用休眠 /// @brief 是否启用休眠
bool IsSleepingAllowed() const; bool IsSleepingAllowed() const;
/// \~chinese /// \~chinese
/// @brief 设置是否允许休眠 /// @brief 设置是否允许休眠
void SetSleepingAllowed(bool flag); void SetSleepingAllowed(bool flag);
/// \~chinese /// \~chinese
/// @brief 是否启用 /// @brief 是否启用
bool IsActive() const; bool IsActive() const;
/// \~chinese /// \~chinese
/// @brief 设置启用状态 /// @brief 设置启用状态
void SetActive(bool flag); void SetActive(bool flag);
/// \~chinese /// \~chinese
/// @brief 获取物体所在物理世界 /// @brief 获取物体所在物理世界
World* GetWorld() const; World* GetWorld() const;
/// \~chinese /// \~chinese
/// @brief 获取物体绑定的角色 /// @brief 获取物体绑定的角色
Actor* GetActor() const; Actor* GetActor() const;
/// \~chinese /// \~chinese
/// @brief 设置物体绑定的角色 /// @brief 设置物体绑定的角色
void SetActor(Actor* actor); void SetActor(Actor* actor);
/// \~chinese /// \~chinese
/// @brief 将物体信息更新到角色 /// @brief 将物体信息更新到角色
void UpdateActor(); void UpdateActor();
/// \~chinese /// \~chinese
/// @brief 将角色信息更新到物体 /// @brief 将角色信息更新到物体
void UpdateFromActor(); void UpdateFromActor();
b2Body* GetB2Body() const; b2Body* GetB2Body() const;
@ -320,11 +320,11 @@ public:
private: private:
/// \~chinese /// \~chinese
/// @brief 销毁物体 /// @brief 销毁物体
void UpdateFixtureFilter(b2Fixture* fixture); void UpdateFixtureFilter(b2Fixture* fixture);
/// \~chinese /// \~chinese
/// @brief 销毁物体 /// @brief 销毁物体
void Destroy(); void Destroy();
private: private:

View File

@ -34,74 +34,74 @@ class Body;
*/ */
/// \~chinese /// \~chinese
/// @brief 物理接触 /// @brief 物理接触
class KGE_API Contact class KGE_API Contact
{ {
public: public:
Contact(); Contact();
/// \~chinese /// \~chinese
/// @brief 是否有效 /// @brief 是否有效
bool IsValid() const; bool IsValid() const;
/// \~chinese /// \~chinese
/// @brief 是否是接触 /// @brief 是否是接触
bool IsTouching() const; bool IsTouching() const;
/// \~chinese /// \~chinese
/// @brief 启用或禁用 (仅作用于一个时间步) /// @brief 启用或禁用 (仅作用于一个时间步)
void SetEnabled(bool flag); void SetEnabled(bool flag);
/// \~chinese /// \~chinese
/// @brief 是否启用 /// @brief 是否启用
bool IsEnabled() const; bool IsEnabled() const;
/// \~chinese /// \~chinese
/// @brief 获取物体A的夹具 /// @brief 获取物体A的夹具
Fixture* GetFixtureA() const; Fixture* GetFixtureA() const;
/// \~chinese /// \~chinese
/// @brief 获取物体B的夹具 /// @brief 获取物体B的夹具
Fixture* GetFixtureB() const; Fixture* GetFixtureB() const;
/// \~chinese /// \~chinese
/// @brief 获取物体A /// @brief 获取物体A
Body* GetBodyA() const; Body* GetBodyA() const;
/// \~chinese /// \~chinese
/// @brief 获取物体B /// @brief 获取物体B
Body* GetBodyB() const; Body* GetBodyB() const;
/// \~chinese /// \~chinese
/// @brief 设置摩擦力 /// @brief 设置摩擦力
void SetFriction(float friction); void SetFriction(float friction);
/// \~chinese /// \~chinese
/// @brief 获取摩擦力 /// @brief 获取摩擦力
float GetFriction() const; float GetFriction() const;
/// \~chinese /// \~chinese
/// @brief 重置摩擦力 /// @brief 重置摩擦力
void ResetFriction(); void ResetFriction();
/// \~chinese /// \~chinese
/// @brief 设置弹性恢复 /// @brief 设置弹性恢复
void SetRestitution(float restitution); void SetRestitution(float restitution);
/// \~chinese /// \~chinese
/// @brief 获取弹性恢复 /// @brief 获取弹性恢复
float GetRestitution() const; float GetRestitution() const;
/// \~chinese /// \~chinese
/// @brief 重置弹性恢复 /// @brief 重置弹性恢复
void ResetRestitution(); void ResetRestitution();
/// \~chinese /// \~chinese
/// @brief 设置切线速度 /// @brief 设置切线速度
void SetTangentSpeed(float speed); void SetTangentSpeed(float speed);
/// \~chinese /// \~chinese
/// @brief 获取切线速度 /// @brief 获取切线速度
float GetTangentSpeed() const; float GetTangentSpeed() const;
b2Contact* GetB2Contact() const; b2Contact* GetB2Contact() const;
@ -116,7 +116,7 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 物理接触列表 /// @brief 物理接触列表
class ContactList class ContactList
{ {
template <typename _Ty> template <typename _Ty>

View File

@ -31,7 +31,7 @@ namespace physics
*/ */
/// \~chinese /// \~chinese
/// @brief 接触边 /// @brief 接触边
class KGE_API ContactEdge class KGE_API ContactEdge
{ {
public: public:
@ -40,15 +40,15 @@ public:
ContactEdge(b2ContactEdge* edge); ContactEdge(b2ContactEdge* edge);
/// \~chinese /// \~chinese
/// @brief 是否有效 /// @brief 是否有效
bool IsValid() const; bool IsValid() const;
/// \~chinese /// \~chinese
/// @brief 获取接触物体 /// @brief 获取接触物体
Body* GetOtherBody() const; Body* GetOtherBody() const;
/// \~chinese /// \~chinese
/// @brief 获取接触 /// @brief 获取接触
Contact GetContact() const; Contact GetContact() const;
b2ContactEdge* GetB2ContactEdge() const; b2ContactEdge* GetB2ContactEdge() const;
@ -63,7 +63,7 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 物理接触边列表 /// @brief 物理接触边列表
class ContactEdgeList class ContactEdgeList
{ {
template <typename _Ty> template <typename _Ty>

View File

@ -35,11 +35,11 @@ KGE_DECLARE_SMART_PTR(ContactEndEvent);
*/ */
/// \~chinese /// \~chinese
/// @brief 物理接触开始事件 /// @brief 物理接触开始事件
class KGE_API ContactBeginEvent : public Event class KGE_API ContactBeginEvent : public Event
{ {
public: public:
Contact contact; ///< 产生的接触 Contact contact; ///< 产生的接触
ContactBeginEvent(); ContactBeginEvent();
@ -47,11 +47,11 @@ public:
}; };
/// \~chinese /// \~chinese
/// @brief 物理接触结束事件 /// @brief 物理接触结束事件
class KGE_API ContactEndEvent : public Event class KGE_API ContactEndEvent : public Event
{ {
public: public:
Contact contact; ///< 产生的接触 Contact contact; ///< 产生的接触
ContactEndEvent(); ContactEndEvent();

View File

@ -35,18 +35,18 @@ KGE_DECLARE_SMART_PTR(Fixture);
*/ */
/// \~chinese /// \~chinese
/// @brief 物理夹具 /// @brief 物理夹具
class Fixture : public virtual ObjectBase class Fixture : public virtual ObjectBase
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 夹具参数 /// @brief 夹具参数
struct Param struct Param
{ {
float density = 0.0f; ///< 密度 float density = 0.0f; ///< 密度
float friction = 0.2f; ///< 摩擦力 float friction = 0.2f; ///< 摩擦力
float restitution = 0.0f; ///< 弹性恢复 float restitution = 0.0f; ///< 弹性恢复
bool is_sensor = false; ///< 是否是接触传感器 bool is_sensor = false; ///< 是否是接触传感器
Param() {} Param() {}
@ -60,44 +60,44 @@ public:
}; };
/// \~chinese /// \~chinese
/// @brief 创建圆形夹具 /// @brief 创建圆形夹具
/// @param body 添加夹具的物体 /// @param body 添加夹具的物体
/// @param param 夹具参数 /// @param param 夹具参数
/// @param radius 圆形半径 /// @param radius 圆形半径
/// @param offset 偏移量 /// @param offset 偏移量
static FixturePtr CreateCircle(Body* body, Param const& param, float radius, Point const& offset = Point()); static FixturePtr CreateCircle(Body* body, Param const& param, float radius, Point const& offset = Point());
/// \~chinese /// \~chinese
/// @brief 创建矩形夹具 /// @brief 创建矩形夹具
/// @param body 添加夹具的物体 /// @param body 添加夹具的物体
/// @param param 夹具参数 /// @param param 夹具参数
/// @param size 矩形大小 /// @param size 矩形大小
/// @param offset 偏移量 /// @param offset 偏移量
/// @param rotation 旋转角度 /// @param rotation 旋转角度
static FixturePtr CreateRect(Body* body, Param const& param, Size const& size, Point const& offset = Point(), static FixturePtr CreateRect(Body* body, Param const& param, Size const& size, Point const& offset = Point(),
float rotation = 0.f); float rotation = 0.f);
/// \~chinese /// \~chinese
/// @brief 创建多边形夹具 /// @brief 创建多边形夹具
/// @param body 添加夹具的物体 /// @param body 添加夹具的物体
/// @param param 夹具参数 /// @param param 夹具参数
/// @param vertexs 多边形顶点 /// @param vertexs 多边形顶点
static FixturePtr CreatePolygon(Body* body, Param const& param, Vector<Point> const& vertexs); static FixturePtr CreatePolygon(Body* body, Param const& param, Vector<Point> const& vertexs);
/// \~chinese /// \~chinese
/// @brief 创建边夹具 /// @brief 创建边夹具
/// @param body 添加夹具的物体 /// @param body 添加夹具的物体
/// @param param 夹具参数 /// @param param 夹具参数
/// @param p1 边的起点 /// @param p1 边的起点
/// @param p2 边的终点 /// @param p2 边的终点
static FixturePtr CreateEdge(Body* body, Param const& param, Point const& p1, Point const& p2); static FixturePtr CreateEdge(Body* body, Param const& param, Point const& p1, Point const& p2);
/// \~chinese /// \~chinese
/// @brief 创建链条夹具 /// @brief 创建链条夹具
/// @param body 添加夹具的物体 /// @param body 添加夹具的物体
/// @param param 夹具参数 /// @param param 夹具参数
/// @param vertexs 链条顶点 /// @param vertexs 链条顶点
/// @param loop 是否连接链条的起点和终点 /// @param loop 是否连接链条的起点和终点
static FixturePtr CreateChain(Body* body, Param const& param, Vector<Point> const& vertexs, bool loop = false); static FixturePtr CreateChain(Body* body, Param const& param, Vector<Point> const& vertexs, bool loop = false);
Fixture(); Fixture();
@ -105,52 +105,52 @@ public:
virtual ~Fixture(); virtual ~Fixture();
/// \~chinese /// \~chinese
/// @brief 是否有效 /// @brief 是否有效
bool IsValid() const; bool IsValid() const;
/// \~chinese /// \~chinese
/// @brief 获取夹具所在的物体 /// @brief 获取夹具所在的物体
Body* GetBody() const; Body* GetBody() const;
/// \~chinese /// \~chinese
/// @brief 是否是接触传感器 /// @brief 是否是接触传感器
bool IsSensor() const; bool IsSensor() const;
/// \~chinese /// \~chinese
/// @brief 设置夹具是否是接触传感器 /// @brief 设置夹具是否是接触传感器
/// @details 接触传感器只会产生物理接触,而不会影响物体运动 /// @details 接触传感器只会产生物理接触,而不会影响物体运动
void SetSensor(bool sensor); void SetSensor(bool sensor);
/// \~chinese /// \~chinese
/// @brief 获取夹具的质量数据 /// @brief 获取夹具的质量数据
void GetMassData(float* mass, Point* center, float* inertia) const; void GetMassData(float* mass, Point* center, float* inertia) const;
/// \~chinese /// \~chinese
/// @brief 获取密度 /// @brief 获取密度
float GetDensity() const; float GetDensity() const;
/// \~chinese /// \~chinese
/// @brief 设置密度 /// @brief 设置密度
void SetDensity(float density); void SetDensity(float density);
/// \~chinese /// \~chinese
/// @brief 获取摩擦力 [N] /// @brief 获取摩擦力 [N]
float GetFriction() const; float GetFriction() const;
/// \~chinese /// \~chinese
/// @brief 设置摩擦力 [N] /// @brief 设置摩擦力 [N]
void SetFriction(float friction); void SetFriction(float friction);
/// \~chinese /// \~chinese
/// @brief 获取弹性恢复 /// @brief 获取弹性恢复
float GetRestitution() const; float GetRestitution() const;
/// \~chinese /// \~chinese
/// @brief 设置弹性恢复 /// @brief 设置弹性恢复
void SetRestitution(float restitution); void SetRestitution(float restitution);
/// \~chinese /// \~chinese
/// @brief 点测试 /// @brief 点测试
bool TestPoint(const Point& p) const; bool TestPoint(const Point& p) const;
b2Fixture* GetB2Fixture() const; b2Fixture* GetB2Fixture() const;
@ -165,7 +165,7 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 物理夹具列表 /// @brief 物理夹具列表
class FixtureList class FixtureList
{ {
template <typename _Ty> template <typename _Ty>

View File

@ -45,34 +45,34 @@ KGE_DECLARE_SMART_PTR(WheelJoint);
*/ */
/// \~chinese /// \~chinese
/// @brief 关节 /// @brief 关节
class KGE_API Joint : public virtual ObjectBase class KGE_API Joint : public virtual ObjectBase
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 关节类型 /// @brief 关节类型
enum class Type enum class Type
{ {
Unknown = 0, ///< 未知 Unknown = 0, ///< 未知
Revolute, ///< 旋转关节 Revolute, ///< 旋转关节
Prismatic, ///< 平移关节 Prismatic, ///< 平移关节
Distance, ///< 固定距离关节 Distance, ///< 固定距离关节
Pulley, ///< 滑轮关节 Pulley, ///< 滑轮关节
Mouse, ///< 鼠标关节 Mouse, ///< 鼠标关节
Gear, ///< 齿轮关节 Gear, ///< 齿轮关节
Wheel, ///< 轮关节 Wheel, ///< 轮关节
Weld, ///< 焊接关节 Weld, ///< 焊接关节
Friction, ///< 摩擦关节 Friction, ///< 摩擦关节
Rope, ///< 绳关节 Rope, ///< 绳关节
Motor ///< 马达关节 Motor ///< 马达关节
}; };
/// \~chinese /// \~chinese
/// @brief 关节基础参数 /// @brief 关节基础参数
struct ParamBase struct ParamBase
{ {
Body* body_a; ///< 关节连接的物体A Body* body_a; ///< 关节连接的物体A
Body* body_b; ///< 关节连接的物体B Body* body_b; ///< 关节连接的物体B
ParamBase(Body* body_a, Body* body_b) ParamBase(Body* body_a, Body* body_b)
: body_a(body_a) : body_a(body_a)
@ -92,23 +92,23 @@ public:
virtual ~Joint(); virtual ~Joint();
/// \~chinese /// \~chinese
/// @brief 初始化关节 /// @brief 初始化关节
bool InitJoint(World* world, b2JointDef* joint_def); bool InitJoint(World* world, b2JointDef* joint_def);
/// \~chinese /// \~chinese
/// @brief 获取关节连接的物体A /// @brief 获取关节连接的物体A
BodyPtr GetBodyA() const; BodyPtr GetBodyA() const;
/// \~chinese /// \~chinese
/// @brief 获取关节连接的物体B /// @brief 获取关节连接的物体B
BodyPtr GetBodyB() const; BodyPtr GetBodyB() const;
/// \~chinese /// \~chinese
/// @brief 获取物理世界 /// @brief 获取物理世界
World* GetWorld() const; World* GetWorld() const;
/// \~chinese /// \~chinese
/// @brief 销毁关节 /// @brief 销毁关节
void Destroy(); void Destroy();
b2Joint* GetB2Joint() const; b2Joint* GetB2Joint() const;
@ -121,18 +121,18 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 固定距离关节 /// @brief 固定距离关节
class KGE_API DistanceJoint : public Joint class KGE_API DistanceJoint : public Joint
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 固定距离关节参数 /// @brief 固定距离关节参数
struct Param : public Joint::ParamBase struct Param : public Joint::ParamBase
{ {
Point anchor_a; ///< 关节在物体A上的连接点 Point anchor_a; ///< 关节在物体A上的连接点
Point anchor_b; ///< 关节在物体B上的连接点 Point anchor_b; ///< 关节在物体B上的连接点
float frequency_hz; ///< 响应速度,数值越高关节响应的速度越快,看上去越坚固 float frequency_hz; ///< 响应速度,数值越高关节响应的速度越快,看上去越坚固
float damping_ratio; ///< 阻尼率,值越大关节运动阻尼越大 float damping_ratio; ///< 阻尼率,值越大关节运动阻尼越大
Param(Body* body_a, Body* body_b, Point const& anchor_a, Point const& anchor_b, float frequency_hz = 0.f, Param(Body* body_a, Body* body_b, Point const& anchor_a, Point const& anchor_b, float frequency_hz = 0.f,
float damping_ratio = 0.f) float damping_ratio = 0.f)
@ -152,39 +152,39 @@ public:
}; };
/// \~chinese /// \~chinese
/// @brief 创建固定距离关节 /// @brief 创建固定距离关节
/// @param world 物理世界 /// @param world 物理世界
/// @param param 关节参数 /// @param param 关节参数
static DistanceJointPtr Create(World* world, Param const& param); static DistanceJointPtr Create(World* world, Param const& param);
DistanceJoint(); DistanceJoint();
/// \~chinese /// \~chinese
/// @brief 初始化关节 /// @brief 初始化关节
bool InitJoint(World* world, Param const& param); bool InitJoint(World* world, Param const& param);
/// \~chinese /// \~chinese
/// @brief 设置关节长度 /// @brief 设置关节长度
void SetLength(float length); void SetLength(float length);
/// \~chinese /// \~chinese
/// @brief 获取关节长度 /// @brief 获取关节长度
float GetLength() const; float GetLength() const;
/// \~chinese /// \~chinese
/// @brief 设置弹簧响应速度 [赫兹] /// @brief 设置弹簧响应速度 [赫兹]
void SetFrequency(float hz); void SetFrequency(float hz);
/// \~chinese /// \~chinese
/// @brief 获取弹簧响应速度 [赫兹] /// @brief 获取弹簧响应速度 [赫兹]
float GetFrequency() const; float GetFrequency() const;
/// \~chinese /// \~chinese
/// @brief 设置阻尼率 /// @brief 设置阻尼率
void SetDampingRatio(float ratio); void SetDampingRatio(float ratio);
/// \~chinese /// \~chinese
/// @brief 获取阻尼率 /// @brief 获取阻尼率
float GetDampingRatio() const; float GetDampingRatio() const;
private: private:
@ -192,15 +192,15 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 摩擦关节 /// @brief 摩擦关节
class KGE_API FrictionJoint : public Joint class KGE_API FrictionJoint : public Joint
{ {
public: public:
struct Param : public Joint::ParamBase struct Param : public Joint::ParamBase
{ {
Point anchor; ///< 摩擦作用点 Point anchor; ///< 摩擦作用点
float max_force; ///< 最大摩擦力 float max_force; ///< 最大摩擦力
float max_torque; ///< 最大扭力 float max_torque; ///< 最大扭力
Param(Body* body_a, Body* body_b, Point const& anchor, float max_force = 0.f, float max_torque = 0.f) Param(Body* body_a, Body* body_b, Point const& anchor, float max_force = 0.f, float max_torque = 0.f)
: ParamBase(body_a, body_b) : ParamBase(body_a, body_b)
@ -217,31 +217,31 @@ public:
}; };
/// \~chinese /// \~chinese
/// @brief 创建摩擦关节 /// @brief 创建摩擦关节
/// @param world 物理世界 /// @param world 物理世界
/// @param param 关节参数 /// @param param 关节参数
static FrictionJointPtr Create(World* world, Param const& param); static FrictionJointPtr Create(World* world, Param const& param);
FrictionJoint(); FrictionJoint();
/// \~chinese /// \~chinese
/// @brief 初始化关节 /// @brief 初始化关节
bool InitJoint(World* world, Param const& param); bool InitJoint(World* world, Param const& param);
/// \~chinese /// \~chinese
/// @brief 设置最大摩擦力 /// @brief 设置最大摩擦力
void SetMaxForce(float force); void SetMaxForce(float force);
/// \~chinese /// \~chinese
/// @brief 获取最大摩擦力 /// @brief 获取最大摩擦力
float GetMaxForce() const; float GetMaxForce() const;
/// \~chinese /// \~chinese
/// @brief 设置最大转矩 /// @brief 设置最大转矩
void SetMaxTorque(float torque); void SetMaxTorque(float torque);
/// \~chinese /// \~chinese
/// @brief 获取最大转矩 /// @brief 获取最大转矩
float GetMaxTorque() const; float GetMaxTorque() const;
private: private:
@ -249,17 +249,17 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 齿轮关节 /// @brief 齿轮关节
class KGE_API GearJoint : public Joint class KGE_API GearJoint : public Joint
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 齿轮关节参数 /// @brief 齿轮关节参数
struct Param : public Joint::ParamBase struct Param : public Joint::ParamBase
{ {
Joint* joint_a; ///< 关节A旋转关节/平移关节) Joint* joint_a; ///< 关节A旋转关节/平移关节)
Joint* joint_b; ///< 关节B旋转关节/平移关节) Joint* joint_b; ///< 关节B旋转关节/平移关节)
float ratio; ///< 齿轮传动比 float ratio; ///< 齿轮传动比
Param(Joint* joint_a, Joint* joint_b, float ratio = 1.f) Param(Joint* joint_a, Joint* joint_b, float ratio = 1.f)
: ParamBase(nullptr, nullptr) : ParamBase(nullptr, nullptr)
@ -276,23 +276,23 @@ public:
}; };
/// \~chinese /// \~chinese
/// @brief 创建齿轮关节 /// @brief 创建齿轮关节
/// @param world 物理世界 /// @param world 物理世界
/// @param param 关节参数 /// @param param 关节参数
static GearJointPtr Create(World* world, Param const& param); static GearJointPtr Create(World* world, Param const& param);
GearJoint(); GearJoint();
/// \~chinese /// \~chinese
/// @brief 初始化关节 /// @brief 初始化关节
bool InitJoint(World* world, Param const& param); bool InitJoint(World* world, Param const& param);
/// \~chinese /// \~chinese
/// @brief 设定齿轮传动比 /// @brief 设定齿轮传动比
void SetRatio(float ratio); void SetRatio(float ratio);
/// \~chinese /// \~chinese
/// @brief 获取齿轮传动比 /// @brief 获取齿轮传动比
float GetRatio() const; float GetRatio() const;
private: private:
@ -300,17 +300,17 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 马达关节 /// @brief 马达关节
class KGE_API MotorJoint : public Joint class KGE_API MotorJoint : public Joint
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 马达关节参数 /// @brief 马达关节参数
struct Param : public Joint::ParamBase struct Param : public Joint::ParamBase
{ {
float max_force; ///< 最大摩擦力 float max_force; ///< 最大摩擦力
float max_torque; ///< 最大转矩 float max_torque; ///< 最大转矩
float correction_factor; ///< 位置矫正因子(范围 0-1 float correction_factor; ///< 位置矫正因子(范围 0-1
Param(Body* body_a, Body* body_b, float max_force = 1.f, float max_torque = 100.f, Param(Body* body_a, Body* body_b, float max_force = 1.f, float max_torque = 100.f,
float correction_factor = 0.3f) float correction_factor = 0.3f)
@ -329,31 +329,31 @@ public:
}; };
/// \~chinese /// \~chinese
/// @brief 创建马达关节 /// @brief 创建马达关节
/// @param world 物理世界 /// @param world 物理世界
/// @param param 关节参数 /// @param param 关节参数
static MotorJointPtr Create(World* world, Param const& param); static MotorJointPtr Create(World* world, Param const& param);
MotorJoint(); MotorJoint();
/// \~chinese /// \~chinese
/// @brief 初始化关节 /// @brief 初始化关节
bool InitJoint(World* world, Param const& param); bool InitJoint(World* world, Param const& param);
/// \~chinese /// \~chinese
/// @brief 设置最大摩擦力 /// @brief 设置最大摩擦力
void SetMaxForce(float force); void SetMaxForce(float force);
/// \~chinese /// \~chinese
/// @brief 获取最大摩擦力 /// @brief 获取最大摩擦力
float GetMaxForce() const; float GetMaxForce() const;
/// \~chinese /// \~chinese
/// @brief 设置最大转矩 /// @brief 设置最大转矩
void SetMaxTorque(float torque); void SetMaxTorque(float torque);
/// \~chinese /// \~chinese
/// @brief 获取最大转矩 /// @brief 获取最大转矩
float GetMaxTorque() const; float GetMaxTorque() const;
private: private:
@ -361,22 +361,22 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 平移关节 /// @brief 平移关节
class KGE_API PrismaticJoint : public Joint class KGE_API PrismaticJoint : public Joint
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 平移关节参数 /// @brief 平移关节参数
struct Param : public Joint::ParamBase struct Param : public Joint::ParamBase
{ {
Point anchor; ///< 关节位置 Point anchor; ///< 关节位置
Vec2 axis; ///< 物体A滑动的方向 Vec2 axis; ///< 物体A滑动的方向
bool enable_limit; ///< 是否启用限制 bool enable_limit; ///< 是否启用限制
float lower_translation; ///< 移动的最小限制,与方向同向为正,反向为负,启用限制后才有效果 float lower_translation; ///< 移动的最小限制,与方向同向为正,反向为负,启用限制后才有效果
float upper_translation; ///< 移动的最大限制,与方向同向为正,反向为负,启用限制后才有效果 float upper_translation; ///< 移动的最大限制,与方向同向为正,反向为负,启用限制后才有效果
bool enable_motor; ///< 是否启用马达 bool enable_motor; ///< 是否启用马达
float max_motor_force; ///< 最大马达力 [N] float max_motor_force; ///< 最大马达力 [N]
float motor_speed; ///< 马达转速 [degree/s] float motor_speed; ///< 马达转速 [degree/s]
Param(Body* body_a, Body* body_b, Point const& anchor, Vec2 const& axis, bool enable_limit = false, Param(Body* body_a, Body* body_b, Point const& anchor, Vec2 const& axis, bool enable_limit = false,
float lower_translation = 0.0f, float upper_translation = 0.0f, bool enable_motor = false, float lower_translation = 0.0f, float upper_translation = 0.0f, bool enable_motor = false,
@ -403,71 +403,71 @@ public:
}; };
/// \~chinese /// \~chinese
/// @brief 创建平移关节 /// @brief 创建平移关节
/// @param world 物理世界 /// @param world 物理世界
/// @param param 关节参数 /// @param param 关节参数
static PrismaticJointPtr Create(World* world, Param const& param); static PrismaticJointPtr Create(World* world, Param const& param);
PrismaticJoint(); PrismaticJoint();
/// \~chinese /// \~chinese
/// @brief 初始化关节 /// @brief 初始化关节
bool InitJoint(World* world, Param const& param); bool InitJoint(World* world, Param const& param);
/// \~chinese /// \~chinese
/// @brief 获取参考角 /// @brief 获取参考角
float GetReferenceAngle() const; float GetReferenceAngle() const;
/// \~chinese /// \~chinese
/// @brief 获取关节转换 /// @brief 获取关节转换
float GetJointTranslation() const; float GetJointTranslation() const;
/// \~chinese /// \~chinese
/// @brief 获取关节速度 /// @brief 获取关节速度
float GetJointSpeed() const; float GetJointSpeed() const;
/// \~chinese /// \~chinese
/// @brief 是否启用关节限制 /// @brief 是否启用关节限制
bool IsLimitEnabled() const; bool IsLimitEnabled() const;
/// \~chinese /// \~chinese
/// @brief 设置是否启用关节限制 /// @brief 设置是否启用关节限制
void EnableLimit(bool flag); void EnableLimit(bool flag);
/// \~chinese /// \~chinese
/// @brief 获取平移最小限制 /// @brief 获取平移最小限制
float GetLowerLimit() const; float GetLowerLimit() const;
/// \~chinese /// \~chinese
/// @brief 获取平移最大限制 /// @brief 获取平移最大限制
float GetUpperLimit() const; float GetUpperLimit() const;
/// \~chinese /// \~chinese
/// @brief 设置关节限制 /// @brief 设置关节限制
void SetLimits(float lower, float upper); void SetLimits(float lower, float upper);
/// \~chinese /// \~chinese
/// @brief 是否启用马达 /// @brief 是否启用马达
bool IsMotorEnabled() const; bool IsMotorEnabled() const;
/// \~chinese /// \~chinese
/// @brief 设置是否启用马达 /// @brief 设置是否启用马达
void EnableMotor(bool flag); void EnableMotor(bool flag);
/// \~chinese /// \~chinese
/// @brief 设置马达转速 [degree/s] /// @brief 设置马达转速 [degree/s]
void SetMotorSpeed(float speed); void SetMotorSpeed(float speed);
/// \~chinese /// \~chinese
/// @brief 获取马达转速 [degree/s] /// @brief 获取马达转速 [degree/s]
float GetMotorSpeed() const; float GetMotorSpeed() const;
/// \~chinese /// \~chinese
/// @brief 设置最大马达力 [N] /// @brief 设置最大马达力 [N]
void SetMaxMotorForce(float force); void SetMaxMotorForce(float force);
/// \~chinese /// \~chinese
/// @brief 获取最大马达力 [N] /// @brief 获取最大马达力 [N]
float GetMaxMotorForce() const; float GetMaxMotorForce() const;
private: private:
@ -475,19 +475,19 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 滑轮关节 /// @brief 滑轮关节
class KGE_API PulleyJoint : public Joint class KGE_API PulleyJoint : public Joint
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 滑轮关节参数 /// @brief 滑轮关节参数
struct Param : public Joint::ParamBase struct Param : public Joint::ParamBase
{ {
Point anchor_a; ///< 关节在物体A上的作用点 Point anchor_a; ///< 关节在物体A上的作用点
Point anchor_b; ///< 关节在物体B上的作用点 Point anchor_b; ///< 关节在物体B上的作用点
Point ground_anchor_a; ///< 物体A对应的滑轮的位置 Point ground_anchor_a; ///< 物体A对应的滑轮的位置
Point ground_anchor_b; ///< 物体B对应的滑轮的位置 Point ground_anchor_b; ///< 物体B对应的滑轮的位置
float ratio; ///< 滑轮比,关节传动时,滑轮上升和下降的两头的位移比例 float ratio; ///< 滑轮比,关节传动时,滑轮上升和下降的两头的位移比例
Param(Body* body_a, Body* body_b, Point const& anchor_a, Point const& anchor_b, Point const& ground_anchor_a, Param(Body* body_a, Body* body_b, Point const& anchor_a, Point const& anchor_b, Point const& ground_anchor_a,
Point const& ground_anchor_b, float ratio = 1.0f) Point const& ground_anchor_b, float ratio = 1.0f)
@ -508,43 +508,43 @@ public:
}; };
/// \~chinese /// \~chinese
/// @brief 创建滑轮关节 /// @brief 创建滑轮关节
/// @param world 物理世界 /// @param world 物理世界
/// @param param 关节参数 /// @param param 关节参数
static PulleyJointPtr Create(World* world, Param const& param); static PulleyJointPtr Create(World* world, Param const& param);
PulleyJoint(); PulleyJoint();
/// \~chinese /// \~chinese
/// @brief 初始化关节 /// @brief 初始化关节
bool InitJoint(World* world, Param const& param); bool InitJoint(World* world, Param const& param);
/// \~chinese /// \~chinese
/// @brief 物体A对应的滑轮的位置 /// @brief 物体A对应的滑轮的位置
Point GetGroundAnchorA() const; Point GetGroundAnchorA() const;
/// \~chinese /// \~chinese
/// @brief 物体B对应的滑轮的位置 /// @brief 物体B对应的滑轮的位置
Point GetGroundAnchorB() const; Point GetGroundAnchorB() const;
/// \~chinese /// \~chinese
/// @brief 获取滑轮传动比 /// @brief 获取滑轮传动比
float GetRatio() const; float GetRatio() const;
/// \~chinese /// \~chinese
/// @brief 获取物体A与滑轮的距离 /// @brief 获取物体A与滑轮的距离
float GetLengthA() const; float GetLengthA() const;
/// \~chinese /// \~chinese
/// @brief 获取物体B与滑轮的距离 /// @brief 获取物体B与滑轮的距离
float GetLengthB() const; float GetLengthB() const;
/// \~chinese /// \~chinese
/// @brief 获取物体A与滑轮的当前距离 /// @brief 获取物体A与滑轮的当前距离
float GetCurrentLengthA() const; float GetCurrentLengthA() const;
/// \~chinese /// \~chinese
/// @brief 获取物体B与滑轮的当前距离 /// @brief 获取物体B与滑轮的当前距离
float GetCurrentLengthB() const; float GetCurrentLengthB() const;
private: private:
@ -552,21 +552,21 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 旋转关节 /// @brief 旋转关节
class KGE_API RevoluteJoint : public Joint class KGE_API RevoluteJoint : public Joint
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 旋转关节参数 /// @brief 旋转关节参数
struct Param : public Joint::ParamBase struct Param : public Joint::ParamBase
{ {
Point anchor; ///< 关节位置 Point anchor; ///< 关节位置
bool enable_limit; ///< 是否启用限制 bool enable_limit; ///< 是否启用限制
float lower_angle; ///< 移动的最小限制,与方向同向为正,反向为负,启用限制后才有效果 float lower_angle; ///< 移动的最小限制,与方向同向为正,反向为负,启用限制后才有效果
float upper_angle; ///< 移动的最大限制,与方向同向为正,反向为负,启用限制后才有效果 float upper_angle; ///< 移动的最大限制,与方向同向为正,反向为负,启用限制后才有效果
bool enable_motor; ///< 是否启用马达 bool enable_motor; ///< 是否启用马达
float max_motor_torque; ///< 最大马达力 [N] float max_motor_torque; ///< 最大马达力 [N]
float motor_speed; ///< 马达转速 [degree/s] float motor_speed; ///< 马达转速 [degree/s]
Param(Body* body_a, Body* body_b, Point const& anchor, bool enable_limit = false, float lower_angle = 0.0f, Param(Body* body_a, Body* body_b, Point const& anchor, bool enable_limit = false, float lower_angle = 0.0f,
float upper_angle = 0.0f, bool enable_motor = false, float max_motor_torque = 0.0f, float upper_angle = 0.0f, bool enable_motor = false, float max_motor_torque = 0.0f,
@ -592,71 +592,71 @@ public:
}; };
/// \~chinese /// \~chinese
/// @brief 创建旋转关节 /// @brief 创建旋转关节
/// @param world 物理世界 /// @param world 物理世界
/// @param param 关节参数 /// @param param 关节参数
static RevoluteJointPtr Create(World* world, Param const& param); static RevoluteJointPtr Create(World* world, Param const& param);
RevoluteJoint(); RevoluteJoint();
/// \~chinese /// \~chinese
/// @brief 初始化关节 /// @brief 初始化关节
bool InitJoint(World* world, Param const& param); bool InitJoint(World* world, Param const& param);
/// \~chinese /// \~chinese
/// @brief 获取参考角 /// @brief 获取参考角
float GetReferenceAngle() const; float GetReferenceAngle() const;
/// \~chinese /// \~chinese
/// @brief 获取关节角度 /// @brief 获取关节角度
float GetJointAngle() const; float GetJointAngle() const;
/// \~chinese /// \~chinese
/// @brief 获取关节速度 /// @brief 获取关节速度
float GetJointSpeed() const; float GetJointSpeed() const;
/// \~chinese /// \~chinese
/// @brief 是否启用关节限制 /// @brief 是否启用关节限制
bool IsLimitEnabled() const; bool IsLimitEnabled() const;
/// \~chinese /// \~chinese
/// @brief 设置是否启用关节限制 /// @brief 设置是否启用关节限制
void EnableLimit(bool flag); void EnableLimit(bool flag);
/// \~chinese /// \~chinese
/// @brief 获取平移最小限制 /// @brief 获取平移最小限制
float GetLowerLimit() const; float GetLowerLimit() const;
/// \~chinese /// \~chinese
/// @brief 获取平移最大限制 /// @brief 获取平移最大限制
float GetUpperLimit() const; float GetUpperLimit() const;
/// \~chinese /// \~chinese
/// @brief 设置关节限制 /// @brief 设置关节限制
void SetLimits(float lower, float upper); void SetLimits(float lower, float upper);
/// \~chinese /// \~chinese
/// @brief 是否启用马达 /// @brief 是否启用马达
bool IsMotorEnabled() const; bool IsMotorEnabled() const;
/// \~chinese /// \~chinese
/// @brief 设置是否启用马达 /// @brief 设置是否启用马达
void EnableMotor(bool flag); void EnableMotor(bool flag);
/// \~chinese /// \~chinese
/// @brief 设置马达转速 [degree/s] /// @brief 设置马达转速 [degree/s]
void SetMotorSpeed(float speed); void SetMotorSpeed(float speed);
/// \~chinese /// \~chinese
/// @brief 获取马达转速 [degree/s] /// @brief 获取马达转速 [degree/s]
float GetMotorSpeed() const; float GetMotorSpeed() const;
/// \~chinese /// \~chinese
/// @brief 设置最大马达转矩 [N/m] /// @brief 设置最大马达转矩 [N/m]
void SetMaxMotorTorque(float torque); void SetMaxMotorTorque(float torque);
/// \~chinese /// \~chinese
/// @brief 获取最大马达转矩 [N/m] /// @brief 获取最大马达转矩 [N/m]
float GetMaxMotorTorque() const; float GetMaxMotorTorque() const;
private: private:
@ -664,17 +664,17 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 绳关节 /// @brief 绳关节
class KGE_API RopeJoint : public Joint class KGE_API RopeJoint : public Joint
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 绳关节参数 /// @brief 绳关节参数
struct Param : public Joint::ParamBase struct Param : public Joint::ParamBase
{ {
Point local_anchor_a; ///< 关节在物体A上的连接点 Point local_anchor_a; ///< 关节在物体A上的连接点
Point local_anchor_b; ///< 关节在物体B上的连接点 Point local_anchor_b; ///< 关节在物体B上的连接点
float max_length; ///< 绳索最大长度 float max_length; ///< 绳索最大长度
Param(Body* body_a, Body* body_b, Point const& local_anchor_a, Point const& local_anchor_b, Param(Body* body_a, Body* body_b, Point const& local_anchor_a, Point const& local_anchor_b,
float max_length = 0.f) float max_length = 0.f)
@ -693,23 +693,23 @@ public:
}; };
/// \~chinese /// \~chinese
/// @brief 创建绳关节 /// @brief 创建绳关节
/// @param world 物理世界 /// @param world 物理世界
/// @param param 关节参数 /// @param param 关节参数
static RopeJointPtr Create(World* world, Param const& param); static RopeJointPtr Create(World* world, Param const& param);
RopeJoint(); RopeJoint();
/// \~chinese /// \~chinese
/// @brief 初始化关节 /// @brief 初始化关节
bool InitJoint(World* world, Param const& param); bool InitJoint(World* world, Param const& param);
/// \~chinese /// \~chinese
/// @brief 设置关节最大长度 /// @brief 设置关节最大长度
void SetMaxLength(float length); void SetMaxLength(float length);
/// \~chinese /// \~chinese
/// @brief 获取关节最大长度 /// @brief 获取关节最大长度
float GetMaxLength() const; float GetMaxLength() const;
private: private:
@ -717,17 +717,17 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 焊接关节 /// @brief 焊接关节
class KGE_API WeldJoint : public Joint class KGE_API WeldJoint : public Joint
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 焊接关节参数 /// @brief 焊接关节参数
struct Param : public Joint::ParamBase struct Param : public Joint::ParamBase
{ {
Point anchor; ///< 焊接位置 Point anchor; ///< 焊接位置
float frequency_hz; ///< 响应速度,数值越高关节响应的速度越快,看上去越坚固 float frequency_hz; ///< 响应速度,数值越高关节响应的速度越快,看上去越坚固
float damping_ratio; ///< 阻尼率,值越大关节运动阻尼越大 float damping_ratio; ///< 阻尼率,值越大关节运动阻尼越大
Param(Body* body_a, Body* body_b, Point const& anchor, float frequency_hz = 0.f, float damping_ratio = 0.f) Param(Body* body_a, Body* body_b, Point const& anchor, float frequency_hz = 0.f, float damping_ratio = 0.f)
: ParamBase(body_a, body_b) : ParamBase(body_a, body_b)
@ -744,35 +744,35 @@ public:
}; };
/// \~chinese /// \~chinese
/// @brief 创建焊接关节 /// @brief 创建焊接关节
/// @param world 物理世界 /// @param world 物理世界
/// @param param 关节参数 /// @param param 关节参数
static WeldJointPtr Create(World* world, Param const& param); static WeldJointPtr Create(World* world, Param const& param);
WeldJoint(); WeldJoint();
/// \~chinese /// \~chinese
/// @brief 初始化关节 /// @brief 初始化关节
bool InitJoint(World* world, Param const& param); bool InitJoint(World* world, Param const& param);
/// \~chinese /// \~chinese
/// @brief 获取物体B相对于物体A的角度 /// @brief 获取物体B相对于物体A的角度
float GetReferenceAngle() const; float GetReferenceAngle() const;
/// \~chinese /// \~chinese
/// @brief 设置弹簧响应速度 [赫兹] /// @brief 设置弹簧响应速度 [赫兹]
void SetFrequency(float hz); void SetFrequency(float hz);
/// \~chinese /// \~chinese
/// @brief 获取弹簧响应速度 [赫兹] /// @brief 获取弹簧响应速度 [赫兹]
float GetFrequency() const; float GetFrequency() const;
/// \~chinese /// \~chinese
/// @brief 设置阻尼率 /// @brief 设置阻尼率
void SetDampingRatio(float ratio); void SetDampingRatio(float ratio);
/// \~chinese /// \~chinese
/// @brief 获取阻尼率 /// @brief 获取阻尼率
float GetDampingRatio() const; float GetDampingRatio() const;
private: private:
@ -780,21 +780,21 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 轮关节 /// @brief 轮关节
class KGE_API WheelJoint : public Joint class KGE_API WheelJoint : public Joint
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 轮关节参数 /// @brief 轮关节参数
struct Param : public Joint::ParamBase struct Param : public Joint::ParamBase
{ {
Point anchor; ///< 轮关节位置 Point anchor; ///< 轮关节位置
Vec2 axis; ///< 物体A滑动方向 Vec2 axis; ///< 物体A滑动方向
bool enable_motor; ///< 是否启用马达 bool enable_motor; ///< 是否启用马达
float max_motor_torque; ///< 最大马达力 [N] float max_motor_torque; ///< 最大马达力 [N]
float motor_speed; ///< 马达转速 [degree/s] float motor_speed; ///< 马达转速 [degree/s]
float frequency_hz; ///< 响应速度,数值越高关节响应的速度越快,看上去越坚固 float frequency_hz; ///< 响应速度,数值越高关节响应的速度越快,看上去越坚固
float damping_ratio; ///< 弹簧阻尼率,值越大关节运动阻尼越大 float damping_ratio; ///< 弹簧阻尼率,值越大关节运动阻尼越大
Param(Body* body_a, Body* body_b, Point const& anchor, Vec2 const& axis, float frequency_hz = 2.0f, Param(Body* body_a, Body* body_b, Point const& anchor, Vec2 const& axis, float frequency_hz = 2.0f,
float damping_ratio = 0.7f, bool enable_motor = false, float max_motor_torque = 0.0f, float damping_ratio = 0.7f, bool enable_motor = false, float max_motor_torque = 0.0f,
@ -820,71 +820,71 @@ public:
}; };
/// \~chinese /// \~chinese
/// @brief 创建轮关节 /// @brief 创建轮关节
/// @param world 物理世界 /// @param world 物理世界
/// @param param 关节参数 /// @param param 关节参数
static WheelJointPtr Create(World* world, Param const& param); static WheelJointPtr Create(World* world, Param const& param);
WheelJoint(); WheelJoint();
/// \~chinese /// \~chinese
/// @brief 初始化关节 /// @brief 初始化关节
bool InitJoint(World* world, Param const& param); bool InitJoint(World* world, Param const& param);
/// \~chinese /// \~chinese
/// @brief 获取关节当前的平移距离 /// @brief 获取关节当前的平移距离
float GetJointTranslation() const; float GetJointTranslation() const;
/// \~chinese /// \~chinese
/// @brief 获取关节当前的线性速度 /// @brief 获取关节当前的线性速度
float GetJointLinearSpeed() const; float GetJointLinearSpeed() const;
/// \~chinese /// \~chinese
/// @brief 获取关节当前的角度 /// @brief 获取关节当前的角度
float GetJointAngle() const; float GetJointAngle() const;
/// \~chinese /// \~chinese
/// @brief 获取关节当前的旋转速度 /// @brief 获取关节当前的旋转速度
float GetJointAngularSpeed() const; float GetJointAngularSpeed() const;
/// \~chinese /// \~chinese
/// @brief 是否启用马达 /// @brief 是否启用马达
bool IsMotorEnabled() const; bool IsMotorEnabled() const;
/// \~chinese /// \~chinese
/// @brief 设置是否启用马达 /// @brief 设置是否启用马达
void EnableMotor(bool flag); void EnableMotor(bool flag);
/// \~chinese /// \~chinese
/// @brief 设置马达转速 [degree/s] /// @brief 设置马达转速 [degree/s]
void SetMotorSpeed(float speed); void SetMotorSpeed(float speed);
/// \~chinese /// \~chinese
/// @brief 获取马达转速 [degree/s] /// @brief 获取马达转速 [degree/s]
float GetMotorSpeed() const; float GetMotorSpeed() const;
/// \~chinese /// \~chinese
/// @brief 设置最大马达转矩 [N/m] /// @brief 设置最大马达转矩 [N/m]
void SetMaxMotorTorque(float torque); void SetMaxMotorTorque(float torque);
/// \~chinese /// \~chinese
/// @brief 获取最大马达转矩 [N/m] /// @brief 获取最大马达转矩 [N/m]
float GetMaxMotorTorque() const; float GetMaxMotorTorque() const;
/// \~chinese /// \~chinese
/// @brief 设置弹簧响应速度 /// @brief 设置弹簧响应速度
void SetSpringFrequencyHz(float hz); void SetSpringFrequencyHz(float hz);
/// \~chinese /// \~chinese
/// @brief 获取弹簧响应速度 /// @brief 获取弹簧响应速度
float GetSpringFrequencyHz() const; float GetSpringFrequencyHz() const;
/// \~chinese /// \~chinese
/// @brief 设置弹簧阻尼率 /// @brief 设置弹簧阻尼率
void SetSpringDampingRatio(float ratio); void SetSpringDampingRatio(float ratio);
/// \~chinese /// \~chinese
/// @brief 获取弹簧阻尼率 /// @brief 获取弹簧阻尼率
float GetSpringDampingRatio() const; float GetSpringDampingRatio() const;
private: private:
@ -892,19 +892,19 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 鼠标关节 /// @brief 鼠标关节
/// @details 用于使身体的某个点追踪世界上的指定点,例如让物体追踪鼠标位置 /// @details 用于使身体的某个点追踪世界上的指定点,例如让物体追踪鼠标位置
class KGE_API MouseJoint : public Joint class KGE_API MouseJoint : public Joint
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 鼠标关节参数 /// @brief 鼠标关节参数
struct Param : public Joint::ParamBase struct Param : public Joint::ParamBase
{ {
Point target; ///< 关节作用目标位置 Point target; ///< 关节作用目标位置
float max_force; ///< 作用在物体A上的最大力 float max_force; ///< 作用在物体A上的最大力
float frequency_hz; ///< 响应速度,数值越高关节响应的速度越快,看上去越坚固 float frequency_hz; ///< 响应速度,数值越高关节响应的速度越快,看上去越坚固
float damping_ratio; ///< 阻尼率,值越大关节运动阻尼越大 float damping_ratio; ///< 阻尼率,值越大关节运动阻尼越大
Param(Body* body_a, Body* body_b, Point const& target, float max_force, float frequency_hz = 5.0f, Param(Body* body_a, Body* body_b, Point const& target, float max_force, float frequency_hz = 5.0f,
float damping_ratio = 0.7f) float damping_ratio = 0.7f)
@ -924,39 +924,39 @@ public:
}; };
/// \~chinese /// \~chinese
/// @brief 创建鼠标关节 /// @brief 创建鼠标关节
/// @param world 物理世界 /// @param world 物理世界
/// @param param 关节参数 /// @param param 关节参数
static MouseJointPtr Create(World* world, Param const& param); static MouseJointPtr Create(World* world, Param const& param);
MouseJoint(); MouseJoint();
/// \~chinese /// \~chinese
/// @brief 初始化关节 /// @brief 初始化关节
bool InitJoint(World* world, Param const& param); bool InitJoint(World* world, Param const& param);
/// \~chinese /// \~chinese
/// @brief 设定最大摩擦力 [N] /// @brief 设定最大摩擦力 [N]
void SetMaxForce(float force); void SetMaxForce(float force);
/// \~chinese /// \~chinese
/// @brief 获取最大摩擦力 [N] /// @brief 获取最大摩擦力 [N]
float GetMaxForce() const; float GetMaxForce() const;
/// \~chinese /// \~chinese
/// @brief 设置响应速度 [hz] /// @brief 设置响应速度 [hz]
void SetFrequency(float hz); void SetFrequency(float hz);
/// \~chinese /// \~chinese
/// @brief 获取响应速度 [hz] /// @brief 获取响应速度 [hz]
float GetFrequency() const; float GetFrequency() const;
/// \~chinese /// \~chinese
/// @brief 设置阻尼率 /// @brief 设置阻尼率
void SetDampingRatio(float ratio); void SetDampingRatio(float ratio);
/// \~chinese /// \~chinese
/// @brief 获取阻尼率 /// @brief 获取阻尼率
float GetDampingRatio() const; float GetDampingRatio() const;
private: private:

View File

@ -30,7 +30,7 @@ KGE_DECLARE_SMART_PTR(World);
/** /**
* \~chinese * \~chinese
* \defgroup Physics * \defgroup Physics
*/ */
/** /**
@ -40,7 +40,7 @@ KGE_DECLARE_SMART_PTR(World);
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API World : public Stage class KGE_API World : public Stage
{ {
@ -53,53 +53,53 @@ public:
virtual ~World(); virtual ~World();
/// \~chinese /// \~chinese
/// @brief 获取重力 [N] /// @brief 获取重力 [N]
Vec2 GetGravity() const; Vec2 GetGravity() const;
/// \~chinese /// \~chinese
/// @brief 设置重力 [N] /// @brief 设置重力 [N]
void SetGravity(Vec2 gravity); void SetGravity(Vec2 gravity);
/// \~chinese /// \~chinese
/// @brief 获取物理接触列表 /// @brief 获取物理接触列表
ContactList GetContactList(); ContactList GetContactList();
/// \~chinese /// \~chinese
/// @brief 获取全局缩放比例 /// @brief 获取全局缩放比例
/// @details 缩放比例是指由物理世界的单位米转换到屏幕像素的比例默认比例为1:100 /// @details 缩放比例是指由物理世界的单位米转换到屏幕像素的比例默认比例为1:100
float GetGlobalScale() const; float GetGlobalScale() const;
/// \~chinese /// \~chinese
/// @brief 设置全局缩放比例 /// @brief 设置全局缩放比例
/// @details 缩放比例是指由物理世界的单位米转换到屏幕像素的比例默认比例为1:100 /// @details 缩放比例是指由物理世界的单位米转换到屏幕像素的比例默认比例为1:100
void SetGlobalScale(float scale); void SetGlobalScale(float scale);
/// \~chinese /// \~chinese
/// @brief 游戏世界单位转换为物理世界单位 /// @brief 游戏世界单位转换为物理世界单位
/// @details 根据全局缩放比例将物理世界的单位米转换为像素单位 /// @details 根据全局缩放比例将物理世界的单位米转换为像素单位
float World2Stage(float value) const; float World2Stage(float value) const;
/// \~chinese /// \~chinese
/// @brief 游戏世界单位转换为物理世界单位 /// @brief 游戏世界单位转换为物理世界单位
/// @details 根据全局缩放比例将物理世界的单位米转换为像素单位 /// @details 根据全局缩放比例将物理世界的单位米转换为像素单位
Vec2 World2Stage(const b2Vec2& pos) const; Vec2 World2Stage(const b2Vec2& pos) const;
/// \~chinese /// \~chinese
/// @brief 物理世界单位转换为游戏世界单位 /// @brief 物理世界单位转换为游戏世界单位
/// @details 根据全局缩放比例将像素单位转换为物理世界的单位米 /// @details 根据全局缩放比例将像素单位转换为物理世界的单位米
float Stage2World(float value) const; float Stage2World(float value) const;
/// \~chinese /// \~chinese
/// @brief 物理世界单位转换为游戏世界单位 /// @brief 物理世界单位转换为游戏世界单位
/// @details 根据全局缩放比例将像素单位转换为物理世界的单位米 /// @details 根据全局缩放比例将像素单位转换为物理世界的单位米
b2Vec2 Stage2World(const Vec2& pos) const; b2Vec2 Stage2World(const Vec2& pos) const;
/// \~chinese /// \~chinese
/// @brief 设置速度迭代次数, 默认为 6 /// @brief 设置速度迭代次数, 默认为 6
void SetVelocityIterations(int vel_iter); void SetVelocityIterations(int vel_iter);
/// \~chinese /// \~chinese
/// @brief 设置位置迭代次数, 默认为 2 /// @brief 设置位置迭代次数, 默认为 2
void SetPositionIterations(int pos_iter); void SetPositionIterations(int pos_iter);
b2World* GetB2World(); b2World* GetB2World();
@ -108,27 +108,27 @@ public:
private: private:
/// \~chinese /// \~chinese
/// @brief 移除物体 /// @brief 移除物体
void RemoveBody(Body* body); void RemoveBody(Body* body);
/// \~chinese /// \~chinese
/// @brief 移除所有物体 /// @brief 移除所有物体
void RemoveAllBodies(); void RemoveAllBodies();
/// \~chinese /// \~chinese
/// @brief 添加关节 /// @brief 添加关节
void AddJoint(Joint* joint); void AddJoint(Joint* joint);
/// \~chinese /// \~chinese
/// @brief 移除关节 /// @brief 移除关节
void RemoveJoint(Joint* joint); void RemoveJoint(Joint* joint);
/// \~chinese /// \~chinese
/// @brief 移除所有关节 /// @brief 移除所有关节
void RemoveAllJoints(); void RemoveAllJoints();
/// \~chinese /// \~chinese
/// @brief 关节被移除 /// @brief 关节被移除
void JointRemoved(b2Joint* joint); void JointRemoved(b2Joint* joint);
protected: protected:

View File

@ -154,7 +154,7 @@ void Actor::RenderBorder(RenderContext& ctx)
ctx.FillRectangle(bounds); ctx.FillRectangle(bounds);
ctx.SetCurrentBrush(GetStage()->GetBorderStrokeBrush()); ctx.SetCurrentBrush(GetStage()->GetBorderStrokeBrush());
ctx.DrawRectangle(bounds, 2.f); ctx.DrawRectangle(bounds, nullptr, 2.f);
} }
for (auto child = children_.first_item(); child; child = child->next_item()) for (auto child = children_.first_item(); child; child = child->next_item())
@ -513,7 +513,7 @@ void Actor::AddChild(Actor* child, int zorder)
{ {
if (parent == child) if (parent == child)
{ {
KGE_ERROR(L"A actor cannot be its own parent"); KGE_ERROR("A actor cannot be its own parent");
return; return;
} }
} }

View File

@ -36,7 +36,7 @@ KGE_DECLARE_SMART_PTR(Actor);
/** /**
* \~chinese * \~chinese
* \defgroup Actors * \defgroup Actors
*/ */
/** /**
@ -46,9 +46,9 @@ KGE_DECLARE_SMART_PTR(Actor);
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @details * @details
* *
*/ */
class KGE_API Actor class KGE_API Actor
: public virtual ObjectBase : public virtual ObjectBase
@ -63,15 +63,15 @@ class KGE_API Actor
public: public:
/// \~chinese /// \~chinese
/// @brief 子成员列表 /// @brief 子成员列表
using Children = IntrusiveList<ActorPtr>; using Children = IntrusiveList<ActorPtr>;
/// \~chinese /// \~chinese
/// @brief 角色更新回调函数 /// @brief 角色更新回调函数
using UpdateCallback = Function<void(Duration)>; using UpdateCallback = Function<void(Duration)>;
/// \~chinese /// \~chinese
/// @brief 创建角色 /// @brief 创建角色
static ActorPtr Create(); static ActorPtr Create();
Actor(); Actor();
@ -79,372 +79,372 @@ public:
virtual ~Actor(); virtual ~Actor();
/// \~chinese /// \~chinese
/// @brief 更新角色 /// @brief 更新角色
/// @details 每帧画面刷新前调用该函数,重载该函数以实现角色的更新处理 /// @details 每帧画面刷新前调用该函数,重载该函数以实现角色的更新处理
/// @param dt 距上一次更新的时间间隔 /// @param dt 距上一次更新的时间间隔
virtual void OnUpdate(Duration dt); virtual void OnUpdate(Duration dt);
/// \~chinese /// \~chinese
/// @brief 渲染角色 /// @brief 渲染角色
/// @details /// @details
/// 每帧画面刷新时调用该函数,默认不进行渲染,重载该函数以实现具体渲染过程 /// 每帧画面刷新时调用该函数,默认不进行渲染,重载该函数以实现具体渲染过程
/// @param ctx 渲染上下文 /// @param ctx 渲染上下文
virtual void OnRender(RenderContext& ctx); virtual void OnRender(RenderContext& ctx);
/// \~chinese /// \~chinese
/// @brief 获取显示状态 /// @brief 获取显示状态
bool IsVisible() const; bool IsVisible() const;
/// \~chinese /// \~chinese
/// @brief 获取响应状态 /// @brief 获取响应状态
bool IsResponsible() const; bool IsResponsible() const;
/// \~chinese /// \~chinese
/// @brief 是否启用级联透明度 /// @brief 是否启用级联透明度
bool IsCascadeOpacityEnabled() const; bool IsCascadeOpacityEnabled() const;
/// \~chinese /// \~chinese
/// @brief 获取名称的 Hash 值 /// @brief 获取名称的 Hash 值
size_t GetHashName() const; size_t GetHashName() const;
/// \~chinese /// \~chinese
/// @brief 获取 Z 轴顺序 /// @brief 获取 Z 轴顺序
int GetZOrder() const; int GetZOrder() const;
/// \~chinese /// \~chinese
/// @brief 获取坐标 /// @brief 获取坐标
Point const& GetPosition() const; Point const& GetPosition() const;
/// \~chinese /// \~chinese
/// @brief 获取 x 坐标 /// @brief 获取 x 坐标
float GetPositionX() const; float GetPositionX() const;
/// \~chinese /// \~chinese
/// @brief 获取 y 坐标 /// @brief 获取 y 坐标
float GetPositionY() const; float GetPositionY() const;
/// \~chinese /// \~chinese
/// @brief 获取宽度 /// @brief 获取宽度
float GetWidth() const; float GetWidth() const;
/// \~chinese /// \~chinese
/// @brief 获取高度 /// @brief 获取高度
float GetHeight() const; float GetHeight() const;
/// \~chinese /// \~chinese
/// @brief 获取大小 /// @brief 获取大小
Size const& GetSize() const; Size const& GetSize() const;
/// \~chinese /// \~chinese
/// @brief 获取缩放后的宽度 /// @brief 获取缩放后的宽度
float GetScaledWidth() const; float GetScaledWidth() const;
/// \~chinese /// \~chinese
/// @brief 获取缩放后的高度 /// @brief 获取缩放后的高度
float GetScaledHeight() const; float GetScaledHeight() const;
/// \~chinese /// \~chinese
/// @brief 获取缩放后的大小 /// @brief 获取缩放后的大小
Size GetScaledSize() const; Size GetScaledSize() const;
/// \~chinese /// \~chinese
/// @brief 获取锚点 /// @brief 获取锚点
Point const& GetAnchor() const; Point const& GetAnchor() const;
/// \~chinese /// \~chinese
/// @brief 获取 x 方向锚点 /// @brief 获取 x 方向锚点
float GetAnchorX() const; float GetAnchorX() const;
/// \~chinese /// \~chinese
/// @brief 获取 y 方向锚点 /// @brief 获取 y 方向锚点
float GetAnchorY() const; float GetAnchorY() const;
/// \~chinese /// \~chinese
/// @brief 获取透明度 /// @brief 获取透明度
float GetOpacity() const; float GetOpacity() const;
/// \~chinese /// \~chinese
/// @brief 获取显示透明度 /// @brief 获取显示透明度
float GetDisplayedOpacity() const; float GetDisplayedOpacity() const;
/// \~chinese /// \~chinese
/// @brief 获取旋转角度 /// @brief 获取旋转角度
float GetRotation() const; float GetRotation() const;
/// \~chinese /// \~chinese
/// @brief 获取缩放比例 /// @brief 获取缩放比例
Point const& GetScale() const; Point const& GetScale() const;
/// \~chinese /// \~chinese
/// @brief 获取横向缩放比例 /// @brief 获取横向缩放比例
float GetScaleX() const; float GetScaleX() const;
/// \~chinese /// \~chinese
/// @brief 获取纵向缩放比例 /// @brief 获取纵向缩放比例
float GetScaleY() const; float GetScaleY() const;
/// \~chinese /// \~chinese
/// @brief 获取错切角度 /// @brief 获取错切角度
Point const& GetSkew() const; Point const& GetSkew() const;
/// \~chinese /// \~chinese
/// @brief 获取横向错切角度 /// @brief 获取横向错切角度
float GetSkewX() const; float GetSkewX() const;
/// \~chinese /// \~chinese
/// @brief 获取纵向错切角度 /// @brief 获取纵向错切角度
float GetSkewY() const; float GetSkewY() const;
/// \~chinese /// \~chinese
/// @brief 获取变换 /// @brief 获取变换
Transform GetTransform() const; Transform GetTransform() const;
/// \~chinese /// \~chinese
/// @brief 获取父角色 /// @brief 获取父角色
Actor* GetParent() const; Actor* GetParent() const;
/// \~chinese /// \~chinese
/// @brief 获取所在舞台 /// @brief 获取所在舞台
Stage* GetStage() const; Stage* GetStage() const;
/// \~chinese /// \~chinese
/// @brief 获取边框 /// @brief 获取边框
virtual Rect GetBounds() const; virtual Rect GetBounds() const;
/// \~chinese /// \~chinese
/// @brief 获取外切包围盒 /// @brief 获取外切包围盒
virtual Rect GetBoundingBox() const; virtual Rect GetBoundingBox() const;
/// \~chinese /// \~chinese
/// @brief 获取二维变换矩阵 /// @brief 获取二维变换矩阵
Matrix3x2 const& GetTransformMatrix() const; Matrix3x2 const& GetTransformMatrix() const;
/// \~chinese /// \~chinese
/// @brief 获取二维变换的逆矩阵 /// @brief 获取二维变换的逆矩阵
Matrix3x2 const& GetTransformInverseMatrix() const; Matrix3x2 const& GetTransformInverseMatrix() const;
/// \~chinese /// \~chinese
/// @brief 设置角色是否可见 /// @brief 设置角色是否可见
void SetVisible(bool val); void SetVisible(bool val);
/// \~chinese /// \~chinese
/// @brief 设置名称 /// @brief 设置名称
void SetName(String const& name); void SetName(String const& name);
/// \~chinese /// \~chinese
/// @brief 设置坐标 /// @brief 设置坐标
virtual void SetPosition(Point const& point); virtual void SetPosition(Point const& point);
/// \~chinese /// \~chinese
/// @brief 设置坐标 /// @brief 设置坐标
void SetPosition(float x, float y); void SetPosition(float x, float y);
/// \~chinese /// \~chinese
/// @brief 设置横坐标 /// @brief 设置横坐标
void SetPositionX(float x); void SetPositionX(float x);
/// \~chinese /// \~chinese
/// @brief 设置纵坐标 /// @brief 设置纵坐标
void SetPositionY(float y); void SetPositionY(float y);
/// \~chinese /// \~chinese
/// @brief 移动坐标 /// @brief 移动坐标
void Move(Vec2 const& v); void Move(Vec2 const& v);
/// \~chinese /// \~chinese
/// @brief 移动坐标 /// @brief 移动坐标
void Move(float vx, float vy); void Move(float vx, float vy);
/// \~chinese /// \~chinese
/// @brief 设置缩放比例,默认为 (1.0, 1.0) /// @brief 设置缩放比例,默认为 (1.0, 1.0)
virtual void SetScale(Vec2 const& scale); virtual void SetScale(Vec2 const& scale);
/// \~chinese /// \~chinese
/// @brief 设置缩放比例,默认为 (1.0, 1.0) /// @brief 设置缩放比例,默认为 (1.0, 1.0)
void SetScale(float scalex, float scaley); void SetScale(float scalex, float scaley);
/// \~chinese /// \~chinese
/// @brief 设置错切角度,默认为 (0, 0) /// @brief 设置错切角度,默认为 (0, 0)
virtual void SetSkew(Vec2 const& skew); virtual void SetSkew(Vec2 const& skew);
/// \~chinese /// \~chinese
/// @brief 设置错切角度,默认为 (0, 0) /// @brief 设置错切角度,默认为 (0, 0)
void SetSkew(float skewx, float skewy); void SetSkew(float skewx, float skewy);
/// \~chinese /// \~chinese
/// @brief 设置旋转角度,默认为 0 /// @brief 设置旋转角度,默认为 0
virtual void SetRotation(float rotation); virtual void SetRotation(float rotation);
/// \~chinese /// \~chinese
/// @brief 设置锚点位置,默认为 (0, 0), 范围 [0, 1] /// @brief 设置锚点位置,默认为 (0, 0), 范围 [0, 1]
virtual void SetAnchor(Vec2 const& anchor); virtual void SetAnchor(Vec2 const& anchor);
/// \~chinese /// \~chinese
/// @brief 设置锚点位置,默认为 (0, 0), 范围 [0, 1] /// @brief 设置锚点位置,默认为 (0, 0), 范围 [0, 1]
void SetAnchor(float anchorx, float anchory); void SetAnchor(float anchorx, float anchory);
/// \~chinese /// \~chinese
/// @brief 修改宽度 /// @brief 修改宽度
virtual void SetWidth(float width); virtual void SetWidth(float width);
/// \~chinese /// \~chinese
/// @brief 修改高度 /// @brief 修改高度
virtual void SetHeight(float height); virtual void SetHeight(float height);
/// \~chinese /// \~chinese
/// @brief 修改大小 /// @brief 修改大小
virtual void SetSize(Size const& size); virtual void SetSize(Size const& size);
/// \~chinese /// \~chinese
/// @brief 修改大小 /// @brief 修改大小
void SetSize(float width, float height); void SetSize(float width, float height);
/// \~chinese /// \~chinese
/// @brief 设置透明度,默认为 1.0, 范围 [0, 1] /// @brief 设置透明度,默认为 1.0, 范围 [0, 1]
virtual void SetOpacity(float opacity); virtual void SetOpacity(float opacity);
/// \~chinese /// \~chinese
/// @brief 启用或禁用级联透明度 /// @brief 启用或禁用级联透明度
void SetCascadeOpacityEnabled(bool enabled); void SetCascadeOpacityEnabled(bool enabled);
/// \~chinese /// \~chinese
/// @brief 设置二维仿射变换 /// @brief 设置二维仿射变换
void SetTransform(Transform const& transform); void SetTransform(Transform const& transform);
/// \~chinese /// \~chinese
/// @brief 设置 Z 轴顺序,默认为 0 /// @brief 设置 Z 轴顺序,默认为 0
void SetZOrder(int zorder); void SetZOrder(int zorder);
/// \~chinese /// \~chinese
/// @brief 设置角色是否可响应,默认为 false /// @brief 设置角色是否可响应,默认为 false
/// @details 可响应的角色会收到鼠标的 Hover | Out | Click 消息 /// @details 可响应的角色会收到鼠标的 Hover | Out | Click 消息
void SetResponsible(bool enable); void SetResponsible(bool enable);
/// \~chinese /// \~chinese
/// @brief 添加子角色 /// @brief 添加子角色
void AddChild(ActorPtr child, int zorder = 0); void AddChild(ActorPtr child, int zorder = 0);
/// \~chinese /// \~chinese
/// @brief 添加子角色 /// @brief 添加子角色
void AddChild(Actor* child, int zorder = 0); void AddChild(Actor* child, int zorder = 0);
/// \~chinese /// \~chinese
/// @brief 添加多个子角色 /// @brief 添加多个子角色
void AddChildren(Vector<ActorPtr> const& children); void AddChildren(Vector<ActorPtr> const& children);
/// \~chinese /// \~chinese
/// @brief 获取名称相同的子角色 /// @brief 获取名称相同的子角色
Actor* GetChild(String const& name) const; Actor* GetChild(String const& name) const;
/// \~chinese /// \~chinese
/// @brief 获取所有名称相同的子角色 /// @brief 获取所有名称相同的子角色
Vector<ActorPtr> GetChildren(String const& name) const; Vector<ActorPtr> GetChildren(String const& name) const;
/// \~chinese /// \~chinese
/// @brief 获取全部子角色 /// @brief 获取全部子角色
Children& GetAllChildren(); Children& GetAllChildren();
/// \~chinese /// \~chinese
/// @brief 获取全部子角色 /// @brief 获取全部子角色
Children const& GetAllChildren() const; Children const& GetAllChildren() const;
/// \~chinese /// \~chinese
/// @brief 移除子角色 /// @brief 移除子角色
void RemoveChild(ActorPtr child); void RemoveChild(ActorPtr child);
/// \~chinese /// \~chinese
/// @brief 移除子角色 /// @brief 移除子角色
void RemoveChild(Actor* child); void RemoveChild(Actor* child);
/// \~chinese /// \~chinese
/// @brief 移除所有名称相同的子角色 /// @brief 移除所有名称相同的子角色
void RemoveChildren(String const& child_name); void RemoveChildren(String const& child_name);
/// \~chinese /// \~chinese
/// @brief 移除所有角色 /// @brief 移除所有角色
void RemoveAllChildren(); void RemoveAllChildren();
/// \~chinese /// \~chinese
/// @brief 从父角色移除 /// @brief 从父角色移除
void RemoveFromParent(); void RemoveFromParent();
/// \~chinese /// \~chinese
/// @brief 暂停角色更新 /// @brief 暂停角色更新
void PauseUpdating(); void PauseUpdating();
/// \~chinese /// \~chinese
/// @brief 继续角色更新 /// @brief 继续角色更新
void ResumeUpdating(); void ResumeUpdating();
/// \~chinese /// \~chinese
/// @brief 角色更新是否暂停 /// @brief 角色更新是否暂停
bool IsUpdatePausing() const; bool IsUpdatePausing() const;
/// \~chinese /// \~chinese
/// @brief 设置更新时的回调函数 /// @brief 设置更新时的回调函数
void SetCallbackOnUpdate(UpdateCallback const& cb); void SetCallbackOnUpdate(UpdateCallback const& cb);
/// \~chinese /// \~chinese
/// @brief 获取更新时的回调函数 /// @brief 获取更新时的回调函数
UpdateCallback GetCallbackOnUpdate() const; UpdateCallback GetCallbackOnUpdate() const;
/// \~chinese /// \~chinese
/// @brief 判断点是否在角色内 /// @brief 判断点是否在角色内
virtual bool ContainsPoint(const Point& point) const; virtual bool ContainsPoint(const Point& point) const;
/// \~chinese /// \~chinese
/// @brief 渲染角色边界 /// @brief 渲染角色边界
void ShowBorder(bool show); void ShowBorder(bool show);
/// \~chinese /// \~chinese
/// @brief 分发事件 /// @brief 分发事件
/// @param evt 事件 /// @param evt 事件
/// @return 是否继续分发该事件 /// @return 是否继续分发该事件
virtual bool DispatchEvent(Event* evt); virtual bool DispatchEvent(Event* evt);
/// \~chinese /// \~chinese
/// @brief 设置默认锚点 /// @brief 设置默认锚点
static void SetDefaultAnchor(float anchor_x, float anchor_y); static void SetDefaultAnchor(float anchor_x, float anchor_y);
protected: protected:
/// \~chinese /// \~chinese
/// @brief 更新自身和所有子角色 /// @brief 更新自身和所有子角色
virtual void Update(Duration dt); virtual void Update(Duration dt);
/// \~chinese /// \~chinese
/// @brief 渲染自身和所有子角色 /// @brief 渲染自身和所有子角色
virtual void Render(RenderContext& ctx); virtual void Render(RenderContext& ctx);
/// \~chinese /// \~chinese
/// @brief 绘制自身和所有子角色的边界 /// @brief 绘制自身和所有子角色的边界
virtual void RenderBorder(RenderContext& ctx); virtual void RenderBorder(RenderContext& ctx);
/// \~chinese /// \~chinese
/// @brief 检查是否在渲染上下文的视区内 /// @brief 检查是否在渲染上下文的视区内
virtual bool CheckVisibility(RenderContext& ctx) const; virtual bool CheckVisibility(RenderContext& ctx) const;
/// \~chinese /// \~chinese
/// @brief 渲染前初始化渲染上下文状态,仅当 CheckVisibility 返回真时调用该函数 /// @brief 渲染前初始化渲染上下文状态,仅当 CheckVisibility 返回真时调用该函数
virtual void PrepareToRender(RenderContext& ctx); virtual void PrepareToRender(RenderContext& ctx);
/// \~chinese /// \~chinese
/// @brief 更新自己的二维变换,并通知所有子角色 /// @brief 更新自己的二维变换,并通知所有子角色
void UpdateTransform() const; void UpdateTransform() const;
/// \~chinese /// \~chinese
/// @brief 更新自己和所有子角色的透明度 /// @brief 更新自己和所有子角色的透明度
void UpdateOpacity(); void UpdateOpacity();
/// \~chinese /// \~chinese
/// @brief 将所有子角色按Z轴顺序排序 /// @brief 将所有子角色按Z轴顺序排序
void Reorder(); void Reorder();
/// \~chinese /// \~chinese
/// @brief 设置节点所在舞台 /// @brief 设置节点所在舞台
void SetStage(Stage* stage); void SetStage(Stage* stage);
/// \~chinese /// \~chinese
/// @brief 处理事件 /// @brief 处理事件
void HandleEvent(Event* evt); void HandleEvent(Event* evt);
private: private:

View File

@ -78,14 +78,14 @@ void Button::SetStatus(Status status)
if (status == Status::Normal) if (status == Status::Normal)
{ {
Window::Instance().SetCursor(CursorType::Arrow); Window::GetInstance().SetCursor(CursorType::Arrow);
if (mouse_out_callback_) if (mouse_out_callback_)
mouse_out_callback_(this); mouse_out_callback_(this);
} }
else if (status == Status::Hover) else if (status == Status::Hover)
{ {
Window::Instance().SetCursor(CursorType::Hand); Window::GetInstance().SetCursor(CursorType::Hand);
if (old_status == Status::Pressed) if (old_status == Status::Pressed)
{ {

View File

@ -30,13 +30,13 @@ KGE_DECLARE_SMART_PTR(TextButton);
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API Button : public virtual ObjectBase class KGE_API Button : public virtual ObjectBase
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 按钮回调函数 /// @brief 按钮回调函数
using Callback = Function<void(Button* /* self */)>; using Callback = Function<void(Button* /* self */)>;
Button(); Button();
@ -44,53 +44,53 @@ public:
virtual ~Button(); virtual ~Button();
/// \~chinese /// \~chinese
/// @brief 获取按钮状态是启用还是禁用 /// @brief 获取按钮状态是启用还是禁用
bool IsEnable() const; bool IsEnable() const;
/// \~chinese /// \~chinese
/// @brief 设置按钮启用或禁用 /// @brief 设置按钮启用或禁用
void SetEnabled(bool enabled); void SetEnabled(bool enabled);
/// \~chinese /// \~chinese
/// @brief 设置按钮点击后的回调函数 /// @brief 设置按钮点击后的回调函数
void SetClickCallback(const Callback& func); void SetClickCallback(const Callback& func);
/// \~chinese /// \~chinese
/// @brief 设置按钮被按下时的回调函数 /// @brief 设置按钮被按下时的回调函数
void SetPressedCallback(const Callback& func); void SetPressedCallback(const Callback& func);
/// \~chinese /// \~chinese
/// @brief 设置按钮被抬起时的回调函数 /// @brief 设置按钮被抬起时的回调函数
void SetReleasedCallback(const Callback& func); void SetReleasedCallback(const Callback& func);
/// \~chinese /// \~chinese
/// @brief 设置鼠标移入按钮时的回调函数 /// @brief 设置鼠标移入按钮时的回调函数
void SetMouseOverCallback(const Callback& func); void SetMouseOverCallback(const Callback& func);
/// \~chinese /// \~chinese
/// @brief 设置鼠标移出按钮时的回调函数 /// @brief 设置鼠标移出按钮时的回调函数
void SetMouseOutCallback(const Callback& func); void SetMouseOutCallback(const Callback& func);
/// \~chinese /// \~chinese
/// @brief 按钮状态 /// @brief 按钮状态
enum class Status enum class Status
{ {
Normal, ///< 普通 Normal, ///< 普通
Hover, ///< 鼠标在按钮内 Hover, ///< 鼠标在按钮内
Pressed ///< 被按下 Pressed ///< 被按下
}; };
/// \~chinese /// \~chinese
/// @brief 设置按钮状态 /// @brief 设置按钮状态
void SetStatus(Status status); void SetStatus(Status status);
/// \~chinese /// \~chinese
/// @brief 获取按钮状态 /// @brief 获取按钮状态
Status GetStatus() const; Status GetStatus() const;
protected: protected:
/// \~chinese /// \~chinese
/// @brief 更新按钮状态 /// @brief 更新按钮状态
void UpdateStatus(Event* evt); void UpdateStatus(Event* evt);
private: private:
@ -104,7 +104,7 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 精灵按钮 /// @brief 精灵按钮
class SpriteButton class SpriteButton
: public Sprite : public Sprite
, public Button , public Button
@ -113,22 +113,22 @@ public:
SpriteButton(); SpriteButton();
/// \~chinese /// \~chinese
/// @brief 创建精灵按钮 /// @brief 创建精灵按钮
/// @param click 按钮点击回调函数 /// @param click 按钮点击回调函数
static SpriteButtonPtr Create(Callback const& click); static SpriteButtonPtr Create(Callback const& click);
/// \~chinese /// \~chinese
/// @brief 创建精灵按钮 /// @brief 创建精灵按钮
/// @param click 按钮点击回调函数 /// @param click 按钮点击回调函数
/// @param pressed 按钮按下回调函数 /// @param pressed 按钮按下回调函数
/// @param mouse_over 按钮移入回调函数 /// @param mouse_over 按钮移入回调函数
/// @param mouse_out 按钮移出回调函数 /// @param mouse_out 按钮移出回调函数
static SpriteButtonPtr Create(Callback const& click, Callback const& pressed, Callback const& mouse_over, static SpriteButtonPtr Create(Callback const& click, Callback const& pressed, Callback const& mouse_over,
Callback const& mouse_out); Callback const& mouse_out);
}; };
/// \~chinese /// \~chinese
/// @brief 文字按钮 /// @brief 文字按钮
class TextButton class TextButton
: public TextActor : public TextActor
, public Button , public Button
@ -137,16 +137,16 @@ public:
TextButton(); TextButton();
/// \~chinese /// \~chinese
/// @brief 创建文字按钮 /// @brief 创建文字按钮
/// @param click 按钮点击回调函数 /// @param click 按钮点击回调函数
static TextButtonPtr Create(Callback const& click); static TextButtonPtr Create(Callback const& click);
/// \~chinese /// \~chinese
/// @brief 创建文字按钮 /// @brief 创建文字按钮
/// @param click 按钮点击回调函数 /// @param click 按钮点击回调函数
/// @param pressed 按钮按下回调函数 /// @param pressed 按钮按下回调函数
/// @param mouse_over 按钮移入回调函数 /// @param mouse_over 按钮移入回调函数
/// @param mouse_out 按钮移出回调函数 /// @param mouse_out 按钮移出回调函数
static TextButtonPtr Create(Callback const& click, Callback const& pressed, Callback const& mouse_over, Callback const& mouse_out); static TextButtonPtr Create(Callback const& click, Callback const& pressed, Callback const& mouse_over, Callback const& mouse_out);
}; };
} // namespace kiwano } // namespace kiwano

View File

@ -25,9 +25,24 @@
namespace kiwano namespace kiwano
{ {
CanvasPtr Canvas::Create() CanvasPtr Canvas::Create(Size const& size)
{ {
CanvasPtr ptr = new (std::nothrow) Canvas; CanvasPtr ptr = new (std::nothrow) Canvas;
if (ptr)
{
try
{
ptr->ctx_ = TextureRenderContext::Create();
ptr->stroke_brush_ = Brush::Create(Color::White);
ptr->fill_brush_ = Brush::Create(Color::White);
ptr->SetSize(ptr->ctx_->GetSize());
}
catch (std::exception)
{
return nullptr;
}
}
return ptr; return ptr;
} }
@ -38,17 +53,15 @@ Canvas::Canvas()
{ {
} }
Canvas::~Canvas() {}
void Canvas::BeginDraw() void Canvas::BeginDraw()
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->BeginDraw(); ctx_->BeginDraw();
} }
void Canvas::EndDraw() void Canvas::EndDraw()
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->EndDraw(); ctx_->EndDraw();
cache_expired_ = true; cache_expired_ = true;
} }
@ -60,124 +73,117 @@ void Canvas::OnRender(RenderContext& ctx)
if (texture_cached_ && texture_cached_->IsValid()) if (texture_cached_ && texture_cached_->IsValid())
{ {
PrepareToRender(ctx); PrepareToRender(ctx);
ctx.DrawTexture(*texture_cached_, nullptr, &GetBounds());
Rect bitmap_rect(0.f, 0.f, texture_cached_->GetWidth(), texture_cached_->GetHeight());
ctx.DrawTexture(*texture_cached_, bitmap_rect, bitmap_rect);
} }
} }
void Canvas::SetBrush(BrushPtr brush) void Canvas::SetBrush(BrushPtr brush)
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->SetCurrentBrush(brush); ctx_->SetCurrentBrush(brush);
} }
float Canvas::GetStrokeWidth() const
{
return stroke_width_;
}
void Canvas::SetBrushTransform(Transform const& transform) void Canvas::SetBrushTransform(Transform const& transform)
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->SetTransform(transform.ToMatrix()); ctx_->SetTransform(transform.ToMatrix());
} }
void Canvas::SetBrushTransform(Matrix3x2 const& transform) void Canvas::SetBrushTransform(Matrix3x2 const& transform)
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->SetTransform(transform); ctx_->SetTransform(transform);
} }
void Canvas::PushLayerArea(LayerArea& area) void Canvas::PushLayer(Layer& layer)
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->PushLayer(area); ctx_->PushLayer(layer);
} }
void Canvas::PopLayerArea() void Canvas::PopLayer()
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->PopLayer(); ctx_->PopLayer();
} }
void Canvas::PushClipRect(Rect const& clip_rect) void Canvas::PushClipRect(Rect const& clip_rect)
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->PushClipRect(clip_rect); ctx_->PushClipRect(clip_rect);
} }
void Canvas::PopClipRect() void Canvas::PopClipRect()
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->PopClipRect(); ctx_->PopClipRect();
} }
void Canvas::DrawShape(ShapePtr shape) void Canvas::DrawShape(ShapePtr shape)
{ {
if (!shape) KGE_ASSERT(ctx_);
return; if (shape)
{
InitRenderTargetAndBrushs();
ctx_->SetCurrentBrush(stroke_brush_); ctx_->SetCurrentBrush(stroke_brush_);
ctx_->DrawShape(*shape, stroke_width_, stroke_style_); ctx_->DrawShape(*shape, stroke_style_, stroke_width_);
cache_expired_ = true; cache_expired_ = true;
} }
}
void Canvas::DrawLine(Point const& begin, Point const& end) void Canvas::DrawLine(Point const& begin, Point const& end)
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->SetCurrentBrush(stroke_brush_); ctx_->SetCurrentBrush(stroke_brush_);
ctx_->DrawLine(begin, end, stroke_width_, stroke_style_); ctx_->DrawLine(begin, end, stroke_style_, stroke_width_);
cache_expired_ = true; cache_expired_ = true;
} }
void Canvas::DrawCircle(Point const& center, float radius) void Canvas::DrawCircle(Point const& center, float radius)
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->SetCurrentBrush(stroke_brush_); ctx_->SetCurrentBrush(stroke_brush_);
ctx_->DrawEllipse(center, Vec2(radius, radius), stroke_width_, stroke_style_); ctx_->DrawEllipse(center, Vec2(radius, radius), stroke_style_, stroke_width_);
cache_expired_ = true; cache_expired_ = true;
} }
void Canvas::DrawEllipse(Point const& center, Vec2 const& radius) void Canvas::DrawEllipse(Point const& center, Vec2 const& radius)
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->SetCurrentBrush(stroke_brush_); ctx_->SetCurrentBrush(stroke_brush_);
ctx_->DrawEllipse(center, radius, stroke_width_, stroke_style_); ctx_->DrawEllipse(center, radius, stroke_style_, stroke_width_);
cache_expired_ = true; cache_expired_ = true;
} }
void Canvas::DrawRect(Rect const& rect) void Canvas::DrawRect(Rect const& rect)
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->SetCurrentBrush(stroke_brush_); ctx_->SetCurrentBrush(stroke_brush_);
ctx_->DrawRectangle(rect, stroke_width_, stroke_style_); ctx_->DrawRectangle(rect, stroke_style_, stroke_width_);
cache_expired_ = true; cache_expired_ = true;
} }
void Canvas::DrawRoundedRect(Rect const& rect, Vec2 const& radius) void Canvas::DrawRoundedRect(Rect const& rect, Vec2 const& radius)
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->SetCurrentBrush(stroke_brush_); ctx_->SetCurrentBrush(stroke_brush_);
ctx_->DrawRoundedRectangle(rect, radius, stroke_width_, stroke_style_); ctx_->DrawRoundedRectangle(rect, radius, stroke_style_, stroke_width_);
cache_expired_ = true; cache_expired_ = true;
} }
void Canvas::FillShape(ShapePtr shape) void Canvas::FillShape(ShapePtr shape)
{ {
if (!shape) KGE_ASSERT(ctx_);
return; if (shape)
{
InitRenderTargetAndBrushs();
ctx_->SetCurrentBrush(fill_brush_); ctx_->SetCurrentBrush(fill_brush_);
ctx_->FillShape(*shape); ctx_->FillShape(*shape);
cache_expired_ = true; cache_expired_ = true;
} }
}
void Canvas::FillCircle(Point const& center, float radius) void Canvas::FillCircle(Point const& center, float radius)
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->SetCurrentBrush(fill_brush_); ctx_->SetCurrentBrush(fill_brush_);
ctx_->FillEllipse(center, Vec2(radius, radius)); ctx_->FillEllipse(center, Vec2(radius, radius));
cache_expired_ = true; cache_expired_ = true;
@ -185,7 +191,7 @@ void Canvas::FillCircle(Point const& center, float radius)
void Canvas::FillEllipse(Point const& center, Vec2 const& radius) void Canvas::FillEllipse(Point const& center, Vec2 const& radius)
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->SetCurrentBrush(fill_brush_); ctx_->SetCurrentBrush(fill_brush_);
ctx_->FillEllipse(center, radius); ctx_->FillEllipse(center, radius);
cache_expired_ = true; cache_expired_ = true;
@ -193,7 +199,7 @@ void Canvas::FillEllipse(Point const& center, Vec2 const& radius)
void Canvas::FillRect(Rect const& rect) void Canvas::FillRect(Rect const& rect)
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->SetCurrentBrush(fill_brush_); ctx_->SetCurrentBrush(fill_brush_);
ctx_->FillRectangle(rect); ctx_->FillRectangle(rect);
cache_expired_ = true; cache_expired_ = true;
@ -201,7 +207,7 @@ void Canvas::FillRect(Rect const& rect)
void Canvas::FillRoundedRect(Rect const& rect, Vec2 const& radius) void Canvas::FillRoundedRect(Rect const& rect, Vec2 const& radius)
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->SetCurrentBrush(fill_brush_); ctx_->SetCurrentBrush(fill_brush_);
ctx_->FillRoundedRectangle(rect, radius); ctx_->FillRoundedRectangle(rect, radius);
cache_expired_ = true; cache_expired_ = true;
@ -209,9 +215,9 @@ void Canvas::FillRoundedRect(Rect const& rect, Vec2 const& radius)
void Canvas::DrawTexture(TexturePtr texture, const Rect* src_rect, const Rect* dest_rect) void Canvas::DrawTexture(TexturePtr texture, const Rect* src_rect, const Rect* dest_rect)
{ {
KGE_ASSERT(ctx_);
if (texture) if (texture)
{ {
InitRenderTargetAndBrushs();
ctx_->DrawTexture(*texture, src_rect, dest_rect); ctx_->DrawTexture(*texture, src_rect, dest_rect);
cache_expired_ = true; cache_expired_ = true;
} }
@ -230,7 +236,7 @@ void Canvas::DrawTextLayout(String const& text, Point const& point)
void Canvas::DrawTextLayout(TextLayout const& layout, Point const& point) void Canvas::DrawTextLayout(TextLayout const& layout, Point const& point)
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->DrawTextLayout(layout, point); ctx_->DrawTextLayout(layout, point);
} }
@ -266,15 +272,15 @@ void Canvas::AddArc(Point const& point, Size const& radius, float rotation, bool
void Canvas::StrokePath() void Canvas::StrokePath()
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->SetCurrentBrush(stroke_brush_); ctx_->SetCurrentBrush(stroke_brush_);
ctx_->DrawShape(*shape_sink_.GetShape(), stroke_width_, stroke_style_); ctx_->DrawShape(*shape_sink_.GetShape(), stroke_style_, stroke_width_);
cache_expired_ = true; cache_expired_ = true;
} }
void Canvas::FillPath() void Canvas::FillPath()
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->SetCurrentBrush(fill_brush_); ctx_->SetCurrentBrush(fill_brush_);
ctx_->FillShape(*shape_sink_.GetShape()); ctx_->FillShape(*shape_sink_.GetShape());
cache_expired_ = true; cache_expired_ = true;
@ -282,44 +288,29 @@ void Canvas::FillPath()
void Canvas::Clear() void Canvas::Clear()
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->Clear(); ctx_->Clear();
cache_expired_ = true; cache_expired_ = true;
} }
void Canvas::Clear(Color const& clear_color) void Canvas::Clear(Color const& clear_color)
{ {
InitRenderTargetAndBrushs(); KGE_ASSERT(ctx_);
ctx_->Clear(clear_color); ctx_->Clear(clear_color);
cache_expired_ = true; cache_expired_ = true;
} }
void Canvas::ResizeAndClear(Size size)
{
ctx_ = TextureRenderContext::Create(size);
}
TexturePtr Canvas::ExportToTexture() const TexturePtr Canvas::ExportToTexture() const
{ {
UpdateCache(); UpdateCache();
return texture_cached_; return texture_cached_;
} }
void Canvas::InitRenderTargetAndBrushs()
{
if (!ctx_)
{
Renderer::Instance().CreateTextureRenderTarget(ctx_);
}
if (!stroke_brush_)
{
stroke_brush_ = new Brush;
stroke_brush_->SetColor(Color::White);
}
if (!fill_brush_)
{
fill_brush_ = new Brush;
fill_brush_->SetColor(Color::White);
}
}
void Canvas::UpdateCache() const void Canvas::UpdateCache() const
{ {
if (cache_expired_ && ctx_) if (cache_expired_ && ctx_)

View File

@ -21,7 +21,7 @@
#pragma once #pragma once
#include <kiwano/2d/Actor.h> #include <kiwano/2d/Actor.h>
#include <kiwano/render/ShapeSink.h> #include <kiwano/render/ShapeSink.h>
#include <kiwano/render/RenderContext.h> #include <kiwano/render/TextureRenderContext.h>
namespace kiwano namespace kiwano
{ {
@ -35,251 +35,251 @@ KGE_DECLARE_SMART_PTR(Canvas);
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @details
*/ */
class KGE_API Canvas : public Actor class KGE_API Canvas : public Actor
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 创建画布 /// @brief 创建画布
static CanvasPtr Create(); /// @param size 画布大小
static CanvasPtr Create(Size const& size);
/// \~chinese /// \~chinese
/// @brief 构建空画布 /// @brief 开始绘图
Canvas();
virtual ~Canvas();
/// \~chinese
/// @brief 开始绘图
void BeginDraw(); void BeginDraw();
/// \~chinese /// \~chinese
/// @brief 结束绘图 /// @brief 结束绘图
void EndDraw(); void EndDraw();
/// \~chinese /// \~chinese
/// @brief 画形状轮廓 /// @brief 画形状轮廓
/// @param shape 形状 /// @param shape 形状
void DrawShape(ShapePtr shape); void DrawShape(ShapePtr shape);
/// \~chinese /// \~chinese
/// @brief 画线段 /// @brief 画线段
/// @param begin 线段起点 /// @param begin 线段起点
/// @param end 线段终点 /// @param end 线段终点
void DrawLine(Point const& begin, Point const& end); void DrawLine(Point const& begin, Point const& end);
/// \~chinese /// \~chinese
/// @brief 画圆形边框 /// @brief 画圆形边框
/// @param center 圆形原点 /// @param center 圆形原点
/// @param radius 圆形半径 /// @param radius 圆形半径
void DrawCircle(Point const& center, float radius); void DrawCircle(Point const& center, float radius);
/// \~chinese /// \~chinese
/// @brief 画椭圆形边框 /// @brief 画椭圆形边框
/// @param center 椭圆原点 /// @param center 椭圆原点
/// @param radius 椭圆半径 /// @param radius 椭圆半径
void DrawEllipse(Point const& center, Vec2 const& radius); void DrawEllipse(Point const& center, Vec2 const& radius);
/// \~chinese /// \~chinese
/// @brief 画矩形边框 /// @brief 画矩形边框
/// @param rect 矩形 /// @param rect 矩形
void DrawRect(Rect const& rect); void DrawRect(Rect const& rect);
/// \~chinese /// \~chinese
/// @brief 画圆角矩形边框 /// @brief 画圆角矩形边框
/// @param rect 矩形 /// @param rect 矩形
/// @param radius 矩形圆角半径 /// @param radius 矩形圆角半径
void DrawRoundedRect(Rect const& rect, Vec2 const& radius); void DrawRoundedRect(Rect const& rect, Vec2 const& radius);
/// \~chinese /// \~chinese
/// @brief 填充形状 /// @brief 填充形状
/// @param shape 形状 /// @param shape 形状
void FillShape(ShapePtr shape); void FillShape(ShapePtr shape);
/// \~chinese /// \~chinese
/// @brief 填充圆形 /// @brief 填充圆形
/// @param center 圆形原点 /// @param center 圆形原点
/// @param radius 圆形半径 /// @param radius 圆形半径
void FillCircle(Point const& center, float radius); void FillCircle(Point const& center, float radius);
/// \~chinese /// \~chinese
/// @brief 填充椭圆形 /// @brief 填充椭圆形
/// @param center 椭圆原点 /// @param center 椭圆原点
/// @param radius 椭圆半径 /// @param radius 椭圆半径
void FillEllipse(Point const& center, Vec2 const& radius); void FillEllipse(Point const& center, Vec2 const& radius);
/// \~chinese /// \~chinese
/// @brief 填充矩形 /// @brief 填充矩形
/// @param rect 矩形 /// @param rect 矩形
void FillRect(Rect const& rect); void FillRect(Rect const& rect);
/// \~chinese /// \~chinese
/// @brief 填充圆角矩形 /// @brief 填充圆角矩形
/// @param rect 矩形 /// @param rect 矩形
/// @param radius 矩形圆角半径 /// @param radius 矩形圆角半径
void FillRoundedRect(Rect const& rect, Vec2 const& radius); void FillRoundedRect(Rect const& rect, Vec2 const& radius);
/// \~chinese /// \~chinese
/// @brief 绘制纹理 /// @brief 绘制纹理
/// @param texture 纹理 /// @param texture 纹理
/// @param src_rect 纹理裁剪区域 /// @param src_rect 纹理裁剪区域
/// @param dest_rect 绘制目标区域 /// @param dest_rect 绘制目标区域
void DrawTexture(TexturePtr texture, const Rect* src_rect = nullptr, const Rect* dest_rect = nullptr); void DrawTexture(TexturePtr texture, const Rect* src_rect = nullptr, const Rect* dest_rect = nullptr);
/// \~chinese /// \~chinese
/// @brief 绘制文字布局 /// @brief 绘制文字布局
/// @param text 文字 /// @param text 文字
/// @param point 绘制文字的位置 /// @param point 绘制文字的位置
void DrawTextLayout(String const& text, Point const& point); void DrawTextLayout(String const& text, Point const& point);
/// \~chinese /// \~chinese
/// @brief 绘制文字布局 /// @brief 绘制文字布局
/// @param layout 文字布局 /// @param layout 文字布局
/// @param point 绘制布局的位置 /// @param point 绘制布局的位置
void DrawTextLayout(TextLayout const& layout, Point const& point); void DrawTextLayout(TextLayout const& layout, Point const& point);
/// \~chinese /// \~chinese
/// @brief 开始绘制路径 /// @brief 开始绘制路径
/// @param begin_pos 路径起始点 /// @param begin_pos 路径起始点
void BeginPath(Point const& begin_pos); void BeginPath(Point const& begin_pos);
/// \~chinese /// \~chinese
/// @brief 结束路径 /// @brief 结束路径
/// @param closed 路径是否闭合 /// @param closed 路径是否闭合
void EndPath(bool closed = false); void EndPath(bool closed = false);
/// \~chinese /// \~chinese
/// @brief 添加一条线段 /// @brief 添加一条线段
/// @param point 端点 /// @param point 端点
void AddLine(Point const& point); void AddLine(Point const& point);
/// \~chinese /// \~chinese
/// @brief 添加多条线段 /// @brief 添加多条线段
/// @param points 端点集合 /// @param points 端点集合
void AddLines(Vector<Point> const& points); void AddLines(Vector<Point> const& points);
/// \~chinese /// \~chinese
/// @brief 添加一条三次方贝塞尔曲线 /// @brief 添加一条三次方贝塞尔曲线
/// @param point1 贝塞尔曲线的第一个控制点 /// @param point1 贝塞尔曲线的第一个控制点
/// @param point2 贝塞尔曲线的第二个控制点 /// @param point2 贝塞尔曲线的第二个控制点
/// @param point3 贝塞尔曲线的终点 /// @param point3 贝塞尔曲线的终点
void AddBezier(Point const& point1, Point const& point2, Point const& point3); void AddBezier(Point const& point1, Point const& point2, Point const& point3);
/// \~chinese /// \~chinese
/// @brief 添加弧线 /// @brief 添加弧线
/// @param point 终点 /// @param point 终点
/// @param radius 椭圆半径 /// @param radius 椭圆半径
/// @param rotation 椭圆旋转角度 /// @param rotation 椭圆旋转角度
/// @param clockwise 顺时针 or 逆时针 /// @param clockwise 顺时针 or 逆时针
/// @param is_small 是否取小于 180° 的弧 /// @param is_small 是否取小于 180° 的弧
void AddArc(Point const& point, Size const& radius, float rotation, bool clockwise = true, bool is_small = true); void AddArc(Point const& point, Size const& radius, float rotation, bool clockwise = true, bool is_small = true);
/// \~chinese /// \~chinese
/// @brief 以描边的方式绘制路径 /// @brief 以描边的方式绘制路径
void StrokePath(); void StrokePath();
/// \~chinese /// \~chinese
/// @brief 以填充的方式绘制路径 /// @brief 以填充的方式绘制路径
void FillPath(); void FillPath();
/// \~chinese /// \~chinese
/// @brief 清空画布 /// @brief 清空画布
void Clear(); void Clear();
/// \~chinese /// \~chinese
/// @brief 清空画布 /// @brief 清空画布
/// @param clear_color 清空颜色 /// @param clear_color 清空颜色
void Clear(Color const& clear_color); void Clear(Color const& clear_color);
/// \~chinese /// \~chinese
/// @brief 设置填充颜色 /// @brief 设置填充颜色
/// @param color 填充颜色 /// @param color 填充颜色
void SetFillColor(Color const& color); void SetFillColor(Color const& color);
/// \~chinese /// \~chinese
/// @brief 设置填充画刷 /// @brief 设置填充画刷
/// @param[in] brush 填充画刷 /// @param[in] brush 填充画刷
void SetFillBrush(BrushPtr brush); void SetFillBrush(BrushPtr brush);
/// \~chinese /// \~chinese
/// @brief 设置轮廓颜色 /// @brief 设置轮廓颜色
/// @param color 轮廓颜色 /// @param color 轮廓颜色
void SetStrokeColor(Color const& color); void SetStrokeColor(Color const& color);
/// \~chinese /// \~chinese
/// @brief 设置轮廓画刷 /// @brief 设置轮廓画刷
/// @param[in] brush 轮廓画刷 /// @param[in] brush 轮廓画刷
void SetStrokeBrush(BrushPtr brush); void SetStrokeBrush(BrushPtr brush);
/// \~chinese /// \~chinese
/// @brief 设置轮廓宽度 /// @brief 设置轮廓宽度
/// @param width 轮廓宽度 /// @param width 轮廓宽度
void SetStrokeWidth(float width); void SetStrokeWidth(float width);
/// \~chinese /// \~chinese
/// @brief 设置轮廓样式 /// @brief 设置轮廓样式
/// @param stroke_style 轮廓样式 /// @param stroke_style 轮廓样式
void SetStrokeStyle(StrokeStylePtr stroke_style); void SetStrokeStyle(StrokeStylePtr stroke_style);
/// \~chinese /// \~chinese
/// @brief 设置文字画刷样式 /// @brief 设置文字画刷样式
/// @param text_style 文字画刷样式 /// @param text_style 文字画刷样式
void SetTextStyle(TextStyle const& text_style); void SetTextStyle(TextStyle const& text_style);
/// \~chinese /// \~chinese
/// @brief 设置画刷 /// @brief 设置画刷
/// @param[in] brush 画刷 /// @param[in] brush 画刷
void SetBrush(BrushPtr brush); void SetBrush(BrushPtr brush);
/// \~chinese /// \~chinese
/// @brief 设置画刷二维变换 /// @brief 设置画刷二维变换
/// @param transform 二维变换 /// @param transform 二维变换
void SetBrushTransform(Transform const& transform); void SetBrushTransform(Transform const& transform);
/// \~chinese /// \~chinese
/// @brief 设置画刷二维变换矩阵 /// @brief 设置画刷二维变换矩阵
/// @param transform 二维变换矩阵 /// @param transform 二维变换矩阵
void SetBrushTransform(Matrix3x2 const& transform); void SetBrushTransform(Matrix3x2 const& transform);
/// \~chinese /// \~chinese
/// @brief 添加一个图层 /// @brief 添加一个图层
/// @param area 图层区域 /// @param layer 图层
void PushLayerArea(LayerArea& area); void PushLayer(Layer& layer);
/// \~chinese /// \~chinese
/// @brief 删除最近添加的图层 /// @brief 删除最近添加的图层
void PopLayerArea(); void PopLayer();
/// \~chinese /// \~chinese
/// @brief 添加一个裁剪区域 /// @brief 添加一个裁剪区域
/// @param clip_rect 裁剪矩形 /// @param clip_rect 裁剪矩形
void PushClipRect(Rect const& clip_rect); void PushClipRect(Rect const& clip_rect);
/// \~chinese /// \~chinese
/// @brief 删除最近添加的裁剪区域 /// @brief 删除最近添加的裁剪区域
void PopClipRect(); void PopClipRect();
/// \~chinese /// \~chinese
/// @brief 获取轮廓宽度 /// @brief 获取轮廓宽度
float GetStrokeWidth() const; float GetStrokeWidth() const;
/// \~chinese /// \~chinese
/// @brief 获取填充画刷 /// @brief 获取填充画刷
BrushPtr GetFillBrush() const; BrushPtr GetFillBrush() const;
/// \~chinese /// \~chinese
/// @brief 获取轮廓画刷 /// @brief 获取轮廓画刷
BrushPtr GetStrokeBrush() const; BrushPtr GetStrokeBrush() const;
/// \~chinese /// \~chinese
/// @brief 导出纹理 /// @brief 清空画布大小并重设画布大小
void ResizeAndClear(Size size);
/// \~chinese
/// @brief 导出纹理
TexturePtr ExportToTexture() const; TexturePtr ExportToTexture() const;
void OnRender(RenderContext& ctx) override; void OnRender(RenderContext& ctx) override;
private: private:
void InitRenderTargetAndBrushs(); Canvas();
void UpdateCache() const; void UpdateCache() const;
@ -298,6 +298,11 @@ private:
/** @} */ /** @} */
inline float Canvas::GetStrokeWidth() const
{
return stroke_width_;
}
inline void Canvas::SetStrokeWidth(float width) inline void Canvas::SetStrokeWidth(float width)
{ {
stroke_width_ = std::max(width, 0.f); stroke_width_ = std::max(width, 0.f);
@ -315,13 +320,19 @@ inline void Canvas::SetTextStyle(TextStyle const& text_style)
inline void Canvas::SetStrokeColor(Color const& color) inline void Canvas::SetStrokeColor(Color const& color)
{ {
InitRenderTargetAndBrushs(); if (!stroke_brush_)
{
stroke_brush_ = new Brush;
}
stroke_brush_->SetColor(color); stroke_brush_->SetColor(color);
} }
inline void Canvas::SetFillColor(Color const& color) inline void Canvas::SetFillColor(Color const& color)
{ {
InitRenderTargetAndBrushs(); if (!fill_brush_)
{
fill_brush_ = new Brush;
}
fill_brush_->SetColor(color); fill_brush_->SetColor(color);
} }
@ -344,4 +355,5 @@ inline BrushPtr Canvas::GetStrokeBrush() const
{ {
return stroke_brush_; return stroke_brush_;
} }
} // namespace kiwano } // namespace kiwano

View File

@ -34,7 +34,7 @@ class comma_numpunct : public std::numpunct<wchar_t>
private: private:
virtual wchar_t do_thousands_sep() const override virtual wchar_t do_thousands_sep() const override
{ {
return L','; return ',';
} }
virtual std::string do_grouping() const override virtual std::string do_grouping() const override
@ -46,7 +46,7 @@ private:
DebugActor::DebugActor() DebugActor::DebugActor()
{ {
SetName(L"kiwano-debug-actor"); SetName("kiwano-debug-actor");
SetPosition(Point{ 10, 10 }); SetPosition(Point{ 10, 10 });
SetResponsible(true); SetResponsible(true);
SetCascadeOpacityEnabled(true); SetCascadeOpacityEnabled(true);
@ -60,7 +60,7 @@ DebugActor::DebugActor()
fill_brush->SetColor(Color::White); fill_brush->SetColor(Color::White);
TextStyle style; TextStyle style;
style.font_family = L"Arial"; style.font_family = "Arial";
style.font_size = 16.f; style.font_size = 16.f;
style.font_weight = FontWeight::Normal; style.font_weight = FontWeight::Normal;
style.line_spacing = 20.f; style.line_spacing = 20.f;
@ -78,17 +78,17 @@ void DebugActor::OnRender(RenderContext& ctx)
ctx.SetCurrentBrush(background_brush_); ctx.SetCurrentBrush(background_brush_);
ctx.FillRoundedRectangle(GetBounds(), Vec2{ 5.f, 5.f }); ctx.FillRoundedRectangle(GetBounds(), Vec2{ 5.f, 5.f });
ctx.DrawTextLayout(debug_text_, Point(10, 10)); ctx.DrawTextLayout(debug_text_, Point(10, 10));
}
void DebugActor::OnUpdate(Duration dt)
{
KGE_NOT_USED(dt);
frame_time_.push_back(Time::Now()); frame_time_.push_back(Time::Now());
while (frame_time_.back() - frame_time_.front() >= Duration::Second) while (frame_time_.back() - frame_time_.front() >= Duration::Second)
{ {
frame_time_.erase(frame_time_.begin()); frame_time_.erase(frame_time_.begin());
} }
}
void DebugActor::OnUpdate(Duration dt)
{
KGE_NOT_USED(dt);
StringStream ss; StringStream ss;
@ -104,7 +104,7 @@ void DebugActor::OnUpdate(Duration dt)
} }
#endif #endif
const auto& status = Renderer::Instance().GetContext().GetStatus(); const auto& status = Renderer::GetInstance().GetContext().GetStatus();
ss << "Render: " << status.duration.Milliseconds() << "ms" << std::endl; ss << "Render: " << status.duration.Milliseconds() << "ms" << std::endl;

View File

@ -31,7 +31,7 @@ namespace kiwano
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API DebugActor : public Actor class KGE_API DebugActor : public Actor
{ {
@ -51,7 +51,7 @@ private:
std::locale comma_locale_; std::locale comma_locale_;
BrushPtr background_brush_; BrushPtr background_brush_;
TextLayout debug_text_; TextLayout debug_text_;
Vector<Time> frame_time_; List<Time> frame_time_;
}; };
/** @} */ /** @} */

View File

@ -60,7 +60,7 @@ Frame::Frame() {}
bool Frame::Load(String const& file_path) bool Frame::Load(String const& file_path)
{ {
TexturePtr texture = TextureCache::Instance().AddOrGetTexture(file_path); TexturePtr texture = TextureCache::GetInstance().AddOrGetTexture(file_path);
if (texture->IsValid()) if (texture->IsValid())
{ {
SetTexture(texture); SetTexture(texture);
@ -71,7 +71,7 @@ bool Frame::Load(String const& file_path)
bool Frame::Load(Resource const& res) bool Frame::Load(Resource const& res)
{ {
TexturePtr texture = TextureCache::Instance().AddOrGetTexture(res); TexturePtr texture = TextureCache::GetInstance().AddOrGetTexture(res);
if (texture->IsValid()) if (texture->IsValid())
{ {
SetTexture(texture); SetTexture(texture);

View File

@ -28,76 +28,76 @@ KGE_DECLARE_SMART_PTR(Frame);
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API Frame : public virtual ObjectBase class KGE_API Frame : public virtual ObjectBase
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 创建图像帧 /// @brief 创建图像帧
/// @param file_path 图像路径 /// @param file_path 图像路径
static FramePtr Create(String const& file_path); static FramePtr Create(String const& file_path);
/// \~chinese /// \~chinese
/// @brief 创建图像帧 /// @brief 创建图像帧
/// @param res 图像资源 /// @param res 图像资源
static FramePtr Create(Resource const& res); static FramePtr Create(Resource const& res);
/// \~chinese /// \~chinese
/// @brief 创建图像帧 /// @brief 创建图像帧
/// @param texture 纹理 /// @param texture 纹理
static FramePtr Create(TexturePtr texture); static FramePtr Create(TexturePtr texture);
/// \~chinese /// \~chinese
/// @brief 构建空图像帧 /// @brief 构建空图像帧
Frame(); Frame();
/// \~chinese /// \~chinese
/// @brief 加载图像 /// @brief 加载图像
/// @param file_path 图像路径 /// @param file_path 图像路径
bool Load(String const& file_path); bool Load(String const& file_path);
/// \~chinese /// \~chinese
/// @brief 加载图像 /// @brief 加载图像
/// @param res 图像资源 /// @param res 图像资源
bool Load(Resource const& res); bool Load(Resource const& res);
/// \~chinese /// \~chinese
/// @brief 裁剪图像帧为矩形 /// @brief 裁剪图像帧为矩形
/// @param crop_rect 裁剪矩形定义 /// @param crop_rect 裁剪矩形定义
void SetCropRect(Rect const& crop_rect); void SetCropRect(Rect const& crop_rect);
/// \~chinese /// \~chinese
/// @brief 设置纹理 /// @brief 设置纹理
/// @param texture 纹理 /// @param texture 纹理
void SetTexture(TexturePtr texture); void SetTexture(TexturePtr texture);
/// \~chinese /// \~chinese
/// @brief 是否有效 /// @brief 是否有效
bool IsValid() const; bool IsValid() const;
/// \~chinese /// \~chinese
/// @brief 获取宽度 /// @brief 获取宽度
float GetWidth() const; float GetWidth() const;
/// \~chinese /// \~chinese
/// @brief 获取高度 /// @brief 获取高度
float GetHeight() const; float GetHeight() const;
/// \~chinese /// \~chinese
/// @brief 获取大小 /// @brief 获取大小
Size GetSize() const; Size GetSize() const;
/// \~chinese /// \~chinese
/// @brief 获取裁剪位置 /// @brief 获取裁剪位置
Point GetCropPoint() const; Point GetCropPoint() const;
/// \~chinese /// \~chinese
/// @brief 获取裁剪矩形 /// @brief 获取裁剪矩形
Rect const& GetCropRect() const; Rect const& GetCropRect() const;
/// \~chinese /// \~chinese
/// @brief 获取纹理 /// @brief 获取纹理
TexturePtr GetTexture() const; TexturePtr GetTexture() const;
private: private:

View File

@ -29,51 +29,51 @@ KGE_DECLARE_SMART_PTR(FrameSequence);
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API FrameSequence : public virtual ObjectBase class KGE_API FrameSequence : public virtual ObjectBase
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 创建序列帧 /// @brief 创建序列帧
/// @param frames 图像帧集合 /// @param frames 图像帧集合
static FrameSequencePtr Create(Vector<FramePtr> const& frames); static FrameSequencePtr Create(Vector<FramePtr> const& frames);
/// \~chinese /// \~chinese
/// @brief 构建空序列帧 /// @brief 构建空序列帧
FrameSequence(); FrameSequence();
virtual ~FrameSequence(); virtual ~FrameSequence();
/// \~chinese /// \~chinese
/// @brief 添加关键帧 /// @brief 添加关键帧
/// @param frame 图像帧 /// @param frame 图像帧
void AddFrame(FramePtr frame); void AddFrame(FramePtr frame);
/// \~chinese /// \~chinese
/// @brief 添加多个关键帧 /// @brief 添加多个关键帧
/// @param frames 图像帧集合 /// @param frames 图像帧集合
void AddFrames(Vector<FramePtr> const& frames); void AddFrames(Vector<FramePtr> const& frames);
/// \~chinese /// \~chinese
/// @brief 获取关键帧 /// @brief 获取关键帧
/// @param index 图像帧下标 /// @param index 图像帧下标
FramePtr GetFrame(size_t index) const; FramePtr GetFrame(size_t index) const;
/// \~chinese /// \~chinese
/// @brief 获取所有关键帧 /// @brief 获取所有关键帧
Vector<FramePtr> const& GetFrames() const; Vector<FramePtr> const& GetFrames() const;
/// \~chinese /// \~chinese
/// @brief 获取关键帧数量 /// @brief 获取关键帧数量
size_t GetFramesCount() const; size_t GetFramesCount() const;
/// \~chinese /// \~chinese
/// @brief 获取序列帧的拷贝对象 /// @brief 获取序列帧的拷贝对象
FrameSequencePtr Clone() const; FrameSequencePtr Clone() const;
/// \~chinese /// \~chinese
/// @brief 获取序列帧的倒转 /// @brief 获取序列帧的倒转
FrameSequencePtr Reverse() const; FrameSequencePtr Reverse() const;
private: private:

View File

@ -67,13 +67,13 @@ GifSprite::GifSprite()
bool GifSprite::Load(String const& file_path) bool GifSprite::Load(String const& file_path)
{ {
GifImagePtr image = TextureCache::Instance().AddOrGetGifImage(file_path); GifImagePtr image = TextureCache::GetInstance().AddOrGetGifImage(file_path);
return Load(image); return Load(image);
} }
bool GifSprite::Load(Resource const& res) bool GifSprite::Load(Resource const& res)
{ {
GifImagePtr image = TextureCache::Instance().AddOrGetGifImage(res); GifImagePtr image = TextureCache::GetInstance().AddOrGetGifImage(res);
return Load(image); return Load(image);
} }
@ -85,15 +85,16 @@ bool GifSprite::Load(GifImagePtr gif)
next_index_ = 0; next_index_ = 0;
loop_count_ = 0; loop_count_ = 0;
frame_.disposal_type = GifImage::DisposalType::None; frame_ = GifImage::Frame();
SetSize(Size{ static_cast<float>(gif_->GetWidthInPixels()), static_cast<float>(gif_->GetHeightInPixels()) });
if (!frame_rt_) if (!frame_rt_)
{ {
Renderer::Instance().CreateTextureRenderTarget(frame_rt_); Size frame_size = Size(float(gif_->GetWidthInPixels()), float(gif_->GetHeightInPixels()));
frame_rt_ = TextureRenderContext::Create(frame_size);
} }
SetSize(frame_rt_->GetSize());
if (gif_->GetFramesCount() > 0) if (gif_->GetFramesCount() > 0)
{ {
ComposeNextFrame(); ComposeNextFrame();
@ -109,7 +110,7 @@ void GifSprite::OnRender(RenderContext& ctx)
{ {
PrepareToRender(ctx); PrepareToRender(ctx);
ctx.DrawTexture(*frame_to_render_, &frame_.rect, nullptr); ctx.DrawTexture(*frame_to_render_, nullptr, &GetBounds());
} }
} }
@ -140,7 +141,7 @@ void GifSprite::RestartAnimation()
animating_ = true; animating_ = true;
next_index_ = 0; next_index_ = 0;
loop_count_ = 0; loop_count_ = 0;
frame_.disposal_type = GifImage::DisposalType::None; frame_ = GifImage::Frame();
} }
void GifSprite::ComposeNextFrame() void GifSprite::ComposeNextFrame()
@ -181,7 +182,7 @@ void GifSprite::DisposeCurrentFrame()
void GifSprite::OverlayNextFrame() void GifSprite::OverlayNextFrame()
{ {
KGE_ASSERT(frame_rt_); KGE_ASSERT(frame_rt_);
KGE_ASSERT(gif_ && gif_->IsValid()); KGE_ASSERT(gif_);
frame_ = gif_->GetFrame(next_index_); frame_ = gif_->GetFrame(next_index_);
@ -196,6 +197,7 @@ void GifSprite::OverlayNextFrame()
if (next_index_ == 0) if (next_index_ == 0)
{ {
frame_rt_->Clear();
loop_count_++; loop_count_++;
} }
@ -217,6 +219,7 @@ void GifSprite::OverlayNextFrame()
} }
} }
// Execute callback
if (IsLastFrame() && loop_cb_) if (IsLastFrame() && loop_cb_)
{ {
loop_cb_(loop_count_ - 1); loop_cb_(loop_count_ - 1);
@ -239,8 +242,7 @@ void GifSprite::SaveComposedFrame()
if (!saved_frame_) if (!saved_frame_)
{ {
saved_frame_ = new Texture; saved_frame_ = new Texture;
frame_rt_->CreateTexture(*saved_frame_, frame_to_be_saved->GetSizeInPixels(), frame_rt_->CreateTexture(*saved_frame_, frame_to_be_saved->GetSizeInPixels());
frame_to_be_saved->GetPixelFormat());
} }
saved_frame_->CopyFrom(frame_to_be_saved); saved_frame_->CopyFrom(frame_to_be_saved);

View File

@ -22,7 +22,7 @@
#include <kiwano/2d/Actor.h> #include <kiwano/2d/Actor.h>
#include <kiwano/core/Resource.h> #include <kiwano/core/Resource.h>
#include <kiwano/render/GifImage.h> #include <kiwano/render/GifImage.h>
#include <kiwano/render/RenderContext.h> #include <kiwano/render/TextureRenderContext.h>
namespace kiwano namespace kiwano
{ {
@ -35,81 +35,81 @@ KGE_DECLARE_SMART_PTR(GifSprite);
/** /**
* \~chinese * \~chinese
* @brief GIF * @brief GIF
*/ */
class KGE_API GifSprite : public Actor class KGE_API GifSprite : public Actor
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief GIF播放循环结束回调 /// @brief GIF播放循环结束回调
using LoopDoneCallback = Function<void(int /* times */)>; using LoopDoneCallback = Function<void(int /* times */)>;
/// \~chinese /// \~chinese
/// @brief GIF播放结束回调 /// @brief GIF播放结束回调
using DoneCallback = Function<void()>; using DoneCallback = Function<void()>;
/// \~chinese /// \~chinese
/// @brief 创建GIF精灵 /// @brief 创建GIF精灵
/// @param file_path GIF图片路径 /// @param file_path GIF图片路径
static GifSpritePtr Create(String const& file_path); static GifSpritePtr Create(String const& file_path);
/// \~chinese /// \~chinese
/// @brief 创建GIF精灵 /// @brief 创建GIF精灵
/// @param res GIF图片资源 /// @param res GIF图片资源
static GifSpritePtr Create(Resource const& res); static GifSpritePtr Create(Resource const& res);
/// \~chinese /// \~chinese
/// @brief 创建GIF精灵 /// @brief 创建GIF精灵
/// @param gif GIF图片 /// @param gif GIF图片
static GifSpritePtr Create(GifImagePtr gif); static GifSpritePtr Create(GifImagePtr gif);
GifSprite(); GifSprite();
/// \~chinese /// \~chinese
/// @brief 加载GIF图片 /// @brief 加载GIF图片
/// @param file_path GIF图片路径 /// @param file_path GIF图片路径
bool Load(String const& file_path); bool Load(String const& file_path);
/// \~chinese /// \~chinese
/// @brief 加载GIF图片 /// @brief 加载GIF图片
/// @param res GIF图片资源 /// @param res GIF图片资源
bool Load(Resource const& res); bool Load(Resource const& res);
/// \~chinese /// \~chinese
/// @brief 加载GIF图片 /// @brief 加载GIF图片
/// @param gif GIF图片 /// @param gif GIF图片
bool Load(GifImagePtr gif); bool Load(GifImagePtr gif);
/// \~chinese /// \~chinese
/// @brief 设置 GIF 动画循环次数 /// @brief 设置 GIF 动画循环次数
void SetLoopCount(int loops); void SetLoopCount(int loops);
/// \~chinese /// \~chinese
/// @brief 设置 GIF 动画每次循环结束回调函数 /// @brief 设置 GIF 动画每次循环结束回调函数
void SetLoopDoneCallback(LoopDoneCallback const& cb); void SetLoopDoneCallback(LoopDoneCallback const& cb);
/// \~chinese /// \~chinese
/// @brief 设置 GIF 动画结束回调函数 /// @brief 设置 GIF 动画结束回调函数
void SetDoneCallback(DoneCallback const& cb); void SetDoneCallback(DoneCallback const& cb);
/// \~chinese /// \~chinese
/// @brief 设置 GIF 图像 /// @brief 设置 GIF 图像
void SetGifImage(GifImagePtr gif); void SetGifImage(GifImagePtr gif);
/// \~chinese /// \~chinese
/// @brief 重新播放 GIF 动画 /// @brief 重新播放 GIF 动画
void RestartAnimation(); void RestartAnimation();
/// \~chinese /// \~chinese
/// @brief 获取 GIF 动画循环结束回调 /// @brief 获取 GIF 动画循环结束回调
LoopDoneCallback GetLoopDoneCallback() const; LoopDoneCallback GetLoopDoneCallback() const;
/// \~chinese /// \~chinese
/// @brief 获取 GIF 动画播放结束回调 /// @brief 获取 GIF 动画播放结束回调
DoneCallback GetDoneCallback() const; DoneCallback GetDoneCallback() const;
/// \~chinese /// \~chinese
/// @brief 获取 GIF 图片 /// @brief 获取 GIF 图片
GifImagePtr GetGifImage() const; GifImagePtr GetGifImage() const;
void OnRender(RenderContext& ctx) override; void OnRender(RenderContext& ctx) override;
@ -118,35 +118,35 @@ private:
void Update(Duration dt) override; void Update(Duration dt) override;
/// \~chinese /// \~chinese
/// @brief 是否是最后一帧 /// @brief 是否是最后一帧
bool IsLastFrame() const; bool IsLastFrame() const;
/// \~chinese /// \~chinese
/// @brief 动画是否已结束 /// @brief 动画是否已结束
bool EndOfAnimation() const; bool EndOfAnimation() const;
/// \~chinese /// \~chinese
/// @brief 合成下一帧 /// @brief 合成下一帧
void ComposeNextFrame(); void ComposeNextFrame();
/// \~chinese /// \~chinese
/// @brief 解析当前图像帧 /// @brief 解析当前图像帧
void DisposeCurrentFrame(); void DisposeCurrentFrame();
/// \~chinese /// \~chinese
/// @brief 覆盖下一帧 /// @brief 覆盖下一帧
void OverlayNextFrame(); void OverlayNextFrame();
/// \~chinese /// \~chinese
/// @brief 保存合成后的图像帧 /// @brief 保存合成后的图像帧
void SaveComposedFrame(); void SaveComposedFrame();
/// \~chinese /// \~chinese
/// @brief 恢复已保存的图像帧 /// @brief 恢复已保存的图像帧
void RestoreSavedFrame(); void RestoreSavedFrame();
/// \~chinese /// \~chinese
/// @brief 清空当前图像区域 /// @brief 清空当前图像区域
void ClearCurrentFrameArea(); void ClearCurrentFrameArea();
private: private:

View File

@ -19,47 +19,47 @@
// THE SOFTWARE. // THE SOFTWARE.
#pragma once #pragma once
#include <kiwano/2d/Layer.h> #include <kiwano/2d/LayerActor.h>
#include <kiwano/render/Renderer.h> #include <kiwano/render/Renderer.h>
namespace kiwano namespace kiwano
{ {
LayerPtr Layer::Create() LayerActorPtr LayerActor::Create()
{ {
LayerPtr ptr = new (std::nothrow) Layer; LayerActorPtr ptr = new (std::nothrow) LayerActor;
return ptr; return ptr;
} }
Layer::Layer() LayerActor::LayerActor()
: swallow_(false) : swallow_(false)
{ {
} }
Layer::~Layer() {} LayerActor::~LayerActor() {}
void Layer::SetClipRect(Rect const& clip_rect) void LayerActor::SetClipRect(Rect const& clip_rect)
{ {
area_.SetAreaRect(clip_rect); layer_.SetClipRect(clip_rect);
} }
void Layer::SetOpacity(float opacity) void LayerActor::SetOpacity(float opacity)
{ {
// Actor::SetOpacity(opacity); // Actor::SetOpacity(opacity);
area_.SetOpacity(opacity); layer_.SetOpacity(opacity);
} }
void Layer::SetMaskShape(ShapePtr mask) void LayerActor::SetMaskShape(ShapePtr mask)
{ {
area_.SetMaskShape(mask); layer_.SetMaskShape(mask);
} }
void Layer::SetMaskTransform(Matrix3x2 const& transform) void LayerActor::SetMaskTransform(Matrix3x2 const& transform)
{ {
area_.SetMaskTransform(transform); layer_.SetMaskTransform(transform);
} }
bool Layer::DispatchEvent(Event* evt) bool LayerActor::DispatchEvent(Event* evt)
{ {
if (!IsVisible()) if (!IsVisible())
return true; return true;
@ -71,18 +71,18 @@ bool Layer::DispatchEvent(Event* evt)
return Actor::DispatchEvent(evt); return Actor::DispatchEvent(evt);
} }
void Layer::Render(RenderContext& ctx) void LayerActor::Render(RenderContext& ctx)
{ {
ctx.PushLayer(area_); ctx.PushLayer(layer_);
Actor::Render(ctx); Actor::Render(ctx);
ctx.PopLayer(); ctx.PopLayer();
} }
bool Layer::CheckVisibility(RenderContext& ctx) const bool LayerActor::CheckVisibility(RenderContext& ctx) const
{ {
// Do not need to render Layer // Do not need to render LayerActor
return false; return false;
} }

View File

@ -20,12 +20,12 @@
#pragma once #pragma once
#include <kiwano/2d/Actor.h> #include <kiwano/2d/Actor.h>
#include <kiwano/render/LayerArea.h> #include <kiwano/render/Layer.h>
#include <kiwano/render/RenderContext.h> #include <kiwano/render/RenderContext.h>
namespace kiwano namespace kiwano
{ {
KGE_DECLARE_SMART_PTR(Layer); KGE_DECLARE_SMART_PTR(LayerActor);
/** /**
* \addtogroup Actors * \addtogroup Actors
@ -34,56 +34,56 @@ KGE_DECLARE_SMART_PTR(Layer);
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API Layer : public Actor class KGE_API LayerActor : public Actor
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 创建图层 /// @brief 创建图层
static LayerPtr Create(); static LayerActorPtr Create();
Layer(); LayerActor();
virtual ~Layer(); virtual ~LayerActor();
/// \~chinese /// \~chinese
/// @brief 是否开启消息吞没 /// @brief 是否开启消息吞没
bool IsSwallowEventsEnabled() const; bool IsSwallowEventsEnabled() const;
/// \~chinese /// \~chinese
/// @brief 设置消息吞没功能 /// @brief 设置消息吞没功能
/// @param enabled 是否启用 /// @param enabled 是否启用
void SetSwallowEvents(bool enabled); void SetSwallowEvents(bool enabled);
/// \~chinese /// \~chinese
/// @brief 设置裁剪区域 /// @brief 设置裁剪区域
/// @param clip_rect 裁剪矩形 /// @param clip_rect 裁剪矩形
void SetClipRect(Rect const& clip_rect); void SetClipRect(Rect const& clip_rect);
/// \~chinese /// \~chinese
/// @brief 设置图层透明度 /// @brief 设置图层透明度
/// @param opacity 透明度 /// @param opacity 透明度
void SetOpacity(float opacity) override; void SetOpacity(float opacity) override;
/// \~chinese /// \~chinese
/// @brief 设置几何蒙层 /// @brief 设置几何蒙层
/// @param mask 蒙层的形状 /// @param mask 蒙层的形状
void SetMaskShape(ShapePtr mask); void SetMaskShape(ShapePtr mask);
/// \~chinese /// \~chinese
/// @brief 设置几何蒙层的二维变换 /// @brief 设置几何蒙层的二维变换
/// @param transform 应用于蒙层的二维变换 /// @param transform 应用于蒙层的二维变换
void SetMaskTransform(Matrix3x2 const& transform); void SetMaskTransform(Matrix3x2 const& transform);
/// \~chinese /// \~chinese
/// @brief 设置图层区域 /// @brief 设置图层区域
/// @param area 图层区域属性 /// @param area 图层区域属性
void SetArea(LayerArea const& area); void SetLayer(Layer const& layer);
/// \~chinese /// \~chinese
/// @brief 获取图层区域 /// @brief 获取图层区域
LayerArea const& GetArea() const; Layer const& GetLayer() const;
bool DispatchEvent(Event* evt) override; bool DispatchEvent(Event* evt) override;
@ -94,28 +94,28 @@ protected:
private: private:
bool swallow_; bool swallow_;
LayerArea area_; Layer layer_;
}; };
/** @} */ /** @} */
inline bool Layer::IsSwallowEventsEnabled() const inline bool LayerActor::IsSwallowEventsEnabled() const
{ {
return swallow_; return swallow_;
} }
inline void Layer::SetSwallowEvents(bool enabled) inline void LayerActor::SetSwallowEvents(bool enabled)
{ {
swallow_ = enabled; swallow_ = enabled;
} }
inline void Layer::SetArea(LayerArea const& area) inline void LayerActor::SetLayer(Layer const& layer)
{ {
area_ = area; layer_ = layer;
} }
inline LayerArea const& Layer::GetArea() const inline Layer const& LayerActor::GetLayer() const
{ {
return area_; return layer_;
} }
} // namespace kiwano } // namespace kiwano

View File

@ -91,7 +91,7 @@ void ShapeActor::OnRender(RenderContext& ctx)
if (stroke_brush_) if (stroke_brush_)
{ {
ctx.SetCurrentBrush(stroke_brush_); ctx.SetCurrentBrush(stroke_brush_);
ctx.DrawShape(*shape_, stroke_width_ * 2 /* twice width for widening */, stroke_style_); ctx.DrawShape(*shape_, stroke_style_, stroke_width_ * 2 /* twice width for widening */);
} }
if (fill_brush_) if (fill_brush_)

View File

@ -43,83 +43,83 @@ KGE_DECLARE_SMART_PTR(PolygonActor);
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API ShapeActor : public Actor class KGE_API ShapeActor : public Actor
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 创建形状角色 /// @brief 创建形状角色
static ShapeActorPtr Create(); static ShapeActorPtr Create();
/// \~chinese /// \~chinese
/// @brief 构造形状角色 /// @brief 构造形状角色
ShapeActor(); ShapeActor();
virtual ~ShapeActor(); virtual ~ShapeActor();
/// \~chinese /// \~chinese
/// @brief 获取填充画刷 /// @brief 获取填充画刷
BrushPtr GetFillBrush() const; BrushPtr GetFillBrush() const;
/// \~chinese /// \~chinese
/// @brief 获取轮廓画刷 /// @brief 获取轮廓画刷
BrushPtr GetStrokeBrush() const; BrushPtr GetStrokeBrush() const;
/// \~chinese /// \~chinese
/// @brief 获取线条宽度 /// @brief 获取线条宽度
float GetStrokeWidth() const; float GetStrokeWidth() const;
/// \~chinese /// \~chinese
/// @brief 获取线条样式 /// @brief 获取线条样式
StrokeStylePtr GetStrokeStyle() const; StrokeStylePtr GetStrokeStyle() const;
/// \~chinese /// \~chinese
/// @brief 获取形状 /// @brief 获取形状
ShapePtr GetShape() const; ShapePtr GetShape() const;
/// \~chinese /// \~chinese
/// @brief 获取边界 /// @brief 获取边界
Rect GetBounds() const override; Rect GetBounds() const override;
/// \~chinese /// \~chinese
/// @brief 获取外切包围盒 /// @brief 获取外切包围盒
Rect GetBoundingBox() const override; Rect GetBoundingBox() const override;
/// \~chinese /// \~chinese
/// @brief 判断点是否在形状内 /// @brief 判断点是否在形状内
bool ContainsPoint(const Point& point) const override; bool ContainsPoint(const Point& point) const override;
/// \~chinese /// \~chinese
/// @brief 设置填充颜色 /// @brief 设置填充颜色
/// @param color 填充颜色 /// @param color 填充颜色
void SetFillColor(Color const& color); void SetFillColor(Color const& color);
/// \~chinese /// \~chinese
/// @brief 设置填充画刷 /// @brief 设置填充画刷
/// @param[in] brush 填充画刷 /// @param[in] brush 填充画刷
void SetFillBrush(BrushPtr brush); void SetFillBrush(BrushPtr brush);
/// \~chinese /// \~chinese
/// @brief 设置轮廓颜色 /// @brief 设置轮廓颜色
/// @param color 轮廓颜色 /// @param color 轮廓颜色
void SetStrokeColor(Color const& color); void SetStrokeColor(Color const& color);
/// \~chinese /// \~chinese
/// @brief 设置轮廓画刷 /// @brief 设置轮廓画刷
/// @param[in] brush 轮廓画刷 /// @param[in] brush 轮廓画刷
void SetStrokeBrush(BrushPtr brush); void SetStrokeBrush(BrushPtr brush);
/// \~chinese /// \~chinese
/// @brief 设置线条宽度,默认为 1.0 /// @brief 设置线条宽度,默认为 1.0
void SetStrokeWidth(float width); void SetStrokeWidth(float width);
/// \~chinese /// \~chinese
/// @brief 设置线条样式 /// @brief 设置线条样式
void SetStrokeStyle(StrokeStylePtr stroke_style); void SetStrokeStyle(StrokeStylePtr stroke_style);
/// \~chinese /// \~chinese
/// @brief 设置形状 /// @brief 设置形状
void SetShape(ShapePtr shape); void SetShape(ShapePtr shape);
void OnRender(RenderContext& ctx) override; void OnRender(RenderContext& ctx) override;
@ -137,14 +137,14 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 线段角色 /// @brief 线段角色
class KGE_API LineActor : public ShapeActor class KGE_API LineActor : public ShapeActor
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 创建线段角色 /// @brief 创建线段角色
/// @param begin 线段起点 /// @param begin 线段起点
/// @param end 线段终点 /// @param end 线段终点
static LineActorPtr Create(Point const& begin, Point const& end); static LineActorPtr Create(Point const& begin, Point const& end);
LineActor(); LineActor();
@ -152,27 +152,27 @@ public:
virtual ~LineActor(); virtual ~LineActor();
/// \~chinese /// \~chinese
/// @brief 获取线段起点 /// @brief 获取线段起点
Point const& GetBeginPoint() const; Point const& GetBeginPoint() const;
/// \~chinese /// \~chinese
/// @brief 获取线段终点 /// @brief 获取线段终点
Point const& GetEndPoint() const; Point const& GetEndPoint() const;
/// \~chinese /// \~chinese
/// @brief 设置线段起点 /// @brief 设置线段起点
/// @param begin 线段起点 /// @param begin 线段起点
void SetBeginPoint(Point const& begin); void SetBeginPoint(Point const& begin);
/// \~chinese /// \~chinese
/// @brief 设置线段终点 /// @brief 设置线段终点
/// @param end 线段终点 /// @param end 线段终点
void SetEndPoint(Point const& end); void SetEndPoint(Point const& end);
/// \~chinese /// \~chinese
/// @brief 设置线段起点和终点 /// @brief 设置线段起点和终点
/// @param begin 线段起点 /// @param begin 线段起点
/// @param end 线段终点 /// @param end 线段终点
void SetLine(Point const& begin, Point const& end); void SetLine(Point const& begin, Point const& end);
private: private:
@ -181,13 +181,13 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 矩形角色 /// @brief 矩形角色
class KGE_API RectActor : public ShapeActor class KGE_API RectActor : public ShapeActor
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 创建矩形角色 /// @brief 创建矩形角色
/// @param size 矩形大小 /// @param size 矩形大小
static RectActorPtr Create(Size const& size); static RectActorPtr Create(Size const& size);
RectActor(); RectActor();
@ -195,12 +195,12 @@ public:
virtual ~RectActor(); virtual ~RectActor();
/// \~chinese /// \~chinese
/// @brief 获取矩形大小 /// @brief 获取矩形大小
Size const& GetRectSize() const; Size const& GetRectSize() const;
/// \~chinese /// \~chinese
/// @brief 设置矩形大小 /// @brief 设置矩形大小
/// @param size 矩形大小 /// @param size 矩形大小
void SetRectSize(Size const& size); void SetRectSize(Size const& size);
private: private:
@ -208,14 +208,14 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 圆角矩形角色 /// @brief 圆角矩形角色
class KGE_API RoundedRectActor : public ShapeActor class KGE_API RoundedRectActor : public ShapeActor
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 创建圆角矩形角色 /// @brief 创建圆角矩形角色
/// @param size 圆角矩形大小 /// @param size 圆角矩形大小
/// @param radius 圆角半径 /// @param radius 圆角半径
static RoundedRectActorPtr Create(Size const& size, Vec2 const& radius); static RoundedRectActorPtr Create(Size const& size, Vec2 const& radius);
RoundedRectActor(); RoundedRectActor();
@ -223,27 +223,27 @@ public:
virtual ~RoundedRectActor(); virtual ~RoundedRectActor();
/// \~chinese /// \~chinese
/// @brief 获取圆角半径 /// @brief 获取圆角半径
Vec2 GetRadius() const; Vec2 GetRadius() const;
/// \~chinese /// \~chinese
/// @brief 获取圆角矩形大小 /// @brief 获取圆角矩形大小
Size GetRectSize() const; Size GetRectSize() const;
/// \~chinese /// \~chinese
/// @brief 设置圆角半径 /// @brief 设置圆角半径
/// @param radius 圆角半径 /// @param radius 圆角半径
void SetRadius(Vec2 const& radius); void SetRadius(Vec2 const& radius);
/// \~chinese /// \~chinese
/// @brief 设置圆角矩形大小 /// @brief 设置圆角矩形大小
/// @param size 圆角矩形大小 /// @param size 圆角矩形大小
void SetRectSize(Size const& size); void SetRectSize(Size const& size);
/// \~chinese /// \~chinese
/// @brief 设置圆角矩形 /// @brief 设置圆角矩形
/// @param size 圆角矩形大小 /// @param size 圆角矩形大小
/// @param radius 圆角半径 /// @param radius 圆角半径
void SetRoundedRect(Size const& size, Vec2 const& radius); void SetRoundedRect(Size const& size, Vec2 const& radius);
private: private:
@ -252,13 +252,13 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 圆形角色 /// @brief 圆形角色
class KGE_API CircleActor : public ShapeActor class KGE_API CircleActor : public ShapeActor
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 创建圆形角色 /// @brief 创建圆形角色
/// @param radius 圆形半径 /// @param radius 圆形半径
static CircleActorPtr Create(float radius); static CircleActorPtr Create(float radius);
CircleActor(); CircleActor();
@ -266,12 +266,12 @@ public:
virtual ~CircleActor(); virtual ~CircleActor();
/// \~chinese /// \~chinese
/// @brief 获取圆形半径 /// @brief 获取圆形半径
float GetRadius() const; float GetRadius() const;
/// \~chinese /// \~chinese
/// @brief 设置圆形半径 /// @brief 设置圆形半径
/// @param radius 圆形半径 /// @param radius 圆形半径
void SetRadius(float radius); void SetRadius(float radius);
private: private:
@ -279,13 +279,13 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 椭圆角色 /// @brief 椭圆角色
class KGE_API EllipseActor : public ShapeActor class KGE_API EllipseActor : public ShapeActor
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 创建椭圆角色 /// @brief 创建椭圆角色
/// @param radius 椭圆半径 /// @param radius 椭圆半径
static EllipseActorPtr Create(Vec2 const& radius); static EllipseActorPtr Create(Vec2 const& radius);
EllipseActor(); EllipseActor();
@ -293,12 +293,12 @@ public:
virtual ~EllipseActor(); virtual ~EllipseActor();
/// \~chinese /// \~chinese
/// @brief 获取椭圆半径 /// @brief 获取椭圆半径
Vec2 GetRadius() const; Vec2 GetRadius() const;
/// \~chinese /// \~chinese
/// @brief 设置椭圆半径 /// @brief 设置椭圆半径
/// @param radius 椭圆半径 /// @param radius 椭圆半径
void SetRadius(Vec2 const& radius); void SetRadius(Vec2 const& radius);
private: private:
@ -306,13 +306,13 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 多边形角色 /// @brief 多边形角色
class KGE_API PolygonActor : public ShapeActor class KGE_API PolygonActor : public ShapeActor
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 创建多边形角色 /// @brief 创建多边形角色
/// @param points 多边形端点集合 /// @param points 多边形端点集合
static PolygonActorPtr Create(Vector<Point> const& points); static PolygonActorPtr Create(Vector<Point> const& points);
PolygonActor(); PolygonActor();
@ -320,8 +320,8 @@ public:
virtual ~PolygonActor(); virtual ~PolygonActor();
/// \~chinese /// \~chinese
/// @brief 设置多边形端点 /// @brief 设置多边形端点
/// @param points 多边形端点集合 /// @param points 多边形端点集合
void SetVertices(Vector<Point> const& points); void SetVertices(Vector<Point> const& points);
}; };

View File

@ -33,24 +33,24 @@ KGE_DECLARE_SMART_PTR(Sprite);
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API Sprite : public Actor class KGE_API Sprite : public Actor
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 创建精灵 /// @brief 创建精灵
/// @param file_path 本地图片路径 /// @param file_path 本地图片路径
static SpritePtr Create(String const& file_path); static SpritePtr Create(String const& file_path);
/// \~chinese /// \~chinese
/// @brief 创建精灵 /// @brief 创建精灵
/// @param res 图片资源 /// @param res 图片资源
static SpritePtr Create(Resource const& res); static SpritePtr Create(Resource const& res);
/// \~chinese /// \~chinese
/// @brief 创建精灵 /// @brief 创建精灵
/// @param frame 图像帧 /// @param frame 图像帧
static SpritePtr Create(FramePtr frame); static SpritePtr Create(FramePtr frame);
Sprite(); Sprite();
@ -58,27 +58,27 @@ public:
virtual ~Sprite(); virtual ~Sprite();
/// \~chinese /// \~chinese
/// @brief 加载本地图片 /// @brief 加载本地图片
/// @param file_path 本地图片路径 /// @param file_path 本地图片路径
bool Load(String const& file_path); bool Load(String const& file_path);
/// \~chinese /// \~chinese
/// @brief 加载图像资源 /// @brief 加载图像资源
/// @param res 图片资源 /// @param res 图片资源
bool Load(Resource const& res); bool Load(Resource const& res);
/// \~chinese /// \~chinese
/// @brief 使用矩形区域裁剪精灵 /// @brief 使用矩形区域裁剪精灵
/// @param crop_rect 裁剪矩形 /// @param crop_rect 裁剪矩形
void SetCropRect(const Rect& crop_rect); void SetCropRect(const Rect& crop_rect);
/// \~chinese /// \~chinese
/// @brief 获取帧图像 /// @brief 获取帧图像
FramePtr GetFrame() const; FramePtr GetFrame() const;
/// \~chinese /// \~chinese
/// @brief 设置图像帧 /// @brief 设置图像帧
/// @param[in] frame 图像帧 /// @param[in] frame 图像帧
void SetFrame(FramePtr frame); void SetFrame(FramePtr frame);
void OnRender(RenderContext& ctx) override; void OnRender(RenderContext& ctx) override;

View File

@ -36,19 +36,19 @@ Stage::Stage()
SetStage(this); SetStage(this);
SetAnchor(Vec2{ 0, 0 }); SetAnchor(Vec2{ 0, 0 });
SetSize(Renderer::Instance().GetOutputSize()); SetSize(Renderer::GetInstance().GetOutputSize());
} }
Stage::~Stage() {} Stage::~Stage() {}
void Stage::OnEnter() void Stage::OnEnter()
{ {
KGE_SYS_LOG(L"Stage entered"); KGE_SYS_LOG("Stage entered");
} }
void Stage::OnExit() void Stage::OnExit()
{ {
KGE_SYS_LOG(L"Stage exited"); KGE_SYS_LOG("Stage exited");
} }
void Stage::RenderBorder(RenderContext& ctx) void Stage::RenderBorder(RenderContext& ctx)

View File

@ -33,8 +33,8 @@ KGE_DECLARE_SMART_PTR(Stage);
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @details * @details
* @see kiwano::Actor kiwano::Director * @see kiwano::Actor kiwano::Director
*/ */
class KGE_API Stage : public Actor class KGE_API Stage : public Actor
@ -44,7 +44,7 @@ class KGE_API Stage : public Actor
public: public:
/// \~chinese /// \~chinese
/// @brief 进入舞台时 /// @brief 进入舞台时
static StagePtr Create(); static StagePtr Create();
Stage(); Stage();
@ -52,34 +52,34 @@ public:
virtual ~Stage(); virtual ~Stage();
/// \~chinese /// \~chinese
/// @brief 进入舞台时 /// @brief 进入舞台时
/// @details 重载该函数以处理进入舞台前的行为 /// @details 重载该函数以处理进入舞台前的行为
virtual void OnEnter(); virtual void OnEnter();
/// \~chinese /// \~chinese
/// @brief 退出舞台时 /// @brief 退出舞台时
/// @details 重载该函数以处理退出舞台前的行为 /// @details 重载该函数以处理退出舞台前的行为
virtual void OnExit(); virtual void OnExit();
/// \~chinese /// \~chinese
/// @brief 获取角色边界填充画刷 /// @brief 获取角色边界填充画刷
BrushPtr GetBorderFillBrush() const; BrushPtr GetBorderFillBrush() const;
/// \~chinese /// \~chinese
/// @brief 获取角色边界轮廓画刷 /// @brief 获取角色边界轮廓画刷
BrushPtr GetBorderStrokeBrush() const; BrushPtr GetBorderStrokeBrush() const;
/// \~chinese /// \~chinese
/// @brief 设置角色边界填充画刷 /// @brief 设置角色边界填充画刷
void SetBorderFillBrush(BrushPtr brush); void SetBorderFillBrush(BrushPtr brush);
/// \~chinese /// \~chinese
/// @brief 设置角色边界轮廓画刷 /// @brief 设置角色边界轮廓画刷
void SetBorderStrokeBrush(BrushPtr brush); void SetBorderStrokeBrush(BrushPtr brush);
protected: protected:
/// \~chinese /// \~chinese
/// @brief 绘制所有子角色的边界 /// @brief 绘制所有子角色的边界
void RenderBorder(RenderContext& ctx) override; void RenderBorder(RenderContext& ctx) override;
private: private:

View File

@ -34,20 +34,20 @@ KGE_DECLARE_SMART_PTR(TextActor);
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API TextActor : public Actor class KGE_API TextActor : public Actor
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 创建文本角色 /// @brief 创建文本角色
/// @param text 文字内容 /// @param text 文字内容
static TextActorPtr Create(const String& text); static TextActorPtr Create(const String& text);
/// \~chinese /// \~chinese
/// @brief 创建文本角色 /// @brief 创建文本角色
/// @param text 文字内容 /// @param text 文字内容
/// @param style 文本样式 /// @param style 文本样式
static TextActorPtr Create(const String& text, const TextStyle& style); static TextActorPtr Create(const String& text, const TextStyle& style);
TextActor(); TextActor();
@ -55,108 +55,108 @@ public:
virtual ~TextActor(); virtual ~TextActor();
/// \~chinese /// \~chinese
/// @brief 获取文本 /// @brief 获取文本
const String& GetText() const; const String& GetText() const;
/// \~chinese /// \~chinese
/// @brief 获取文本样式 /// @brief 获取文本样式
const TextStyle& GetStyle() const; const TextStyle& GetStyle() const;
/// \~chinese /// \~chinese
/// @brief 获取文本布局 /// @brief 获取文本布局
const TextLayout& GetLayout() const; const TextLayout& GetLayout() const;
/// \~chinese /// \~chinese
/// @brief 获取文本布局大小 /// @brief 获取文本布局大小
Size GetLayoutSize() const; Size GetLayoutSize() const;
/// \~chinese /// \~chinese
/// @brief 获取填充画刷 /// @brief 获取填充画刷
BrushPtr GetFillBrush() const; BrushPtr GetFillBrush() const;
/// \~chinese /// \~chinese
/// @brief 获取描边画刷 /// @brief 获取描边画刷
BrushPtr GetOutlineBrush() const; BrushPtr GetOutlineBrush() const;
/// \~chinese /// \~chinese
/// @brief 获取字体 /// @brief 获取字体
FontPtr GetFont() const; FontPtr GetFont() const;
/// \~chinese /// \~chinese
/// @brief 设置文本 /// @brief 设置文本
void SetText(String const& text); void SetText(String const& text);
/// \~chinese /// \~chinese
/// @brief 设置文本样式 /// @brief 设置文本样式
void SetStyle(const TextStyle& style); void SetStyle(const TextStyle& style);
/// \~chinese /// \~chinese
/// @brief 设置字体 /// @brief 设置字体
void SetFont(FontPtr font); void SetFont(FontPtr font);
/// \~chinese /// \~chinese
/// @brief 设置字体族 /// @brief 设置字体族
void SetFontFamily(String const& family); void SetFontFamily(String const& family);
/// \~chinese /// \~chinese
/// @brief 设置字号(默认值为 18 /// @brief 设置字号(默认值为 18
void SetFontSize(float size); void SetFontSize(float size);
/// \~chinese /// \~chinese
/// @brief 设置字体粗细值(默认值为 FontWeight::Normal /// @brief 设置字体粗细值(默认值为 FontWeight::Normal
void SetFontWeight(uint32_t weight); void SetFontWeight(uint32_t weight);
/// \~chinese /// \~chinese
/// @brief 设置文字填充画刷 /// @brief 设置文字填充画刷
void SetFillBrush(BrushPtr brush); void SetFillBrush(BrushPtr brush);
/// \~chinese /// \~chinese
/// @brief 设置文字填充颜色(默认值为 Color::White /// @brief 设置文字填充颜色(默认值为 Color::White
void SetFillColor(Color const& color); void SetFillColor(Color const& color);
/// \~chinese /// \~chinese
/// @brief 设置文字斜体(默认值为 false /// @brief 设置文字斜体(默认值为 false
void SetItalic(bool italic); void SetItalic(bool italic);
/// \~chinese /// \~chinese
/// @brief 设置文本自动换行的宽度(默认为 0 /// @brief 设置文本自动换行的宽度(默认为 0
void SetWrapWidth(float wrap_width); void SetWrapWidth(float wrap_width);
/// \~chinese /// \~chinese
/// @brief 设置行间距(默认为 0 /// @brief 设置行间距(默认为 0
void SetLineSpacing(float line_spacing); void SetLineSpacing(float line_spacing);
/// \~chinese /// \~chinese
/// @brief 设置对齐方式(默认为 TextAlign::Left /// @brief 设置对齐方式(默认为 TextAlign::Left
void SetAlignment(TextAlign align); void SetAlignment(TextAlign align);
/// \~chinese /// \~chinese
/// @brief 设置文字描边画刷 /// @brief 设置文字描边画刷
void SetOutlineBrush(BrushPtr brush); void SetOutlineBrush(BrushPtr brush);
/// \~chinese /// \~chinese
/// @brief 设置文字描边颜色 /// @brief 设置文字描边颜色
void SetOutlineColor(Color const& outline_color); void SetOutlineColor(Color const& outline_color);
/// \~chinese /// \~chinese
/// @brief 设置文字描边线宽 /// @brief 设置文字描边线宽
void SetOutlineWidth(float outline_width); void SetOutlineWidth(float outline_width);
/// \~chinese /// \~chinese
/// @brief 设置文字描边线相交样式 /// @brief 设置文字描边线相交样式
void SetOutlineStroke(StrokeStylePtr outline_stroke); void SetOutlineStroke(StrokeStylePtr outline_stroke);
/// \~chinese /// \~chinese
/// @brief 设置是否显示下划线(默认值为 false /// @brief 设置是否显示下划线(默认值为 false
void SetUnderline(bool enable); void SetUnderline(bool enable);
/// \~chinese /// \~chinese
/// @brief 设置是否显示删除线(默认值为 false /// @brief 设置是否显示删除线(默认值为 false
void SetStrikethrough(bool enable); void SetStrikethrough(bool enable);
/// \~chinese /// \~chinese
/// @brief 更新文字布局 /// @brief 更新文字布局
/// @details 文字布局是懒更新的,手动更新文字布局以更新节点状态 /// @details 文字布局是懒更新的,手动更新文字布局以更新节点状态
void UpdateLayout(); void UpdateLayout();
void OnRender(RenderContext& ctx) override; void OnRender(RenderContext& ctx) override;

View File

@ -58,16 +58,16 @@ void Transition::Init(StagePtr prev, StagePtr next)
out_stage_ = prev; out_stage_ = prev;
in_stage_ = next; in_stage_ = next;
window_size_ = Renderer::Instance().GetOutputSize(); window_size_ = Renderer::GetInstance().GetOutputSize();
if (in_stage_) if (in_stage_)
{ {
in_layer_.SetAreaRect(Rect{ Point(), window_size_ }); in_layer_.SetClipRect(Rect{ Point(), window_size_ });
} }
if (out_stage_) if (out_stage_)
{ {
out_layer_.SetAreaRect(Rect{ Point(), window_size_ }); out_layer_.SetClipRect(Rect{ Point(), window_size_ });
} }
} }
@ -151,14 +151,14 @@ void BoxTransition::Update(Duration dt)
if (process_ < .5f) if (process_ < .5f)
{ {
out_layer_.SetAreaRect(Rect(window_size_.x * process_, window_size_.y * process_, out_layer_.SetClipRect(Rect(window_size_.x * process_, window_size_.y * process_,
window_size_.x * (1 - process_), window_size_.y * (1 - process_))); window_size_.x * (1 - process_), window_size_.y * (1 - process_)));
} }
else else
{ {
out_layer_.SetOpacity(0.f); out_layer_.SetOpacity(0.f);
in_layer_.SetOpacity(1.f); in_layer_.SetOpacity(1.f);
in_layer_.SetAreaRect(Rect(window_size_.x * (1 - process_), window_size_.y * (1 - process_), in_layer_.SetClipRect(Rect(window_size_.x * (1 - process_), window_size_.y * (1 - process_),
window_size_.x * process_, window_size_.y * process_)); window_size_.x * process_, window_size_.y * process_));
} }
} }

View File

@ -20,7 +20,7 @@
#pragma once #pragma once
#include <kiwano/2d/Stage.h> #include <kiwano/2d/Stage.h>
#include <kiwano/render/LayerArea.h> #include <kiwano/render/Layer.h>
namespace kiwano namespace kiwano
{ {
@ -36,7 +36,7 @@ KGE_DECLARE_SMART_PTR(RotationTransition);
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API Transition : public virtual ObjectBase class KGE_API Transition : public virtual ObjectBase
{ {
@ -49,48 +49,48 @@ public:
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
void SetDuration(Duration dt); void SetDuration(Duration dt);
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
bool IsDone(); bool IsDone();
protected: protected:
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @param[in] prev * @param[in] prev
* @param[in] next * @param[in] next
*/ */
virtual void Init(StagePtr prev, StagePtr next); virtual void Init(StagePtr prev, StagePtr next);
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @param dt * @param dt
*/ */
virtual void Update(Duration dt); virtual void Update(Duration dt);
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @param[in] ctx * @param[in] ctx
*/ */
virtual void Render(RenderContext& ctx); virtual void Render(RenderContext& ctx);
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
virtual void Stop(); virtual void Stop();
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
virtual void Reset() {} virtual void Reset() {}
@ -102,22 +102,22 @@ protected:
Size window_size_; Size window_size_;
StagePtr out_stage_; StagePtr out_stage_;
StagePtr in_stage_; StagePtr in_stage_;
LayerArea out_layer_; Layer out_layer_;
LayerArea in_layer_; Layer in_layer_;
}; };
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @details * @details
*/ */
class FadeTransition : public Transition class FadeTransition : public Transition
{ {
public: public:
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @param duration * @param duration
*/ */
static FadeTransitionPtr Create(Duration duration); static FadeTransitionPtr Create(Duration duration);
@ -131,16 +131,16 @@ protected:
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @details * @details
*/ */
class EmergeTransition : public Transition class EmergeTransition : public Transition
{ {
public: public:
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @param duration * @param duration
*/ */
static EmergeTransitionPtr Create(Duration duration); static EmergeTransitionPtr Create(Duration duration);
@ -154,16 +154,16 @@ protected:
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @details * @details
*/ */
class BoxTransition : public Transition class BoxTransition : public Transition
{ {
public: public:
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @param duration * @param duration
*/ */
static BoxTransitionPtr Create(Duration duration); static BoxTransitionPtr Create(Duration duration);
@ -177,29 +177,29 @@ protected:
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @details * @details
*/ */
class MoveTransition : public Transition class MoveTransition : public Transition
{ {
public: public:
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
enum class Type : int enum class Type : int
{ {
Up, ///< 上移 Up, ///< 上移
Down, ///< 下移 Down, ///< 下移
Left, ///< 左移 Left, ///< 左移
Right ///< 右移 Right ///< 右移
}; };
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @param duration * @param duration
* @param type * @param type
*/ */
static MoveTransitionPtr Create(Duration duration, Type type); static MoveTransitionPtr Create(Duration duration, Type type);
@ -220,17 +220,17 @@ private:
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @details * @details
*/ */
class RotationTransition : public Transition class RotationTransition : public Transition
{ {
public: public:
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @param duration * @param duration
* @param rotation * @param rotation
*/ */
static RotationTransitionPtr Create(Duration duration, float rotation = 360.0f); static RotationTransitionPtr Create(Duration duration, float rotation = 360.0f);

View File

@ -34,7 +34,7 @@ KGE_DECLARE_SMART_PTR(Action);
/** /**
* \~chinese * \~chinese
* \defgroup Actions * \defgroup Actions
*/ */
/** /**
@ -43,7 +43,7 @@ KGE_DECLARE_SMART_PTR(Action);
*/ */
/// \~chinese /// \~chinese
/// @brief 动画 /// @brief 动画
class KGE_API Action class KGE_API Action
: public virtual ObjectBase : public virtual ObjectBase
, protected IntrusiveListItem<ActionPtr> , protected IntrusiveListItem<ActionPtr>
@ -54,7 +54,7 @@ class KGE_API Action
public: public:
/// \~chinese /// \~chinese
/// @brief 动画结束时的回调函数 /// @brief 动画结束时的回调函数
using DoneCallback = Function<void(Actor* /* target */)>; using DoneCallback = Function<void(Actor* /* target */)>;
Action(); Action();
@ -62,120 +62,120 @@ public:
virtual ~Action(); virtual ~Action();
/// \~chinese /// \~chinese
/// @brief 继续动画 /// @brief 继续动画
void Resume(); void Resume();
/// \~chinese /// \~chinese
/// @brief 暂停动画 /// @brief 暂停动画
void Pause(); void Pause();
/// \~chinese /// \~chinese
/// @brief 停止动画 /// @brief 停止动画
void Stop(); void Stop();
/// \~chinese /// \~chinese
/// @brief 设置动画延时 /// @brief 设置动画延时
void SetDelay(Duration delay); void SetDelay(Duration delay);
/// \~chinese /// \~chinese
/// @brief 设置循环次数 /// @brief 设置循环次数
/// @param loops 循环次数,-1 为永久循环 /// @param loops 循环次数,-1 为永久循环
void SetLoops(int loops); void SetLoops(int loops);
/// \~chinese /// \~chinese
/// @brief 动画结束时移除目标角色 /// @brief 动画结束时移除目标角色
void RemoveTargetWhenDone(); void RemoveTargetWhenDone();
/// \~chinese /// \~chinese
/// @brief 设置动画结束时的回调函数 /// @brief 设置动画结束时的回调函数
void SetDoneCallback(DoneCallback const& cb); void SetDoneCallback(DoneCallback const& cb);
/// \~chinese /// \~chinese
/// @brief 设置动画循环结束时的回调函数 /// @brief 设置动画循环结束时的回调函数
void SetLoopDoneCallback(DoneCallback const& cb); void SetLoopDoneCallback(DoneCallback const& cb);
/// \~chinese /// \~chinese
/// @brief 获取动画的拷贝 /// @brief 获取动画的拷贝
virtual ActionPtr Clone() const = 0; virtual ActionPtr Clone() const = 0;
/// \~chinese /// \~chinese
/// @brief 获取动画的倒转 /// @brief 获取动画的倒转
virtual ActionPtr Reverse() const = 0; virtual ActionPtr Reverse() const = 0;
/// \~chinese /// \~chinese
/// @brief 获取动画的运行状态 /// @brief 获取动画的运行状态
bool IsRunning() const; bool IsRunning() const;
/// \~chinese /// \~chinese
/// @brief 获取动画的循环次数 /// @brief 获取动画的循环次数
int GetLoops() const; int GetLoops() const;
/// \~chinese /// \~chinese
/// @brief 获取动画的延时 /// @brief 获取动画的延时
Duration GetDelay() const; Duration GetDelay() const;
/// \~chinese /// \~chinese
/// @brief 获取动画结束时的回调函数 /// @brief 获取动画结束时的回调函数
DoneCallback GetDoneCallback() const; DoneCallback GetDoneCallback() const;
/// \~chinese /// \~chinese
/// @brief 获取动画循环结束时的回调函数 /// @brief 获取动画循环结束时的回调函数
DoneCallback GetLoopDoneCallback() const; DoneCallback GetLoopDoneCallback() const;
protected: protected:
/// \~chinese /// \~chinese
/// @brief 初始化动画 /// @brief 初始化动画
virtual void Init(Actor* target); virtual void Init(Actor* target);
/// \~chinese /// \~chinese
/// @brief 更新动画 /// @brief 更新动画
virtual void Update(Actor* target, Duration dt); virtual void Update(Actor* target, Duration dt);
/// \~chinese /// \~chinese
/// @brief 更新一个时间步 /// @brief 更新一个时间步
void UpdateStep(Actor* target, Duration dt); void UpdateStep(Actor* target, Duration dt);
/// \~chinese /// \~chinese
/// @brief 完成动画 /// @brief 完成动画
void Complete(Actor* target); void Complete(Actor* target);
/// \~chinese /// \~chinese
/// @brief 重新开始动画 /// @brief 重新开始动画
void Restart(Actor* target); void Restart(Actor* target);
/// \~chinese /// \~chinese
/// @brief 动画状态 /// @brief 动画状态
enum class Status enum class Status
{ {
NotStarted, ///< 未开始 NotStarted, ///< 未开始
Delayed, ///< 等待延时 Delayed, ///< 等待延时
Started, ///< 已开始 Started, ///< 已开始
Done, ///< 已结束 Done, ///< 已结束
Removeable ///< 可移除 Removeable ///< 可移除
}; };
/// \~chinese /// \~chinese
/// @brief 获取动画状态 /// @brief 获取动画状态
Status GetStatus() const; Status GetStatus() const;
/// \~chinese /// \~chinese
/// @brief 获取消逝时间 /// @brief 获取消逝时间
Duration GetElapsed() const; Duration GetElapsed() const;
/// \~chinese /// \~chinese
/// @brief 获取完成的循环次数 /// @brief 获取完成的循环次数
int GetLoopsDone() const; int GetLoopsDone() const;
/// \~chinese /// \~chinese
/// @brief 结束动画 /// @brief 结束动画
void Done(); void Done();
/// \~chinese /// \~chinese
/// @brief 是否已结束 /// @brief 是否已结束
bool IsDone() const; bool IsDone() const;
/// \~chinese /// \~chinese
/// @brief 是否可移除 /// @brief 是否可移除
bool IsRemoveable() const; bool IsRemoveable() const;
private: private:

View File

@ -29,21 +29,21 @@ namespace kiwano
*/ */
/// \~chinese /// \~chinese
/// @brief 延时动画 /// @brief 延时动画
class KGE_API ActionDelay : public Action class KGE_API ActionDelay : public Action
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 构建延时动画 /// @brief 构建延时动画
/// @param delay 延时时长 /// @param delay 延时时长
ActionDelay(Duration delay); ActionDelay(Duration delay);
/// \~chinese /// \~chinese
/// @brief 获取该动画的拷贝对象 /// @brief 获取该动画的拷贝对象
ActionPtr Clone() const override; ActionPtr Clone() const override;
/// \~chinese /// \~chinese
/// @brief 获取该动画的倒转 /// @brief 获取该动画的倒转
ActionPtr Reverse() const override; ActionPtr Reverse() const override;
}; };

View File

@ -31,7 +31,7 @@ KGE_DECLARE_SMART_PTR(ActionGroup);
*/ */
/// \~chinese /// \~chinese
/// @brief 动画组合 /// @brief 动画组合
class KGE_API ActionGroup : public Action class KGE_API ActionGroup : public Action
{ {
public: public:
@ -40,33 +40,33 @@ public:
ActionGroup(); ActionGroup();
/// \~chinese /// \~chinese
/// @brief 动画组合 /// @brief 动画组合
/// @param actions 动画集合 /// @param actions 动画集合
/// @param sync 同步执行 /// @param sync 同步执行
explicit ActionGroup(Vector<ActionPtr> const& actions, bool sync = false); explicit ActionGroup(Vector<ActionPtr> const& actions, bool sync = false);
virtual ~ActionGroup(); virtual ~ActionGroup();
/// \~chinese /// \~chinese
/// @brief 添加动画 /// @brief 添加动画
/// @param action 动画 /// @param action 动画
void Add(ActionPtr action); void Add(ActionPtr action);
/// \~chinese /// \~chinese
/// @brief 添加多个动画 /// @brief 添加多个动画
/// @param actions 动画集合 /// @param actions 动画集合
void Add(Vector<ActionPtr> const& actions); void Add(Vector<ActionPtr> const& actions);
/// \~chinese /// \~chinese
/// @brief 获取所有动画 /// @brief 获取所有动画
ActionList const& GetActions() const; ActionList const& GetActions() const;
/// \~chinese /// \~chinese
/// @brief 获取该动画的拷贝对象 /// @brief 获取该动画的拷贝对象
ActionPtr Clone() const override; ActionPtr Clone() const override;
/// \~chinese /// \~chinese
/// @brief 获取该动画的倒转 /// @brief 获取该动画的倒转
ActionPtr Reverse() const override; ActionPtr Reverse() const override;
protected: protected:

View File

@ -33,13 +33,13 @@ namespace kiwano
*/ */
/// \~chinese /// \~chinese
/// @brief 动画辅助类 /// @brief 动画辅助类
struct ActionHelper struct ActionHelper
{ {
using DoneCallback = Action::DoneCallback; using DoneCallback = Action::DoneCallback;
/// \~chinese /// \~chinese
/// @brief 设置循环次数 /// @brief 设置循环次数
inline ActionHelper& SetLoops(int loops) inline ActionHelper& SetLoops(int loops)
{ {
core->SetLoops(loops); core->SetLoops(loops);
@ -47,7 +47,7 @@ struct ActionHelper
} }
/// \~chinese /// \~chinese
/// @brief 设置动画延迟 /// @brief 设置动画延迟
inline ActionHelper& SetDelay(Duration delay) inline ActionHelper& SetDelay(Duration delay)
{ {
core->SetDelay(delay); core->SetDelay(delay);
@ -55,7 +55,7 @@ struct ActionHelper
} }
/// \~chinese /// \~chinese
/// @brief 设置动画结束回调函数 /// @brief 设置动画结束回调函数
inline ActionHelper& SetDoneCallback(DoneCallback const& cb) inline ActionHelper& SetDoneCallback(DoneCallback const& cb)
{ {
core->SetDoneCallback(cb); core->SetDoneCallback(cb);
@ -63,7 +63,7 @@ struct ActionHelper
} }
/// \~chinese /// \~chinese
/// @brief 设置动画循环结束时的回调函数 /// @brief 设置动画循环结束时的回调函数
inline ActionHelper& SetLoopDoneCallback(DoneCallback const& cb) inline ActionHelper& SetLoopDoneCallback(DoneCallback const& cb)
{ {
core->SetLoopDoneCallback(cb); core->SetLoopDoneCallback(cb);
@ -71,7 +71,7 @@ struct ActionHelper
} }
/// \~chinese /// \~chinese
/// @brief 动画结束时移除目标角色 /// @brief 动画结束时移除目标角色
inline ActionHelper& RemoveTargetWhenDone() inline ActionHelper& RemoveTargetWhenDone()
{ {
core->RemoveTargetWhenDone(); core->RemoveTargetWhenDone();
@ -79,7 +79,7 @@ struct ActionHelper
} }
/// \~chinese /// \~chinese
/// @brief 设置名称 /// @brief 设置名称
inline ActionHelper& SetName(String const& name) inline ActionHelper& SetName(String const& name)
{ {
core->SetName(name); core->SetName(name);
@ -87,7 +87,7 @@ struct ActionHelper
} }
/// \~chinese /// \~chinese
/// @brief 获取指针 /// @brief 获取指针
inline ActionPtr Get() const inline ActionPtr Get() const
{ {
return core; return core;
@ -108,13 +108,13 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 补间动画辅助类 /// @brief 补间动画辅助类
struct TweenHelper struct TweenHelper
{ {
using DoneCallback = Action::DoneCallback; using DoneCallback = Action::DoneCallback;
/// \~chinese /// \~chinese
/// @brief 设置动画持续时长 /// @brief 设置动画持续时长
inline TweenHelper& SetDuration(Duration dur) inline TweenHelper& SetDuration(Duration dur)
{ {
core->SetDuration(dur); core->SetDuration(dur);
@ -122,7 +122,7 @@ struct TweenHelper
} }
/// \~chinese /// \~chinese
/// @brief 设置循环次数 /// @brief 设置循环次数
inline TweenHelper& SetLoops(int loops) inline TweenHelper& SetLoops(int loops)
{ {
core->SetLoops(loops); core->SetLoops(loops);
@ -130,7 +130,7 @@ struct TweenHelper
} }
/// \~chinese /// \~chinese
/// @brief 设置缓动函数 /// @brief 设置缓动函数
inline TweenHelper& SetEaseFunc(EaseFunc ease) inline TweenHelper& SetEaseFunc(EaseFunc ease)
{ {
core->SetEaseFunc(ease); core->SetEaseFunc(ease);
@ -138,7 +138,7 @@ struct TweenHelper
} }
/// \~chinese /// \~chinese
/// @brief 设置动画延迟 /// @brief 设置动画延迟
inline TweenHelper& SetDelay(Duration delay) inline TweenHelper& SetDelay(Duration delay)
{ {
core->SetDelay(delay); core->SetDelay(delay);
@ -146,7 +146,7 @@ struct TweenHelper
} }
/// \~chinese /// \~chinese
/// @brief 设置动画结束回调函数 /// @brief 设置动画结束回调函数
inline TweenHelper& SetDoneCallback(DoneCallback const& cb) inline TweenHelper& SetDoneCallback(DoneCallback const& cb)
{ {
core->SetDoneCallback(cb); core->SetDoneCallback(cb);
@ -154,7 +154,7 @@ struct TweenHelper
} }
/// \~chinese /// \~chinese
/// @brief 设置动画循环结束时的回调函数 /// @brief 设置动画循环结束时的回调函数
inline TweenHelper& SetLoopDoneCallback(DoneCallback const& cb) inline TweenHelper& SetLoopDoneCallback(DoneCallback const& cb)
{ {
core->SetLoopDoneCallback(cb); core->SetLoopDoneCallback(cb);
@ -162,7 +162,7 @@ struct TweenHelper
} }
/// \~chinese /// \~chinese
/// @brief 动画结束时移除目标角色 /// @brief 动画结束时移除目标角色
inline TweenHelper& RemoveTargetWhenDone() inline TweenHelper& RemoveTargetWhenDone()
{ {
core->RemoveTargetWhenDone(); core->RemoveTargetWhenDone();
@ -170,7 +170,7 @@ struct TweenHelper
} }
/// \~chinese /// \~chinese
/// @brief 设置名称 /// @brief 设置名称
inline TweenHelper& SetName(String const& name) inline TweenHelper& SetName(String const& name)
{ {
core->SetName(name); core->SetName(name);
@ -178,7 +178,7 @@ struct TweenHelper
} }
/// \~chinese /// \~chinese
/// @brief 获取指针 /// @brief 获取指针
inline ActionTweenPtr Get() const inline ActionTweenPtr Get() const
{ {
return core; return core;
@ -204,120 +204,120 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 动画构造器 /// @brief 动画构造器
struct Tween struct Tween
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 构造相对位移动画 /// @brief 构造相对位移动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param vector 移动向量 /// @param vector 移动向量
static inline TweenHelper MoveBy(Duration dur, Point const& vector) static inline TweenHelper MoveBy(Duration dur, Point const& vector)
{ {
return TweenHelper(new kiwano::ActionMoveBy(dur, vector)); return TweenHelper(new kiwano::ActionMoveBy(dur, vector));
} }
/// \~chinese /// \~chinese
/// @brief 构造位移动画 /// @brief 构造位移动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param pos 目的坐标 /// @param pos 目的坐标
static inline TweenHelper MoveTo(Duration dur, Point const& pos) static inline TweenHelper MoveTo(Duration dur, Point const& pos)
{ {
return TweenHelper(new kiwano::ActionMoveTo(dur, pos)); return TweenHelper(new kiwano::ActionMoveTo(dur, pos));
} }
/// \~chinese /// \~chinese
/// @brief 构造相对跳跃动画 /// @brief 构造相对跳跃动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param vec 跳跃位移向量 /// @param vec 跳跃位移向量
/// @param height 跳跃高度 /// @param height 跳跃高度
/// @param jumps 跳跃次数 /// @param jumps 跳跃次数
static inline TweenHelper JumpBy(Duration duration, Vec2 const& vec, float height, int jumps = 1) static inline TweenHelper JumpBy(Duration duration, Vec2 const& vec, float height, int jumps = 1)
{ {
return TweenHelper(new kiwano::ActionJumpBy(duration, vec, height, jumps)); return TweenHelper(new kiwano::ActionJumpBy(duration, vec, height, jumps));
} }
/// \~chinese /// \~chinese
/// @brief 构造跳跃动画 /// @brief 构造跳跃动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param pos 目的坐标 /// @param pos 目的坐标
/// @param height 跳跃高度 /// @param height 跳跃高度
/// @param jumps 跳跃次数 /// @param jumps 跳跃次数
static inline TweenHelper JumpTo(Duration duration, Point const& pos, float height, int jumps = 1) static inline TweenHelper JumpTo(Duration duration, Point const& pos, float height, int jumps = 1)
{ {
return TweenHelper(new kiwano::ActionJumpTo(duration, pos, height, jumps)); return TweenHelper(new kiwano::ActionJumpTo(duration, pos, height, jumps));
} }
/// \~chinese /// \~chinese
/// @brief 构造相对缩放动画 /// @brief 构造相对缩放动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param scale_x 横向缩放相对变化值 /// @param scale_x 横向缩放相对变化值
/// @param scale_y 纵向缩放相对变化值 /// @param scale_y 纵向缩放相对变化值
static inline TweenHelper ScaleBy(Duration dur, float scale_x, float scale_y) static inline TweenHelper ScaleBy(Duration dur, float scale_x, float scale_y)
{ {
return TweenHelper(new kiwano::ActionScaleBy(dur, scale_x, scale_y)); return TweenHelper(new kiwano::ActionScaleBy(dur, scale_x, scale_y));
} }
/// \~chinese /// \~chinese
/// @brief 构造缩放动画 /// @brief 构造缩放动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param scale_x 横向缩放目标值 /// @param scale_x 横向缩放目标值
/// @param scale_y 纵向缩放目标值 /// @param scale_y 纵向缩放目标值
static inline TweenHelper ScaleTo(Duration dur, float scale_x, float scale_y) static inline TweenHelper ScaleTo(Duration dur, float scale_x, float scale_y)
{ {
return TweenHelper(new kiwano::ActionScaleTo(dur, scale_x, scale_y)); return TweenHelper(new kiwano::ActionScaleTo(dur, scale_x, scale_y));
} }
/// \~chinese /// \~chinese
/// @brief 构造透明度渐变动画 /// @brief 构造透明度渐变动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param opacity 目标透明度 /// @param opacity 目标透明度
static inline TweenHelper FadeTo(Duration dur, float opacity) static inline TweenHelper FadeTo(Duration dur, float opacity)
{ {
return TweenHelper(new kiwano::ActionFadeTo(dur, opacity)); return TweenHelper(new kiwano::ActionFadeTo(dur, opacity));
} }
/// \~chinese /// \~chinese
/// @brief 构造淡入动画 /// @brief 构造淡入动画
/// @param duration 动画时长 /// @param duration 动画时长
static inline TweenHelper FadeIn(Duration dur) static inline TweenHelper FadeIn(Duration dur)
{ {
return TweenHelper(new kiwano::ActionFadeIn(dur)); return TweenHelper(new kiwano::ActionFadeIn(dur));
} }
/// \~chinese /// \~chinese
/// @brief 构造淡出动画 /// @brief 构造淡出动画
/// @param duration 动画时长 /// @param duration 动画时长
static inline TweenHelper FadeOut(Duration dur) static inline TweenHelper FadeOut(Duration dur)
{ {
return TweenHelper(new kiwano::ActionFadeOut(dur)); return TweenHelper(new kiwano::ActionFadeOut(dur));
} }
/// \~chinese /// \~chinese
/// @brief 构造相对旋转动画 /// @brief 构造相对旋转动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param rotation 角度相对变化值 /// @param rotation 角度相对变化值
static inline TweenHelper RotateBy(Duration dur, float rotation) static inline TweenHelper RotateBy(Duration dur, float rotation)
{ {
return TweenHelper(new kiwano::ActionRotateBy(dur, rotation)); return TweenHelper(new kiwano::ActionRotateBy(dur, rotation));
} }
/// \~chinese /// \~chinese
/// @brief 构造旋转动画 /// @brief 构造旋转动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param rotation 目标角度 /// @param rotation 目标角度
static inline TweenHelper RotateTo(Duration dur, float rotation) static inline TweenHelper RotateTo(Duration dur, float rotation)
{ {
return TweenHelper(new kiwano::ActionRotateTo(dur, rotation)); return TweenHelper(new kiwano::ActionRotateTo(dur, rotation));
} }
/// \~chinese /// \~chinese
/// @brief 构造路径行走动画 /// @brief 构造路径行走动画
/// @param duration 持续时长 /// @param duration 持续时长
/// @param path 路径形状 /// @param path 路径形状
/// @param rotating 是否沿路径切线方向旋转 /// @param rotating 是否沿路径切线方向旋转
/// @param start 路径起点(百分比) /// @param start 路径起点(百分比)
/// @param end 路径终点(百分比) /// @param end 路径终点(百分比)
static inline TweenHelper Walk(Duration duration, ShapePtr path, bool rotating = false, float start = 0.f, static inline TweenHelper Walk(Duration duration, ShapePtr path, bool rotating = false, float start = 0.f,
float end = 1.f) float end = 1.f)
{ {
@ -325,35 +325,35 @@ public:
} }
/// \~chinese /// \~chinese
/// @brief 构建帧动画 /// @brief 构建帧动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param[in] frame_seq 序列帧 /// @param[in] frame_seq 序列帧
static inline TweenHelper Animation(Duration dur, FrameSequencePtr frames) static inline TweenHelper Animation(Duration dur, FrameSequencePtr frames)
{ {
return TweenHelper(new kiwano::Animation(dur, frames)); return TweenHelper(new kiwano::Animation(dur, frames));
} }
/// \~chinese /// \~chinese
/// @brief 构造自定义动画 /// @brief 构造自定义动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param tween_func 动画回调函数 /// @param tween_func 动画回调函数
static inline TweenHelper Custom(Duration dur, ActionCustom::TweenFunc tween_func) static inline TweenHelper Custom(Duration dur, ActionCustom::TweenFunc tween_func)
{ {
return TweenHelper(new kiwano::ActionCustom(dur, tween_func)); return TweenHelper(new kiwano::ActionCustom(dur, tween_func));
} }
/// \~chinese /// \~chinese
/// @brief 构建延时动画 /// @brief 构建延时动画
/// @param delay 延时时长 /// @param delay 延时时长
static inline ActionHelper Delay(Duration delay) static inline ActionHelper Delay(Duration delay)
{ {
return ActionHelper(new kiwano::ActionDelay(delay)); return ActionHelper(new kiwano::ActionDelay(delay));
} }
/// \~chinese /// \~chinese
/// @brief 动画组合 /// @brief 动画组合
/// @param actions 动画集合 /// @param actions 动画集合
/// @param sync 同步执行 /// @param sync 同步执行
static inline ActionHelper Group(Vector<ActionPtr> const& actions, bool sync = false) static inline ActionHelper Group(Vector<ActionPtr> const& actions, bool sync = false)
{ {
return ActionHelper(new kiwano::ActionGroup(actions, sync)); return ActionHelper(new kiwano::ActionGroup(actions, sync));

View File

@ -30,47 +30,47 @@ namespace kiwano
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API ActionManager class KGE_API ActionManager
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 动画列表 /// @brief 动画列表
using Actions = IntrusiveList<ActionPtr>; using Actions = IntrusiveList<ActionPtr>;
/// \~chinese /// \~chinese
/// @brief 添加动画 /// @brief 添加动画
Action* AddAction(ActionPtr action); Action* AddAction(ActionPtr action);
/// \~chinese /// \~chinese
/// @brief 添加动画 /// @brief 添加动画
Action* AddAction(Action* action); Action* AddAction(Action* action);
/// \~chinese /// \~chinese
/// @brief 继续所有暂停动画 /// @brief 继续所有暂停动画
void ResumeAllActions(); void ResumeAllActions();
/// \~chinese /// \~chinese
/// @brief 暂停所有动画 /// @brief 暂停所有动画
void PauseAllActions(); void PauseAllActions();
/// \~chinese /// \~chinese
/// @brief 停止所有动画 /// @brief 停止所有动画
void StopAllActions(); void StopAllActions();
/// \~chinese /// \~chinese
/// @brief 获取指定名称的动画 /// @brief 获取指定名称的动画
/// @param name 动画名称 /// @param name 动画名称
ActionPtr GetAction(String const& name); ActionPtr GetAction(String const& name);
/// \~chinese /// \~chinese
/// @brief 获取所有动画 /// @brief 获取所有动画
Actions const& GetAllActions() const; Actions const& GetAllActions() const;
protected: protected:
/// \~chinese /// \~chinese
/// @brief 更新动画 /// @brief 更新动画
void UpdateActions(Actor* target, Duration dt); void UpdateActions(Actor* target, Duration dt);
private: private:

View File

@ -25,27 +25,27 @@
namespace kiwano namespace kiwano
{ {
/// \~chinese /// \~chinese
/// @brief 缓动函数 /// @brief 缓动函数
using EaseFunc = Function<float(float)>; using EaseFunc = Function<float(float)>;
/// \~chinese /// \~chinese
/// @brief 缓动函数枚举 /// @brief 缓动函数枚举
/// @details 查看 https://easings.net 获取更多信息 /// @details 查看 https://easings.net 获取更多信息
struct Ease struct Ease
{ {
static KGE_API EaseFunc Linear; ///< 线性 static KGE_API EaseFunc Linear; ///< 线性
static KGE_API EaseFunc EaseIn; ///< 由慢变快 static KGE_API EaseFunc EaseIn; ///< 由慢变快
static KGE_API EaseFunc EaseOut; ///< 由快变慢 static KGE_API EaseFunc EaseOut; ///< 由快变慢
static KGE_API EaseFunc EaseInOut; ///< 由慢变快, 再由快变慢 static KGE_API EaseFunc EaseInOut; ///< 由慢变快, 再由快变慢
static KGE_API EaseFunc ExpoIn; ///< 由慢变极快 static KGE_API EaseFunc ExpoIn; ///< 由慢变极快
static KGE_API EaseFunc ExpoOut; ///< 由极快变慢 static KGE_API EaseFunc ExpoOut; ///< 由极快变慢
static KGE_API EaseFunc ExpoInOut; ///< 由慢至极快, 再由极快边慢 static KGE_API EaseFunc ExpoInOut; ///< 由慢至极快, 再由极快边慢
static KGE_API EaseFunc ElasticIn; ///< 自起点赋予弹性 static KGE_API EaseFunc ElasticIn; ///< 自起点赋予弹性
static KGE_API EaseFunc ElasticOut; ///< 自终点赋予弹性 static KGE_API EaseFunc ElasticOut; ///< 自终点赋予弹性
static KGE_API EaseFunc ElasticInOut; ///< 再起点和终点赋予弹性 static KGE_API EaseFunc ElasticInOut; ///< 再起点和终点赋予弹性
static KGE_API EaseFunc BounceIn; ///< 自起点赋予反弹力 static KGE_API EaseFunc BounceIn; ///< 自起点赋予反弹力
static KGE_API EaseFunc BounceOut; ///< 自终点赋予反弹力 static KGE_API EaseFunc BounceOut; ///< 自终点赋予反弹力
static KGE_API EaseFunc BounceInOut; ///< 在起点和终点赋予反弹力 static KGE_API EaseFunc BounceInOut; ///< 在起点和终点赋予反弹力
static KGE_API EaseFunc BackIn; static KGE_API EaseFunc BackIn;
static KGE_API EaseFunc BackOut; static KGE_API EaseFunc BackOut;
static KGE_API EaseFunc BackInOut; static KGE_API EaseFunc BackInOut;
@ -86,32 +86,32 @@ KGE_DECLARE_SMART_PTR(ActionCustom);
*/ */
/// \~chinese /// \~chinese
/// @brief 补间动画 /// @brief 补间动画
class KGE_API ActionTween : public Action class KGE_API ActionTween : public Action
{ {
public: public:
ActionTween(); ActionTween();
/// \~chinese /// \~chinese
/// @brief 补间动画 /// @brief 补间动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param func 动画速度缓动函数 /// @param func 动画速度缓动函数
ActionTween(Duration duration, EaseFunc func); ActionTween(Duration duration, EaseFunc func);
/// \~chinese /// \~chinese
/// @brief 获取动画时长 /// @brief 获取动画时长
Duration GetDuration() const; Duration GetDuration() const;
/// \~chinese /// \~chinese
/// @brief 设置动画时长 /// @brief 设置动画时长
void SetDuration(Duration duration); void SetDuration(Duration duration);
/// \~chinese /// \~chinese
/// @brief 获取动画速度缓动函数 /// @brief 获取动画速度缓动函数
EaseFunc const& GetEaseFunc() const; EaseFunc const& GetEaseFunc() const;
/// \~chinese /// \~chinese
/// @brief 设置动画速度缓动函数 /// @brief 设置动画速度缓动函数
void SetEaseFunc(EaseFunc const& func); void SetEaseFunc(EaseFunc const& func);
protected: protected:
@ -125,23 +125,23 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 相对位移动画 /// @brief 相对位移动画
class KGE_API ActionMoveBy : public ActionTween class KGE_API ActionMoveBy : public ActionTween
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 构造相对位移动画 /// @brief 构造相对位移动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param vector 移动向量 /// @param vector 移动向量
/// @param func 动画速度缓动函数 /// @param func 动画速度缓动函数
ActionMoveBy(Duration duration, Vec2 const& vector, EaseFunc func = nullptr); ActionMoveBy(Duration duration, Vec2 const& vector, EaseFunc func = nullptr);
/// \~chinese /// \~chinese
/// @brief 获取该动画的拷贝对象 /// @brief 获取该动画的拷贝对象
ActionPtr Clone() const override; ActionPtr Clone() const override;
/// \~chinese /// \~chinese
/// @brief 获取该动画的倒转 /// @brief 获取该动画的倒转
ActionPtr Reverse() const override; ActionPtr Reverse() const override;
protected: protected:
@ -156,26 +156,26 @@ protected:
}; };
/// \~chinese /// \~chinese
/// @brief 位移动画 /// @brief 位移动画
class KGE_API ActionMoveTo : public ActionMoveBy class KGE_API ActionMoveTo : public ActionMoveBy
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 构造位移动画 /// @brief 构造位移动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param pos 目的坐标 /// @param pos 目的坐标
/// @param func 动画速度缓动函数 /// @param func 动画速度缓动函数
ActionMoveTo(Duration duration, Point const& pos, EaseFunc func = nullptr); ActionMoveTo(Duration duration, Point const& pos, EaseFunc func = nullptr);
/// \~chinese /// \~chinese
/// @brief 获取该动画的拷贝对象 /// @brief 获取该动画的拷贝对象
ActionPtr Clone() const override; ActionPtr Clone() const override;
/// \~chinese /// \~chinese
/// @brief 获取该动画的倒转 /// @brief 获取该动画的倒转
virtual ActionPtr Reverse() const override virtual ActionPtr Reverse() const override
{ {
KGE_ERROR(L"Reverse() not supported in ActionMoveTo"); KGE_ERROR("Reverse() not supported in ActionMoveTo");
return nullptr; return nullptr;
} }
@ -187,25 +187,25 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 相对跳跃动画 /// @brief 相对跳跃动画
class KGE_API ActionJumpBy : public ActionTween class KGE_API ActionJumpBy : public ActionTween
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 构造相对跳跃动画 /// @brief 构造相对跳跃动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param vec 跳跃位移向量 /// @param vec 跳跃位移向量
/// @param height 跳跃高度 /// @param height 跳跃高度
/// @param jumps 跳跃次数 /// @param jumps 跳跃次数
/// @param func 动画速度缓动函数 /// @param func 动画速度缓动函数
ActionJumpBy(Duration duration, Vec2 const& vec, float height, int jumps = 1, EaseFunc func = nullptr); ActionJumpBy(Duration duration, Vec2 const& vec, float height, int jumps = 1, EaseFunc func = nullptr);
/// \~chinese /// \~chinese
/// @brief 获取该动画的拷贝对象 /// @brief 获取该动画的拷贝对象
ActionPtr Clone() const override; ActionPtr Clone() const override;
/// \~chinese /// \~chinese
/// @brief 获取该动画的倒转 /// @brief 获取该动画的倒转
ActionPtr Reverse() const override; ActionPtr Reverse() const override;
protected: protected:
@ -222,28 +222,28 @@ protected:
}; };
/// \~chinese /// \~chinese
/// @brief 跳跃动画 /// @brief 跳跃动画
class KGE_API ActionJumpTo : public ActionJumpBy class KGE_API ActionJumpTo : public ActionJumpBy
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 构造跳跃动画 /// @brief 构造跳跃动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param pos 目的坐标 /// @param pos 目的坐标
/// @param height 跳跃高度 /// @param height 跳跃高度
/// @param jumps 跳跃次数 /// @param jumps 跳跃次数
/// @param func 动画速度缓动函数 /// @param func 动画速度缓动函数
ActionJumpTo(Duration duration, Point const& pos, float height, int jumps = 1, EaseFunc func = nullptr); ActionJumpTo(Duration duration, Point const& pos, float height, int jumps = 1, EaseFunc func = nullptr);
/// \~chinese /// \~chinese
/// @brief 获取该动画的拷贝对象 /// @brief 获取该动画的拷贝对象
ActionPtr Clone() const override; ActionPtr Clone() const override;
/// \~chinese /// \~chinese
/// @brief 获取该动画的倒转 /// @brief 获取该动画的倒转
virtual ActionPtr Reverse() const override virtual ActionPtr Reverse() const override
{ {
KGE_ERROR(L"Reverse() not supported in ActionJumpTo"); KGE_ERROR("Reverse() not supported in ActionJumpTo");
return nullptr; return nullptr;
} }
@ -255,24 +255,24 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 相对缩放动画 /// @brief 相对缩放动画
class KGE_API ActionScaleBy : public ActionTween class KGE_API ActionScaleBy : public ActionTween
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 构造相对缩放动画 /// @brief 构造相对缩放动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param scale_x 横向缩放相对变化值 /// @param scale_x 横向缩放相对变化值
/// @param scale_y 纵向缩放相对变化值 /// @param scale_y 纵向缩放相对变化值
/// @param func 动画速度缓动函数 /// @param func 动画速度缓动函数
ActionScaleBy(Duration duration, float scale_x, float scale_y, EaseFunc func = nullptr); ActionScaleBy(Duration duration, float scale_x, float scale_y, EaseFunc func = nullptr);
/// \~chinese /// \~chinese
/// @brief 获取该动画的拷贝对象 /// @brief 获取该动画的拷贝对象
ActionPtr Clone() const override; ActionPtr Clone() const override;
/// \~chinese /// \~chinese
/// @brief 获取该动画的倒转 /// @brief 获取该动画的倒转
ActionPtr Reverse() const override; ActionPtr Reverse() const override;
protected: protected:
@ -288,27 +288,27 @@ protected:
}; };
/// \~chinese /// \~chinese
/// @brief 缩放动画 /// @brief 缩放动画
class KGE_API ActionScaleTo : public ActionScaleBy class KGE_API ActionScaleTo : public ActionScaleBy
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 构造缩放动画 /// @brief 构造缩放动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param scale_x 横向缩放目标值 /// @param scale_x 横向缩放目标值
/// @param scale_y 纵向缩放目标值 /// @param scale_y 纵向缩放目标值
/// @param func 动画速度缓动函数 /// @param func 动画速度缓动函数
ActionScaleTo(Duration duration, float scale_x, float scale_y, EaseFunc func = nullptr); ActionScaleTo(Duration duration, float scale_x, float scale_y, EaseFunc func = nullptr);
/// \~chinese /// \~chinese
/// @brief 获取该动画的拷贝对象 /// @brief 获取该动画的拷贝对象
ActionPtr Clone() const override; ActionPtr Clone() const override;
/// \~chinese /// \~chinese
/// @brief 获取该动画的倒转 /// @brief 获取该动画的倒转
virtual ActionPtr Reverse() const override virtual ActionPtr Reverse() const override
{ {
KGE_ERROR(L"Reverse() not supported in ActionScaleTo"); KGE_ERROR("Reverse() not supported in ActionScaleTo");
return nullptr; return nullptr;
} }
@ -321,26 +321,26 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 透明度渐变动画 /// @brief 透明度渐变动画
class KGE_API ActionFadeTo : public ActionTween class KGE_API ActionFadeTo : public ActionTween
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 构造透明度渐变动画 /// @brief 构造透明度渐变动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param opacity 目标透明度 /// @param opacity 目标透明度
/// @param func 动画速度缓动函数 /// @param func 动画速度缓动函数
ActionFadeTo(Duration duration, float opacity, EaseFunc func = nullptr); ActionFadeTo(Duration duration, float opacity, EaseFunc func = nullptr);
/// \~chinese /// \~chinese
/// @brief 获取该动画的拷贝对象 /// @brief 获取该动画的拷贝对象
ActionPtr Clone() const override; ActionPtr Clone() const override;
/// \~chinese /// \~chinese
/// @brief 获取该动画的倒转 /// @brief 获取该动画的倒转
virtual ActionPtr Reverse() const override virtual ActionPtr Reverse() const override
{ {
KGE_ERROR(L"Reverse() not supported in ActionFadeTo"); KGE_ERROR("Reverse() not supported in ActionFadeTo");
return nullptr; return nullptr;
} }
@ -356,47 +356,47 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 淡入动画 /// @brief 淡入动画
class KGE_API ActionFadeIn : public ActionFadeTo class KGE_API ActionFadeIn : public ActionFadeTo
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 构造淡入动画 /// @brief 构造淡入动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param func 动画速度缓动函数 /// @param func 动画速度缓动函数
explicit ActionFadeIn(Duration duration, EaseFunc func = nullptr); explicit ActionFadeIn(Duration duration, EaseFunc func = nullptr);
}; };
/// \~chinese /// \~chinese
/// @brief 淡出动画 /// @brief 淡出动画
class KGE_API ActionFadeOut : public ActionFadeTo class KGE_API ActionFadeOut : public ActionFadeTo
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 构造淡出动画 /// @brief 构造淡出动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param func 动画速度缓动函数 /// @param func 动画速度缓动函数
explicit ActionFadeOut(Duration duration, EaseFunc func = nullptr); explicit ActionFadeOut(Duration duration, EaseFunc func = nullptr);
}; };
/// \~chinese /// \~chinese
/// @brief 相对旋转动画 /// @brief 相对旋转动画
class KGE_API ActionRotateBy : public ActionTween class KGE_API ActionRotateBy : public ActionTween
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 构造相对旋转动画 /// @brief 构造相对旋转动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param rotation 角度相对变化值 /// @param rotation 角度相对变化值
/// @param func 动画速度缓动函数 /// @param func 动画速度缓动函数
ActionRotateBy(Duration duration, float rotation, EaseFunc func = nullptr); ActionRotateBy(Duration duration, float rotation, EaseFunc func = nullptr);
/// \~chinese /// \~chinese
/// @brief 获取该动画的拷贝对象 /// @brief 获取该动画的拷贝对象
ActionPtr Clone() const override; ActionPtr Clone() const override;
/// \~chinese /// \~chinese
/// @brief 获取该动画的倒转 /// @brief 获取该动画的倒转
ActionPtr Reverse() const override; ActionPtr Reverse() const override;
protected: protected:
@ -410,26 +410,26 @@ protected:
}; };
/// \~chinese /// \~chinese
/// @brief 旋转动画 /// @brief 旋转动画
class KGE_API ActionRotateTo : public ActionRotateBy class KGE_API ActionRotateTo : public ActionRotateBy
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 构造旋转动画 /// @brief 构造旋转动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param rotation 目标角度 /// @param rotation 目标角度
/// @param func 动画速度缓动函数 /// @param func 动画速度缓动函数
ActionRotateTo(Duration duration, float rotation, EaseFunc func = nullptr); ActionRotateTo(Duration duration, float rotation, EaseFunc func = nullptr);
/// \~chinese /// \~chinese
/// @brief 获取该动画的拷贝对象 /// @brief 获取该动画的拷贝对象
ActionPtr Clone() const override; ActionPtr Clone() const override;
/// \~chinese /// \~chinese
/// @brief 获取该动画的倒转 /// @brief 获取该动画的倒转
virtual ActionPtr Reverse() const override virtual ActionPtr Reverse() const override
{ {
KGE_ERROR(L"Reverse() not supported in ActionRotateTo"); KGE_ERROR("Reverse() not supported in ActionRotateTo");
return nullptr; return nullptr;
} }
@ -441,31 +441,31 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 自定义动画 /// @brief 自定义动画
class KGE_API ActionCustom : public ActionTween class KGE_API ActionCustom : public ActionTween
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 动画回调函数 /// @brief 动画回调函数
/// @details 在动画更新时回调该函数第一个参数是执行动画的目标第二个参数是动画进度0.0 - 1.0 /// @details 在动画更新时回调该函数第一个参数是执行动画的目标第二个参数是动画进度0.0 - 1.0
using TweenFunc = Function<void(Actor* /* target */, float /* percent */)>; using TweenFunc = Function<void(Actor* /* target */, float /* percent */)>;
/// \~chinese /// \~chinese
/// @brief 构造自定义动画 /// @brief 构造自定义动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param tween_func 动画回调函数 /// @param tween_func 动画回调函数
/// @param func 动画速度缓动函数 /// @param func 动画速度缓动函数
ActionCustom(Duration duration, TweenFunc tween_func, EaseFunc func = nullptr); ActionCustom(Duration duration, TweenFunc tween_func, EaseFunc func = nullptr);
/// \~chinese /// \~chinese
/// @brief 获取该动画的拷贝对象 /// @brief 获取该动画的拷贝对象
ActionPtr Clone() const override; ActionPtr Clone() const override;
/// \~chinese /// \~chinese
/// @brief 获取该动画的倒转 /// @brief 获取该动画的倒转
ActionPtr Reverse() const override ActionPtr Reverse() const override
{ {
KGE_ERROR(L"Reverse() not supported in ActionCustom"); KGE_ERROR("Reverse() not supported in ActionCustom");
return nullptr; return nullptr;
} }

View File

@ -33,44 +33,44 @@ KGE_DECLARE_SMART_PTR(ActionWalk);
*/ */
/// \~chinese /// \~chinese
/// @brief 路径行走动画 /// @brief 路径行走动画
class KGE_API ActionWalk : public ActionTween class KGE_API ActionWalk : public ActionTween
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 构造路径行走动画 /// @brief 构造路径行走动画
/// @param duration 持续时长 /// @param duration 持续时长
/// @param rotating 是否沿路径切线方向旋转 /// @param rotating 是否沿路径切线方向旋转
/// @param start 路径起点(百分比) /// @param start 路径起点(百分比)
/// @param end 路径终点(百分比) /// @param end 路径终点(百分比)
/// @param func 动画速度缓动函数 /// @param func 动画速度缓动函数
ActionWalk(Duration duration, bool rotating = false, float start = 0.f, float end = 1.f, EaseFunc func = nullptr); ActionWalk(Duration duration, bool rotating = false, float start = 0.f, float end = 1.f, EaseFunc func = nullptr);
/// \~chinese /// \~chinese
/// @brief 构造路径行走动画 /// @brief 构造路径行走动画
/// @param duration 持续时长 /// @param duration 持续时长
/// @param path 路径形状 /// @param path 路径形状
/// @param rotating 是否沿路径切线方向旋转 /// @param rotating 是否沿路径切线方向旋转
/// @param start 路径起点(百分比) /// @param start 路径起点(百分比)
/// @param end 路径终点(百分比) /// @param end 路径终点(百分比)
/// @param func 动画速度缓动函数 /// @param func 动画速度缓动函数
ActionWalk(Duration duration, ShapePtr path, bool rotating = false, float start = 0.f, float end = 1.f, ActionWalk(Duration duration, ShapePtr path, bool rotating = false, float start = 0.f, float end = 1.f,
EaseFunc func = nullptr); EaseFunc func = nullptr);
/// \~chinese /// \~chinese
/// @brief 获取该动画的拷贝对象 /// @brief 获取该动画的拷贝对象
ActionPtr Clone() const override; ActionPtr Clone() const override;
/// \~chinese /// \~chinese
/// @brief 获取该动画的倒转 /// @brief 获取该动画的倒转
ActionPtr Reverse() const override; ActionPtr Reverse() const override;
/// \~chinese /// \~chinese
/// @brief 获取路线 /// @brief 获取路线
ShapePtr const& GetPath() const; ShapePtr const& GetPath() const;
/// \~chinese /// \~chinese
/// @brief 设置路径形状 /// @brief 设置路径形状
void SetPath(ShapePtr path); void SetPath(ShapePtr path);
protected: protected:

View File

@ -32,36 +32,36 @@ KGE_DECLARE_SMART_PTR(Animation);
*/ */
/// \~chinese /// \~chinese
/// @brief 帧动画 /// @brief 帧动画
class KGE_API Animation : public ActionTween class KGE_API Animation : public ActionTween
{ {
public: public:
Animation(); Animation();
/// \~chinese /// \~chinese
/// @brief 构建帧动画 /// @brief 构建帧动画
/// @param duration 动画时长 /// @param duration 动画时长
/// @param[in] frame_seq 序列帧 /// @param[in] frame_seq 序列帧
/// @param func 动画速度缓动函数 /// @param func 动画速度缓动函数
Animation(Duration duration, FrameSequencePtr frame_seq, EaseFunc func = nullptr); Animation(Duration duration, FrameSequencePtr frame_seq, EaseFunc func = nullptr);
virtual ~Animation(); virtual ~Animation();
/// \~chinese /// \~chinese
/// @brief 获取序列帧 /// @brief 获取序列帧
FrameSequencePtr GetFrameSequence() const; FrameSequencePtr GetFrameSequence() const;
/// \~chinese /// \~chinese
/// @brief 设置序列帧 /// @brief 设置序列帧
/// @param[in] frame_seq 序列帧 /// @param[in] frame_seq 序列帧
void SetFrameSequence(FrameSequencePtr frame_seq); void SetFrameSequence(FrameSequencePtr frame_seq);
/// \~chinese /// \~chinese
/// @brief 获取该动画的拷贝对象 /// @brief 获取该动画的拷贝对象
ActionPtr Clone() const override; ActionPtr Clone() const override;
/// \~chinese /// \~chinese
/// @brief 获取该动画的倒转 /// @brief 获取该动画的倒转
ActionPtr Reverse() const override; ActionPtr Reverse() const override;
protected: protected:

View File

@ -9,9 +9,9 @@
//#define KGE_ASSERT(EXPR) __noop // Disable asserts //#define KGE_ASSERT(EXPR) __noop // Disable asserts
//---- Define debug-output handler. Defaults to calling kiwano::logs::Messageln()/Warningln()/Errorln() //---- Define debug-output handler. Defaults to calling kiwano::logs::Messageln()/Warningln()/Errorln()
//#define KGE_SYS_LOG(FORMAT, ...) wprintf(FORMAT L"\n", __VA_ARGS__) //#define KGE_SYS_LOG(FORMAT, ...) wprintf(FORMAT "\n", __VA_ARGS__)
//#define KGE_WARN(FORMAT, ...) wprintf(FORMAT L"\n", __VA_ARGS__) //#define KGE_WARN(FORMAT, ...) wprintf(FORMAT "\n", __VA_ARGS__)
//#define KGE_ERROR(FORMAT, ...) wprintf(FORMAT L"\n", __VA_ARGS__) //#define KGE_ERROR(FORMAT, ...) wprintf(FORMAT "\n", __VA_ARGS__)
//---- Define attributes of all API symbols declarations for DLL //---- Define attributes of all API symbols declarations for DLL
//#define KGE_USE_DLL //#define KGE_USE_DLL

View File

@ -31,8 +31,8 @@ typedef Function<void()> AsyncTaskFunc;
typedef Function<void()> AsyncTaskCallback; typedef Function<void()> AsyncTaskCallback;
/// \~chinese /// \~chinese
/// @brief 异步任务 /// @brief 异步任务
/// @details 在多线程下执行任务并返回 /// @details 在多线程下执行任务并返回
/// @code /// @code
/// AsyncTaskPtr task = new AsyncTask; /// AsyncTaskPtr task = new AsyncTask;
/// task->Then(DoSomething); /// task->Then(DoSomething);
@ -42,27 +42,27 @@ class AsyncTask : public virtual ObjectBase
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 创建异步任务 /// @brief 创建异步任务
/// @param func 异步回调函数 /// @param func 异步回调函数
static AsyncTaskPtr Create(AsyncTaskFunc func); static AsyncTaskPtr Create(AsyncTaskFunc func);
/// \~chinese /// \~chinese
/// @brief 构造异步任务 /// @brief 构造异步任务
AsyncTask(); AsyncTask();
virtual ~AsyncTask(); virtual ~AsyncTask();
/// \~chinese /// \~chinese
/// @brief 添加异步任务链 /// @brief 添加异步任务链
AsyncTask& Then(AsyncTaskFunc func); AsyncTask& Then(AsyncTaskFunc func);
/// \~chinese /// \~chinese
/// @brief 设置任务执行完成后的回调函数 /// @brief 设置任务执行完成后的回调函数
/// @note 该函数在 Kiwano 主线程中执行 /// @note 该函数在 Kiwano 主线程中执行
AsyncTask& SetCallback(AsyncTaskCallback callback); AsyncTask& SetCallback(AsyncTaskCallback callback);
/// \~chinese /// \~chinese
/// @brief 启动异步任务 /// @brief 启动异步任务
void Start(); void Start();
private: private:

View File

@ -19,125 +19,126 @@
// THE SOFTWARE. // THE SOFTWARE.
#pragma once #pragma once
#include <3rd-party/OuterC/oc/oc.h>
#include <kiwano/core/Singleton.h>
#include <kiwano/macros.h>
#include <list> #include <list>
#include <map> #include <map>
#include <queue> #include <queue>
#include <set> #include <set>
#include <sstream> #include <sstream>
#include <stack> #include <stack>
#include <string>
#include <unordered_map> #include <unordered_map>
#include <unordered_set> #include <unordered_set>
#include <kiwano/macros.h>
#include <kiwano/core/Singleton.h>
#include <3rd-party/OuterC/oc/oc.h>
#include <3rd-party/nlohmann/json.hpp>
namespace kiwano namespace kiwano
{ {
/// \~chinese
/// @brief 字符串容器
using String = oc::wstring;
/// \~chinese /// \~chinese
/// @brief 窄字符串容器 /// @brief 输入流
using ByteString = oc::string; using InputStream = std::istream;
/// \~chinese /// \~chinese
/// @brief 字符串 /// @brief 输出
using StringStream = std::wstringstream; using OutputStream = std::ostream;
/// \~chinese /// \~chinese
/// @brief 线性数组容器 /// @brief 字符串容器
using String = oc::string;
/// \~chinese
/// @brief 宽字符串容器
using WideString = oc::wstring;
/// \~chinese
/// @brief 字符串流
using StringStream = std::stringstream;
/// \~chinese
/// @brief 宽字符串流
using WideStringStream = std::wstringstream;
/// \~chinese
/// @brief 线性数组容器
template <typename _Ty, typename... _Args> template <typename _Ty, typename... _Args>
using Vector = oc::vector<_Ty, _Args...>; using Vector = std::vector<_Ty, _Args...>;
/// \~chinese /// \~chinese
/// @brief 链表容器 /// @brief 链表容器
template <typename _Ty, typename... _Args> template <typename _Ty, typename... _Args>
using List = std::list<_Ty, _Args...>; using List = std::list<_Ty, _Args...>;
/// \~chinese /// \~chinese
/// @brief 队列容器 /// @brief 队列容器
template <typename _Ty, typename... _Args> template <typename _Ty, typename... _Args>
using Queue = std::queue<_Ty, _Args...>; using Queue = std::queue<_Ty, _Args...>;
/// \~chinese /// \~chinese
/// @brief 集合容器 /// @brief 集合容器
template <typename _Ty, typename... _Args> template <typename _Ty, typename... _Args>
using Set = std::set<_Ty, _Args...>; using Set = std::set<_Ty, _Args...>;
/// \~chinese /// \~chinese
/// @brief 对容器 /// @brief 对容器
template <typename _Ty1, typename _Ty2> template <typename _Ty1, typename _Ty2>
using Pair = std::pair<_Ty1, _Ty2>; using Pair = std::pair<_Ty1, _Ty2>;
/// \~chinese /// \~chinese
/// @brief 无序集合容器 /// @brief 无序集合容器
template <typename _Ty, typename... _Args> template <typename _Ty, typename... _Args>
using UnorderedSet = std::unordered_set<_Ty, _Args...>; using UnorderedSet = std::unordered_set<_Ty, _Args...>;
/// \~chinese /// \~chinese
/// @brief 栈容器 /// @brief 栈容器
template <typename _Ty, typename... _Args> template <typename _Ty, typename... _Args>
using Stack = std::stack<_Ty, _Args...>; using Stack = std::stack<_Ty, _Args...>;
/// \~chinese /// \~chinese
/// @brief 字符串容器 /// @brief 字符串容器
template <typename _Kty, typename _Ty, typename... _Args> template <typename _Kty, typename _Ty, typename... _Args>
using Map = std::map<_Kty, _Ty, _Args...>; using Map = std::map<_Kty, _Ty, _Args...>;
/// \~chinese /// \~chinese
/// @brief 字符串容器 /// @brief 字符串容器
template <typename _Kty, typename _Ty, typename... _Args> template <typename _Kty, typename _Ty, typename... _Args>
using UnorderedMap = std::unordered_map<_Kty, _Ty, _Args...>; using UnorderedMap = std::unordered_map<_Kty, _Ty, _Args...>;
/// \~chinese /// \~chinese
/// @brief 函数封装器 /// @brief 函数封装器
/// @par
/// 使用函数封装器可以储存、复制和调用任何可调用目标,示例代码如下:
/// @code
/// Function<bool(int)> func1 = StaticFunc; // bool
/// StaticFunc(int x);
/// Function<bool(int)> func2 = Closure(&t, &T::Func); // bool
/// T::Func(int x);
/// Function<bool(int)> func3 = T::StaticFunc; // static bool
/// T::StaticFunc(int x);
/// Function<bool(int)> func4 = [](int x) -> bool {}; // Lambda function
/// Function<bool(int)> func5 = std::bind(&T::Func, &t); // std::bind
/// Function<bool(int)> func5 = Callable(); // Callable
/// objects: struct Callable { bool operator()(int x) {} };
/// @endcode
template <typename _FuncTy> template <typename _FuncTy>
using Function = oc::function<_FuncTy>; using Function = oc::function<_FuncTy>;
/// \~chinese /// \~chinese
/// @brief 单值容器 /// @brief 单值容器
using Any = oc::any; using Any = oc::any;
/// \~chinese /// \~chinese
/// @brief JSON对象容器 /// @brief 侵入式链表容器
using Json = oc::basic_json<Map, Vector, String, int, double, bool, std::allocator>;
/// \~chinese
/// @brief 侵入式链表容器
template <typename _Ty> template <typename _Ty>
using IntrusiveList = oc::intrusive_list<_Ty>; using IntrusiveList = oc::intrusive_list<_Ty>;
/// \~chinese /// \~chinese
/// @brief 侵入式链表元素 /// @brief 侵入式链表元素
template <typename _Ty> template <typename _Ty>
using IntrusiveListItem = oc::intrusive_list_item<_Ty>; using IntrusiveListItem = oc::intrusive_list_item<_Ty>;
/// \~chinese /// \~chinese
/// @brief 侵入式智能指针 /// @brief 侵入式智能指针
template <typename _Ty, typename _RefProxyTy> template <typename _Ty, typename _RefProxyTy>
using IntrusivePtr = oc::intrusive_ptr<_Ty, _RefProxyTy>; using IntrusivePtr = oc::intrusive_ptr<_Ty, _RefProxyTy>;
/// \~chinese /// \~chinese
/// @brief 不可拷贝对象 /// @brief JSON对象容器
using Json = nlohmann::basic_json<Map, Vector, String>;
/// \~chinese
/// @brief 不可拷贝对象
using Noncopyable = oc::noncopyable; using Noncopyable = oc::noncopyable;
/// \~chinese /// \~chinese
/// @brief 闭包函数 /// @brief 闭包函数
template <typename _Ty, typename _Uty, typename _Ret, typename... _Args> template <typename _Ty, typename _Uty, typename _Ret, typename... _Args>
inline Function<_Ret(_Args...)> Closure(_Uty* ptr, _Ret (_Ty::*func)(_Args...)) inline Function<_Ret(_Args...)> Closure(_Uty* ptr, _Ret (_Ty::*func)(_Args...))
{ {
@ -145,20 +146,43 @@ inline Function<_Ret(_Args...)> Closure(_Uty* ptr, _Ret (_Ty::*func)(_Args...))
} }
/// \~chinese /// \~chinese
/// @brief 闭包函数 /// @brief 闭包函数
template <typename _Ty, typename _Uty, typename _Ret, typename... _Args> template <typename _Ty, typename _Uty, typename _Ret, typename... _Args>
inline Function<_Ret(_Args...)> Closure(_Uty* ptr, _Ret (_Ty::*func)(_Args...) const) inline Function<_Ret(_Args...)> Closure(_Uty* ptr, _Ret (_Ty::*func)(_Args...) const)
{ {
return oc::closure(ptr, func); return oc::closure(ptr, func);
} }
inline ByteString WideToMultiByte(const String& str) #if defined(KGE_WIN32)
inline String WideToMultiByte(const WideString& str)
{ {
return oc::wide_to_string(str); int chars_num = ::WideCharToMultiByte(CP_UTF8, 0, str.c_str(), -1, NULL, 0, NULL, NULL);
if (chars_num)
{
String result;
result.resize(chars_num);
::WideCharToMultiByte(CP_UTF8, 0, str.c_str(), -1, &result[0], chars_num, NULL, NULL);
return result;
}
return String();
} }
inline String MultiByteToWide(const ByteString& str) inline WideString MultiByteToWide(const String& str)
{ {
return oc::string_to_wide(str); int wchars_num = ::MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0);
if (wchars_num)
{
WideString result;
result.resize(wchars_num);
::MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, &result[0], wchars_num);
return result;
} }
return WideString();
}
#endif // KGE_WIN32
} // namespace kiwano } // namespace kiwano

View File

@ -29,17 +29,17 @@ class Event;
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API ComponentBase class KGE_API ComponentBase
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 启动组件 /// @brief 启动组件
virtual void SetupComponent() = 0; virtual void SetupComponent() = 0;
/// \~chinese /// \~chinese
/// @brief 销毁组件 /// @brief 销毁组件
virtual void DestroyComponent() = 0; virtual void DestroyComponent() = 0;
bool Check(const int flag); bool Check(const int flag);
@ -53,22 +53,22 @@ protected:
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API RenderComponent : public virtual ComponentBase class KGE_API RenderComponent : public virtual ComponentBase
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 渲染前 /// @brief 渲染前
virtual void BeforeRender() {} virtual void BeforeRender() {}
/// \~chinese /// \~chinese
/// @brief 渲染时 /// @brief 渲染时
/// @param ctx 渲染上下文 /// @param ctx 渲染上下文
virtual void OnRender(RenderContext& ctx) {} virtual void OnRender(RenderContext& ctx) {}
/// \~chinese /// \~chinese
/// @brief 渲染后 /// @brief 渲染后
virtual void AfterRender() {} virtual void AfterRender() {}
public: public:
@ -79,22 +79,22 @@ public:
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API UpdateComponent : public virtual ComponentBase class KGE_API UpdateComponent : public virtual ComponentBase
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 更新前 /// @brief 更新前
virtual void BeforeUpdate() {} virtual void BeforeUpdate() {}
/// \~chinese /// \~chinese
/// @brief 更新时 /// @brief 更新时
/// @param dt 间隔时间 /// @param dt 间隔时间
virtual void OnUpdate(Duration dt) {} virtual void OnUpdate(Duration dt) {}
/// \~chinese /// \~chinese
/// @brief 更新后 /// @brief 更新后
virtual void AfterUpdate() {} virtual void AfterUpdate() {}
public: public:
@ -105,14 +105,14 @@ public:
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API EventComponent : public virtual ComponentBase class KGE_API EventComponent : public virtual ComponentBase
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 事件处理 /// @brief 事件处理
/// @param evt 事件 /// @param evt 事件
virtual void HandleEvent(Event* evt) {} virtual void HandleEvent(Event* evt) {}
public: public:

View File

@ -28,8 +28,8 @@ namespace kiwano
{ {
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @details * @details
* @see kiwano::Stage * @see kiwano::Stage
*/ */
class KGE_API Director class KGE_API Director
@ -43,51 +43,51 @@ class KGE_API Director
public: public:
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @param[in] stage * @param[in] stage
* @param[in] transition * @param[in] transition
*/ */
void EnterStage(StagePtr stage, TransitionPtr transition = nullptr); void EnterStage(StagePtr stage, TransitionPtr transition = nullptr);
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @param[in] stage * @param[in] stage
* @param[in] transition * @param[in] transition
*/ */
void PushStage(StagePtr stage, TransitionPtr transition = nullptr); void PushStage(StagePtr stage, TransitionPtr transition = nullptr);
/** /**
* \~chinese * \~chinese
* @brief 退 * @brief 退
* @param[in] transition * @param[in] transition
*/ */
void PopStage(TransitionPtr transition = nullptr); void PopStage(TransitionPtr transition = nullptr);
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @return * @return
*/ */
StagePtr GetCurrentStage(); StagePtr GetCurrentStage();
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @param enabled * @param enabled
*/ */
void SetRenderBorderEnabled(bool enabled); void SetRenderBorderEnabled(bool enabled);
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @param show * @param show
*/ */
void ShowDebugInfo(bool show = true); void ShowDebugInfo(bool show = true);
/** /**
* \~chinese * \~chinese
* @brief 退 * @brief 退
*/ */
void ClearStages(); void ClearStages();

View File

@ -25,40 +25,40 @@ namespace kiwano
{ {
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API EventDispatcher class KGE_API EventDispatcher
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 监听器列表 /// @brief 监听器列表
using Listeners = IntrusiveList<EventListenerPtr>; using Listeners = IntrusiveList<EventListenerPtr>;
/// \~chinese /// \~chinese
/// @brief 添加监听器 /// @brief 添加监听器
EventListener* AddListener(EventListenerPtr listener); EventListener* AddListener(EventListenerPtr listener);
/// \~chinese /// \~chinese
/// @brief 添加监听器 /// @brief 添加监听器
EventListener* AddListener(EventListener* listener); EventListener* AddListener(EventListener* listener);
/// \~chinese /// \~chinese
/// @brief 添加监听器 /// @brief 添加监听器
/// @param type 监听的事件类型 /// @param type 监听的事件类型
/// @param callback 回调函数 /// @param callback 回调函数
EventListener* AddListener(EventType type, EventListener::Callback callback); EventListener* AddListener(EventType type, EventListener::Callback callback);
/// \~chinese /// \~chinese
/// @brief 添加监听器 /// @brief 添加监听器
/// @param name 监听器名称 /// @param name 监听器名称
/// @param type 监听的事件类型 /// @param type 监听的事件类型
/// @param callback 回调函数 /// @param callback 回调函数
EventListener* AddListener(String const& name, EventType type, EventListener::Callback callback); EventListener* AddListener(String const& name, EventType type, EventListener::Callback callback);
/// \~chinese /// \~chinese
/// @brief 添加监听器 /// @brief 添加监听器
/// @tparam _EventTy 事件类型 /// @tparam _EventTy 事件类型
/// @param callback 回调函数 /// @param callback 回调函数
template <typename _EventTy, typename = typename std::enable_if<IsEvent<_EventTy>::value, int>::type> template <typename _EventTy, typename = typename std::enable_if<IsEvent<_EventTy>::value, int>::type>
EventListener* AddListener(EventListener::Callback callback) EventListener* AddListener(EventListener::Callback callback)
{ {
@ -66,10 +66,10 @@ public:
} }
/// \~chinese /// \~chinese
/// @brief 添加监听器 /// @brief 添加监听器
/// @tparam _EventTy 事件类型 /// @tparam _EventTy 事件类型
/// @param name 监听器名称 /// @param name 监听器名称
/// @param callback 回调函数 /// @param callback 回调函数
template <typename _EventTy, typename = typename std::enable_if<IsEvent<_EventTy>::value, int>> template <typename _EventTy, typename = typename std::enable_if<IsEvent<_EventTy>::value, int>>
EventListener* AddListener(String const& name, EventListener::Callback callback) EventListener* AddListener(String const& name, EventListener::Callback callback)
{ {
@ -77,55 +77,55 @@ public:
} }
/// \~chinese /// \~chinese
/// @brief 启动监听器 /// @brief 启动监听器
/// @param name 监听器名称 /// @param name 监听器名称
void StartListeners(String const& name); void StartListeners(String const& name);
/// \~chinese /// \~chinese
/// @brief 停止监听器 /// @brief 停止监听器
/// @param name 监听器名称 /// @param name 监听器名称
void StopListeners(String const& name); void StopListeners(String const& name);
/// \~chinese /// \~chinese
/// @brief 移除监听器 /// @brief 移除监听器
/// @param name 监听器名称 /// @param name 监听器名称
void RemoveListeners(String const& name); void RemoveListeners(String const& name);
/// \~chinese /// \~chinese
/// @brief 启动监听器 /// @brief 启动监听器
/// @param type 监听的事件类型 /// @param type 监听的事件类型
void StartListeners(const EventType& type); void StartListeners(const EventType& type);
/// \~chinese /// \~chinese
/// @brief 停止监听器 /// @brief 停止监听器
/// @param type 监听的事件类型 /// @param type 监听的事件类型
void StopListeners(const EventType& type); void StopListeners(const EventType& type);
/// \~chinese /// \~chinese
/// @brief 移除监听器 /// @brief 移除监听器
/// @param type 监听的事件类型 /// @param type 监听的事件类型
void RemoveListeners(const EventType& type); void RemoveListeners(const EventType& type);
/// \~chinese /// \~chinese
/// @brief 启动所有监听器 /// @brief 启动所有监听器
void StartAllListeners(); void StartAllListeners();
/// \~chinese /// \~chinese
/// @brief 停止所有监听器 /// @brief 停止所有监听器
void StopAllListeners(); void StopAllListeners();
/// \~chinese /// \~chinese
/// @brief 移除所有监听器 /// @brief 移除所有监听器
void RemoveAllListeners(); void RemoveAllListeners();
/// \~chinese /// \~chinese
/// @brief 获取所有监听器 /// @brief 获取所有监听器
const Listeners& GetAllListeners() const; const Listeners& GetAllListeners() const;
/// \~chinese /// \~chinese
/// @brief 分发事件 /// @brief 分发事件
/// @param evt 事件 /// @param evt 事件
/// @return 是否继续分发该事件 /// @return 是否继续分发该事件
bool DispatchEvent(Event* evt); bool DispatchEvent(Event* evt);
private: private:

View File

@ -35,7 +35,7 @@ KGE_DECLARE_SMART_PTR(EventListener);
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API EventListener class KGE_API EventListener
: public virtual ObjectBase : public virtual ObjectBase
@ -46,26 +46,26 @@ class KGE_API EventListener
public: public:
/// \~chinese /// \~chinese
/// @brief 监听器回调函数 /// @brief 监听器回调函数
using Callback = Function<void(Event*)>; using Callback = Function<void(Event*)>;
/// \~chinese /// \~chinese
/// @brief 创建监听器 /// @brief 创建监听器
/// @param type 监听的事件类型 /// @param type 监听的事件类型
/// @param callback 回调函数 /// @param callback 回调函数
static EventListenerPtr Create(EventType type, Callback const& callback); static EventListenerPtr Create(EventType type, Callback const& callback);
/// \~chinese /// \~chinese
/// @brief 创建监听器 /// @brief 创建监听器
/// @param name 监听器名称 /// @param name 监听器名称
/// @param type 监听的事件类型 /// @param type 监听的事件类型
/// @param callback 回调函数 /// @param callback 回调函数
static EventListenerPtr Create(String const& name, EventType type, Callback const& callback); static EventListenerPtr Create(String const& name, EventType type, Callback const& callback);
/// \~chinese /// \~chinese
/// @brief 创建监听器 /// @brief 创建监听器
/// @tparam _EventTy 事件类型 /// @tparam _EventTy 事件类型
/// @param callback 回调函数 /// @param callback 回调函数
template <typename _EventTy, typename = typename std::enable_if<IsEvent<_EventTy>::value, int>::type> template <typename _EventTy, typename = typename std::enable_if<IsEvent<_EventTy>::value, int>::type>
static inline EventListenerPtr Create(Callback const& callback) static inline EventListenerPtr Create(Callback const& callback)
{ {
@ -73,10 +73,10 @@ public:
} }
/// \~chinese /// \~chinese
/// @brief 创建监听器 /// @brief 创建监听器
/// @tparam _EventTy 事件类型 /// @tparam _EventTy 事件类型
/// @param name 监听器名称 /// @param name 监听器名称
/// @param callback 回调函数 /// @param callback 回调函数
template <typename _EventTy, typename = typename std::enable_if<IsEvent<_EventTy>::value, int>::type> template <typename _EventTy, typename = typename std::enable_if<IsEvent<_EventTy>::value, int>::type>
static inline EventListenerPtr Create(String const& name, Callback const& callback) static inline EventListenerPtr Create(String const& name, Callback const& callback)
{ {
@ -88,53 +88,53 @@ public:
virtual ~EventListener(); virtual ~EventListener();
/// \~chinese /// \~chinese
/// @brief 启动监听器 /// @brief 启动监听器
void Start(); void Start();
/// \~chinese /// \~chinese
/// @brief 停止监听器 /// @brief 停止监听器
void Stop(); void Stop();
/// \~chinese /// \~chinese
/// @brief 移除监听器 /// @brief 移除监听器
void Remove(); void Remove();
/// \~chinese /// \~chinese
/// @brief 是否正在运行 /// @brief 是否正在运行
bool IsRunning() const; bool IsRunning() const;
/// \~chinese /// \~chinese
/// @brief 是否可移除 /// @brief 是否可移除
bool IsRemoveable() const; bool IsRemoveable() const;
/// \~chinese /// \~chinese
/// @brief 是否开启消息吞没 /// @brief 是否开启消息吞没
bool IsSwallowEnabled() const; bool IsSwallowEnabled() const;
/// \~chinese /// \~chinese
/// @brief 设置消息吞没功能 /// @brief 设置消息吞没功能
/// @param enabled 是否启用 /// @param enabled 是否启用
void SetSwallowEnabled(bool enabled); void SetSwallowEnabled(bool enabled);
/// \~chinese /// \~chinese
/// @brief 获取回调函数 /// @brief 获取回调函数
const Callback& GetCallback() const; const Callback& GetCallback() const;
/// \~chinese /// \~chinese
/// @brief 设置回调函数 /// @brief 设置回调函数
void SetCallback(Callback const& cb); void SetCallback(Callback const& cb);
/// \~chinese /// \~chinese
/// @brief 获取监听的事件类型 /// @brief 获取监听的事件类型
EventType GetEventType() const; EventType GetEventType() const;
/// \~chinese /// \~chinese
/// @brief 设置监听的事件类型 /// @brief 设置监听的事件类型
void SetEventType(EventType const& type); void SetEventType(EventType const& type);
/// \~chinese /// \~chinese
/// @brief 设置监听的事件类型 /// @brief 设置监听的事件类型
/// @tparam _EventTy 事件类型 /// @tparam _EventTy 事件类型
template <typename _EventTy, typename = typename std::enable_if<IsEvent<_EventTy>::value, int>::type> template <typename _EventTy, typename = typename std::enable_if<IsEvent<_EventTy>::value, int>::type>
inline void SetEventType() inline void SetEventType()
{ {
@ -142,7 +142,7 @@ public:
} }
/// \~chinese /// \~chinese
/// @brief 接收消息 /// @brief 接收消息
void Receive(Event* evt); void Receive(Event* evt);
private: private:

View File

@ -0,0 +1,60 @@
// 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/core/Exception.h>
namespace kiwano
{
Exception::Exception()
{
}
Exception::Exception(String const& message)
: message_(message)
{
}
Exception::~Exception()
{
}
const String& Exception::ToString() const
{
return message_;
}
const char* Exception::what() const
{
return message_.c_str();
}
SystemException::SystemException()
: code_(0)
{
}
SystemException::SystemException(ErrorCodeType code, String const& message)
: Exception(message)
, code_(code)
{
}
} // namespace kiwano

View File

@ -0,0 +1,91 @@
// 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/core/Common.h>
#include <kiwano/macros.h>
#include <stdexcept>
namespace kiwano
{
/**
* \~chinese
* @brief
*/
class KGE_API Exception : public std::exception
{
public:
Exception();
/// \~chinese
/// @brief 构造异常
/// @param message 描述异常的信息
explicit Exception(String const& message);
virtual ~Exception();
/// \~chinese
/// @brief 转为解释性字符串
const String& ToString() const;
/// \~chinese
/// @brief 转为解释性字符串
virtual const char* what() const override;
protected:
String message_;
};
/**
* \~chinese
* @brief
*/
class SystemException : public Exception
{
public:
#if defined(KGE_WIN32)
/// \~chinese
/// @brief 错误代码类型
typedef HRESULT ErrorCodeType;
#endif
SystemException();
/// \~chinese
/// @brief 构造系统异常
/// @param code 错误代码
/// @param message 描述异常的信息
SystemException(ErrorCodeType code, String const& message);
/// \~chinese
/// @brief 获取错误代码
ErrorCodeType GetErrorCode() const;
private:
ErrorCodeType code_;
};
inline SystemException::ErrorCodeType SystemException::GetErrorCode() const
{
return code_;
}
} // namespace kiwano

View File

@ -24,97 +24,97 @@
namespace kiwano namespace kiwano
{ {
/// \~chinese /// \~chinese
/// @brief 鼠标按键 /// @brief 鼠标按键
enum class MouseButton enum class MouseButton
{ {
Left, ///< 鼠标左键 Left, ///< 鼠标左键
Right, ///< 鼠标右键 Right, ///< 鼠标右键
Middle, ///< 鼠标中键 Middle, ///< 鼠标中键
Last Last
}; };
/// \~chinese /// \~chinese
/// @brief 按键键值 /// @brief 按键键值
enum class KeyCode enum class KeyCode
{ {
Unknown, ///< 未知 Unknown, ///< 未知
Up, ///< 上键 Up, ///< 上键
Left, ///< 左键 Left, ///< 左键
Right, ///< 右键 Right, ///< 右键
Down, ///< 下键 Down, ///< 下键
Enter, ///< 回车键 Enter, ///< 回车键
Space, ///< 空格键 Space, ///< 空格键
Esc, ///< 退出键 Esc, ///< 退出键
Ctrl, ///< CTRL键 Ctrl, ///< CTRL键
Shift, ///< SHIFT键 Shift, ///< SHIFT键
Alt, ///< ALT键 Alt, ///< ALT键
Tab, ///< TAB键 Tab, ///< TAB键
Delete, ///< 删除键 Delete, ///< 删除键
Back, ///< 退格键 Back, ///< 退格键
Super, ///< Cmd|Super|Windows键 Super, ///< Cmd|Super|Windows键
A, ///< A键 A, ///< A键
B, ///< B键 B, ///< B键
C, ///< C键 C, ///< C键
D, ///< D键 D, ///< D键
E, ///< E键 E, ///< E键
F, ///< F键 F, ///< F键
G, ///< G键 G, ///< G键
H, ///< H键 H, ///< H键
I, ///< I键 I, ///< I键
J, ///< J键 J, ///< J键
K, ///< K键 K, ///< K键
L, ///< L键 L, ///< L键
M, ///< M键 M, ///< M键
N, ///< N键 N, ///< N键
O, ///< O键 O, ///< O键
P, ///< P键 P, ///< P键
Q, ///< Q键 Q, ///< Q键
R, ///< R键 R, ///< R键
S, ///< S键 S, ///< S键
T, ///< T键 T, ///< T键
U, ///< U键 U, ///< U键
V, ///< V键 V, ///< V键
W, ///< W键 W, ///< W键
X, ///< X键 X, ///< X键
Y, ///< Y键 Y, ///< Y键
Z, ///< Z键 Z, ///< Z键
Num0, ///< 数字0键 Num0, ///< 数字0键
Num1, ///< 数字1键 Num1, ///< 数字1键
Num2, ///< 数字2键 Num2, ///< 数字2键
Num3, ///< 数字3键 Num3, ///< 数字3键
Num4, ///< 数字4键 Num4, ///< 数字4键
Num5, ///< 数字5键 Num5, ///< 数字5键
Num6, ///< 数字6键 Num6, ///< 数字6键
Num7, ///< 数字7键 Num7, ///< 数字7键
Num8, ///< 数字8键 Num8, ///< 数字8键
Num9, ///< 数字9键 Num9, ///< 数字9键
Numpad0, ///< 数字小键盘0键 Numpad0, ///< 数字小键盘0键
Numpad1, ///< 数字小键盘1键 Numpad1, ///< 数字小键盘1键
Numpad2, ///< 数字小键盘2键 Numpad2, ///< 数字小键盘2键
Numpad3, ///< 数字小键盘3键 Numpad3, ///< 数字小键盘3键
Numpad4, ///< 数字小键盘4键 Numpad4, ///< 数字小键盘4键
Numpad5, ///< 数字小键盘5键 Numpad5, ///< 数字小键盘5键
Numpad6, ///< 数字小键盘6键 Numpad6, ///< 数字小键盘6键
Numpad7, ///< 数字小键盘7键 Numpad7, ///< 数字小键盘7键
Numpad8, ///< 数字小键盘8键 Numpad8, ///< 数字小键盘8键
Numpad9, ///< 数字小键盘9键 Numpad9, ///< 数字小键盘9键
F1, ///< F1键 F1, ///< F1键
F2, ///< F2键 F2, ///< F2键
F3, ///< F3键 F3, ///< F3键
F4, ///< F4键 F4, ///< F4键
F5, ///< F5键 F5, ///< F5键
F6, ///< F6键 F6, ///< F6键
F7, ///< F7键 F7, ///< F7键
F8, ///< F8键 F8, ///< F8键
F9, ///< F9键 F9, ///< F9键
F10, ///< F10键 F10, ///< F10键
F11, ///< F11键 F11, ///< F11键
F12, ///< F12键 F12, ///< F12键
Last Last
}; };

View File

@ -40,12 +40,6 @@ Library::~Library()
} }
bool Library::Load(String const& lib) bool Library::Load(String const& lib)
{
instance_ = ::LoadLibraryW(lib.c_str());
return IsValid();
}
bool Library::Load(ByteString const& lib)
{ {
instance_ = ::LoadLibraryA(lib.c_str()); instance_ = ::LoadLibraryA(lib.c_str());
return IsValid(); return IsValid();
@ -65,7 +59,7 @@ void Library::Free()
} }
} }
FARPROC Library::GetProcess(ByteString const& proc_name) FARPROC Library::GetProcess(String const& proc_name)
{ {
KGE_ASSERT(instance_ != nullptr); KGE_ASSERT(instance_ != nullptr);

View File

@ -20,56 +20,50 @@
#pragma once #pragma once
#include <kiwano/core/Common.h> #include <kiwano/core/Common.h>
#include <kiwano/macros.h>
namespace kiwano namespace kiwano
{ {
/** /**
* \~chinese * \~chinese
* @brief DLL库 * @brief DLL库
*/ */
class KGE_API Library class KGE_API Library
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 构造DLL库 /// @brief 构造DLL库
Library(); Library();
/// \~chinese /// \~chinese
/// @brief 构造DLL库 /// @brief 构造DLL库
/// @param lib DLL文件路径 /// @param lib DLL文件路径
Library(String const& lib); Library(String const& lib);
virtual ~Library(); virtual ~Library();
/// \~chinese /// \~chinese
/// @brief 加载DLL /// @brief 加载DLL
/// @param lib DLL文件路径 /// @param lib DLL文件路径
bool Load(String const& lib); bool Load(String const& lib);
/// \~chinese /// \~chinese
/// @brief 加载DLL /// @brief 是否有效
/// @param lib DLL文件路径
bool Load(ByteString const& lib);
/// \~chinese
/// @brief 是否有效
bool IsValid() const; bool IsValid() const;
/// \~chinese /// \~chinese
/// @brief 释放DLL /// @brief 释放DLL
void Free(); void Free();
/// \~chinese /// \~chinese
/// @brief 检索指定的DLL中的输出库函数地址 /// @brief 检索指定的DLL中的输出库函数地址
/// @param proc_name 函数名 /// @param proc_name 函数名
FARPROC GetProcess(ByteString const& proc_name); FARPROC GetProcess(String const& proc_name);
/// \~chinese /// \~chinese
/// @brief 检索指定的DLL中的输出库函数地址 /// @brief 检索指定的DLL中的输出库函数地址
/// @param proc_name 函数名 /// @param proc_name 函数名
template <typename _Proc> template <typename _Proc>
inline _Proc GetProcess(ByteString const& proc_name) inline _Proc GetProcess(String const& proc_name)
{ {
return reinterpret_cast<_Proc>(GetProcess(proc_name)); return reinterpret_cast<_Proc>(GetProcess(proc_name));
} }

View File

@ -141,7 +141,7 @@ const WORD reset = white;
} // namespace console_colors } // namespace console_colors
#define DECLARE_HANDLE_COLOR(NAME, HANDLE_NAME, COLOR) \ #define DECLARE_HANDLE_COLOR(NAME, HANDLE_NAME, COLOR) \
inline std::wostream&(NAME)(std::wostream & _out) \ inline OutputStream&(NAME)(OutputStream & _out) \
{ \ { \
::SetConsoleTextAttribute(::GetStdHandle(HANDLE_NAME), console_colors::##COLOR); \ ::SetConsoleTextAttribute(::GetStdHandle(HANDLE_NAME), console_colors::##COLOR); \
return _out; \ return _out; \
@ -175,8 +175,8 @@ Logger::Logger()
: enabled_(true) : enabled_(true)
, default_stdout_color_(0) , default_stdout_color_(0)
, default_stderr_color_(0) , default_stderr_color_(0)
, output_stream_(std::wcout.rdbuf()) , output_stream_(std::cout.rdbuf())
, error_stream_(std::wcerr.rdbuf()) , error_stream_(std::cerr.rdbuf())
{ {
ResetOutputStream(); ResetOutputStream();
} }
@ -186,7 +186,7 @@ Logger::~Logger()
FreeAllocatedConsole(); FreeAllocatedConsole();
} }
void Logger::Printf(Level level, const wchar_t* format, ...) void Logger::Printf(Level level, const char* format, ...)
{ {
if (!enabled_) if (!enabled_)
return; return;
@ -200,11 +200,11 @@ void Logger::Printf(Level level, const wchar_t* format, ...)
va_list args = nullptr; va_list args = nullptr;
va_start(args, format); va_start(args, format);
static wchar_t temp_buffer[1024 * 3 + 1]; static char temp_buffer[1024 * 3 + 1];
const auto len = ::_vscwprintf(format, args) + 1; const auto len = ::_vscprintf(format, args) + 1;
::_vsnwprintf_s(temp_buffer, len, len, format, args); ::_vsnprintf_s(temp_buffer, len, len, format, args);
sstream << ' ' << temp_buffer << L"\r\n"; sstream << ' ' << temp_buffer << "\r\n";
va_end(args); va_end(args);
} }
@ -219,16 +219,16 @@ void Logger::Prepare(Level level, StringStream& sstream)
switch (level) switch (level)
{ {
case Level::Info: case Level::Info:
prefix = L"[INFO] "; prefix = "[INFO] ";
break; break;
case Level::System: case Level::System:
prefix = L"[SYSTEM] "; prefix = "[SYSTEM] ";
break; break;
case Level::Warning: case Level::Warning:
prefix = L"[WARN] "; prefix = "[WARN] ";
break; break;
case Level::Error: case Level::Error:
prefix = L"[ERROR] "; prefix = "[ERROR] ";
break; break;
} }
@ -236,11 +236,13 @@ void Logger::Prepare(Level level, StringStream& sstream)
time_t unix = std::time(nullptr); time_t unix = std::time(nullptr);
std::tm tmbuf; std::tm tmbuf;
localtime_s(&tmbuf, &unix); localtime_s(&tmbuf, &unix);
sstream << prefix << std::put_time(&tmbuf, L"%H:%M:%S "); sstream << prefix << std::put_time(&tmbuf, "%H:%M:%S ");
} }
void Logger::Output(Level level, StringStream& sstream) void Logger::Output(Level level, StringStream& sstream)
{ {
using ConsoleColor = Function<OutputStream&(OutputStream&)>;
OutputStream* ostream = nullptr; OutputStream* ostream = nullptr;
ConsoleColor color = nullptr; ConsoleColor color = nullptr;
@ -269,7 +271,7 @@ void Logger::Output(Level level, StringStream& sstream)
{ {
auto output = sstream.str(); auto output = sstream.str();
color(*ostream) << output << std::flush; color(*ostream) << output << std::flush;
::OutputDebugStringW(output.c_str()); ::OutputDebugStringA(output.c_str());
ResetConsoleColor(); ResetConsoleColor();
} }
@ -297,20 +299,20 @@ void Logger::ResetOutputStream()
// replace the C++ global locale with the user-preferred locale // replace the C++ global locale with the user-preferred locale
(void)std::locale::global(std::locale("")); (void)std::locale::global(std::locale(""));
(void)std::wcout.imbue(std::locale()); (void)std::cout.imbue(std::locale());
(void)std::wcerr.imbue(std::locale()); (void)std::cerr.imbue(std::locale());
RedirectOutputStreamBuffer(std::wcout.rdbuf()); RedirectOutputStreamBuffer(std::cout.rdbuf());
RedirectErrorStreamBuffer(std::wcerr.rdbuf()); RedirectErrorStreamBuffer(std::cerr.rdbuf());
} }
} }
std::wstreambuf* Logger::RedirectOutputStreamBuffer(std::wstreambuf* buf) std::streambuf* Logger::RedirectOutputStreamBuffer(std::streambuf* buf)
{ {
return output_stream_.rdbuf(buf); return output_stream_.rdbuf(buf);
} }
std::wstreambuf* Logger::RedirectErrorStreamBuffer(std::wstreambuf* buf) std::streambuf* Logger::RedirectErrorStreamBuffer(std::streambuf* buf)
{ {
return error_stream_.rdbuf(buf); return error_stream_.rdbuf(buf);
} }
@ -329,7 +331,7 @@ void Logger::ShowConsole(bool show)
HWND console = ::AllocateConsole(); HWND console = ::AllocateConsole();
if (!console) if (!console)
{ {
KGE_WARN(L"AllocConsole failed"); KGE_WARN("AllocConsole failed");
} }
else else
{ {

View File

@ -27,33 +27,33 @@
#ifndef KGE_SYS_LOG #ifndef KGE_SYS_LOG
#ifdef KGE_DEBUG #ifdef KGE_DEBUG
#define KGE_SYS_LOG(FORMAT, ...) \ #define KGE_SYS_LOG(FORMAT, ...) \
::kiwano::Logger::Instance().Printf(::kiwano::Logger::Level::System, FORMAT, __VA_ARGS__) ::kiwano::Logger::GetInstance().Printf(::kiwano::Logger::Level::System, FORMAT, __VA_ARGS__)
#else #else
#define KGE_SYS_LOG __noop #define KGE_SYS_LOG __noop
#endif #endif
#endif #endif
#ifndef KGE_WARN #ifndef KGE_WARN
#define KGE_WARN(FORMAT, ...) ::kiwano::Logger::Instance().Printf(::kiwano::Logger::Level::Warning, FORMAT, __VA_ARGS__) #define KGE_WARN(FORMAT, ...) ::kiwano::Logger::GetInstance().Printf(::kiwano::Logger::Level::Warning, FORMAT, __VA_ARGS__)
#endif #endif
#ifndef KGE_ERROR #ifndef KGE_ERROR
#define KGE_ERROR(FORMAT, ...) ::kiwano::Logger::Instance().Printf(::kiwano::Logger::Level::Error, FORMAT, __VA_ARGS__) #define KGE_ERROR(FORMAT, ...) ::kiwano::Logger::GetInstance().Printf(::kiwano::Logger::Level::Error, FORMAT, __VA_ARGS__)
#endif #endif
#ifndef KGE_LOG #ifndef KGE_LOG
#define KGE_LOG(...) ::kiwano::Logger::Instance().Println(::kiwano::Logger::Level::Info, __VA_ARGS__) #define KGE_LOG(...) ::kiwano::Logger::GetInstance().Println(::kiwano::Logger::Level::Info, __VA_ARGS__)
#endif #endif
#ifndef KGE_LOGF #ifndef KGE_LOGF
#define KGE_LOGF(FORMAT, ...) ::kiwano::Logger::Instance().Printf(::kiwano::Logger::Level::Info, FORMAT, __VA_ARGS__) #define KGE_LOGF(FORMAT, ...) ::kiwano::Logger::GetInstance().Printf(::kiwano::Logger::Level::Info, FORMAT, __VA_ARGS__)
#endif #endif
namespace kiwano namespace kiwano
{ {
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API Logger : public Singleton<Logger> class KGE_API Logger : public Singleton<Logger>
{ {
@ -61,74 +61,66 @@ class KGE_API Logger : public Singleton<Logger>
public: public:
/// \~chinese /// \~chinese
/// @brief 日志级别 /// @brief 日志级别
enum class Level enum class Level
{ {
Info, ///< 信息 Info, ///< 信息
System, ///< 系统 System, ///< 系统
Warning, ///< 警告 Warning, ///< 警告
Error ///< 错误 Error ///< 错误
}; };
/// \~chinese /// \~chinese
/// @brief 输出流 /// @brief 打印日志
using OutputStream = std::wostream; /// @param level 日志级别
/// @param format 格式字符串
void Printf(Level level, const char* format, ...);
/// \~chinese /// \~chinese
/// @brief 控制台颜色 /// @brief 打印日志
using ConsoleColor = Function<OutputStream&(OutputStream&)>; /// @param level 日志级别
/// @param args 参数
/// \~chinese
/// @brief 打印日志
/// @param level 日志级别
/// @param format 格式字符串
void Printf(Level level, const wchar_t* format, ...);
/// \~chinese
/// @brief 打印日志
/// @param level 日志级别
/// @param args 参数
template <typename... _Args> template <typename... _Args>
void Print(Level level, _Args&&... args); void Print(Level level, _Args&&... args);
/// \~chinese /// \~chinese
/// @brief 打印一行日志 /// @brief 打印一行日志
/// @param level 日志级别 /// @param level 日志级别
/// @param args 参数 /// @param args 参数
template <typename... _Args> template <typename... _Args>
void Println(Level level, _Args&&... args); void Println(Level level, _Args&&... args);
/// \~chinese /// \~chinese
/// @brief 显示或关闭控制台 /// @brief 显示或关闭控制台
/// @note 此操作会重置输出流 /// @note 此操作会重置输出流
void ShowConsole(bool show); void ShowConsole(bool show);
/// \~chinese /// \~chinese
/// @brief 启用日志 /// @brief 启用日志
void Enable(); void Enable();
/// \~chinese /// \~chinese
/// @brief 禁用日志 /// @brief 禁用日志
void Disable(); void Disable();
/// \~chinese /// \~chinese
/// @brief 获取输出流 /// @brief 获取输出流
std::wostream& GetOutputStream(); OutputStream& GetOutputStream();
/// \~chinese /// \~chinese
/// @brief 获取错误流 /// @brief 获取错误流
std::wostream& GetErrorStream(); OutputStream& GetErrorStream();
/// \~chinese /// \~chinese
/// @brief 重定向输出流 /// @brief 重定向输出流
std::wstreambuf* RedirectOutputStreamBuffer(std::wstreambuf* buf); std::streambuf* RedirectOutputStreamBuffer(std::streambuf* buf);
/// \~chinese /// \~chinese
/// @brief 重定向错误流 /// @brief 重定向错误流
std::wstreambuf* RedirectErrorStreamBuffer(std::wstreambuf* buf); std::streambuf* RedirectErrorStreamBuffer(std::streambuf* buf);
/// \~chinese /// \~chinese
/// @brief 重置输出流 /// @brief 重置输出流
void ResetOutputStream(); void ResetOutputStream();
private: private:
@ -190,7 +182,7 @@ void Logger::Println(Level level, _Args&&... args)
// Format message // Format message
(void)std::initializer_list<int>{ ((sstream << ' ' << args), 0)... }; (void)std::initializer_list<int>{ ((sstream << ' ' << args), 0)... };
sstream << L"\r\n"; sstream << "\r\n";
Output(level, sstream); Output(level, sstream);
} }
@ -201,18 +193,18 @@ inline void Logger::ResetConsoleColor() const
::SetConsoleTextAttribute(::GetStdHandle(STD_ERROR_HANDLE), default_stderr_color_); ::SetConsoleTextAttribute(::GetStdHandle(STD_ERROR_HANDLE), default_stderr_color_);
} }
inline Logger::OutputStream& Logger::DefaultOutputColor(OutputStream& out) inline OutputStream& Logger::DefaultOutputColor(OutputStream& out)
{ {
::SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE), default_stdout_color_); ::SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE), default_stdout_color_);
return out; return out;
} }
inline std::wostream& Logger::GetOutputStream() inline OutputStream& Logger::GetOutputStream()
{ {
return output_stream_; return output_stream_;
} }
inline std::wostream& Logger::GetErrorStream() inline OutputStream& Logger::GetErrorStream()
{ {
return error_stream_; return error_stream_;
} }

View File

@ -88,9 +88,8 @@ void ObjectBase::SetName(String const& name)
String ObjectBase::DumpObject() String ObjectBase::DumpObject()
{ {
String name = oc::string_to_wide(typeid(*this).name()); return String::format("{ class=\"%s\" id=%d refcount=%d name=\"%s\" }", typeid(*this).name(), GetObjectID(),
return String::format(L"{ class=\"%s\" id=%d refcount=%d name=\"%s\" }", name.c_str(), GetObjectID(), GetRefCount(), GetRefCount(), GetName().c_str());
GetName().c_str());
} }
bool ObjectBase::IsTracingLeaks() bool ObjectBase::IsTracingLeaks()
@ -110,12 +109,12 @@ void ObjectBase::StopTracingLeaks()
void ObjectBase::DumpTracingObjects() void ObjectBase::DumpTracingObjects()
{ {
KGE_SYS_LOG(L"-------------------------- All Objects --------------------------"); KGE_SYS_LOG("-------------------------- All Objects --------------------------");
for (const auto object : tracing_objects) for (const auto object : tracing_objects)
{ {
KGE_SYS_LOG(L"%s", object->DumpObject().c_str()); KGE_SYS_LOG("%s", object->DumpObject().c_str());
} }
KGE_SYS_LOG(L"------------------------- Total size: %d -------------------------", tracing_objects.size()); KGE_SYS_LOG("------------------------- Total size: %d -------------------------", tracing_objects.size());
} }
Vector<ObjectBase*>& ObjectBase::GetTracingObjects() Vector<ObjectBase*>& ObjectBase::GetTracingObjects()

View File

@ -30,65 +30,65 @@ KGE_DECLARE_SMART_PTR(ObjectBase);
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API ObjectBase : public RefCounter class KGE_API ObjectBase : public RefCounter
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 构造基础对象 /// @brief 构造基础对象
ObjectBase(); ObjectBase();
virtual ~ObjectBase(); virtual ~ObjectBase();
/// \~chinese /// \~chinese
/// @brief 设置对象名 /// @brief 设置对象名
void SetName(String const& name); void SetName(String const& name);
/// \~chinese /// \~chinese
/// @brief 获取对象名 /// @brief 获取对象名
String GetName() const; String GetName() const;
/// \~chinese /// \~chinese
/// @brief 判断对象的名称是否相同 /// @brief 判断对象的名称是否相同
/// @param name 需要判断的名称 /// @param name 需要判断的名称
bool IsName(String const& name) const; bool IsName(String const& name) const;
/// \~chinese /// \~chinese
/// @brief 获取用户数据 /// @brief 获取用户数据
const Any& GetUserData() const; const Any& GetUserData() const;
/// \~chinese /// \~chinese
/// @brief 设置用户数据 /// @brief 设置用户数据
void SetUserData(Any const& data); void SetUserData(Any const& data);
/// \~chinese /// \~chinese
/// @brief 获取对象ID /// @brief 获取对象ID
uint32_t GetObjectID() const; uint32_t GetObjectID() const;
/// \~chinese /// \~chinese
/// @brief 序列化对象 /// @brief 序列化对象
String DumpObject(); String DumpObject();
public: public:
/// \~chinese /// \~chinese
/// @brief 是否启用了内存泄漏追踪 /// @brief 是否启用了内存泄漏追踪
static bool IsTracingLeaks(); static bool IsTracingLeaks();
/// \~chinese /// \~chinese
/// @brief 开始追踪内存泄漏 /// @brief 开始追踪内存泄漏
static void StartTracingLeaks(); static void StartTracingLeaks();
/// \~chinese /// \~chinese
/// @brief 停止追踪内存泄漏 /// @brief 停止追踪内存泄漏
static void StopTracingLeaks(); static void StopTracingLeaks();
/// \~chinese /// \~chinese
/// @brief 打印所有追踪中的对象信息 /// @brief 打印所有追踪中的对象信息
static void DumpTracingObjects(); static void DumpTracingObjects();
/// \~chinese /// \~chinese
/// @brief 获取所有追踪中的对象 /// @brief 获取所有追踪中的对象
static Vector<ObjectBase*>& GetTracingObjects(); static Vector<ObjectBase*>& GetTracingObjects();
private: private:

View File

@ -26,21 +26,21 @@ namespace kiwano
{ {
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API RefCounter : protected Noncopyable class KGE_API RefCounter : protected Noncopyable
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 增加引用计数 /// @brief 增加引用计数
void Retain(); void Retain();
/// \~chinese /// \~chinese
/// @brief 减少引用计数 /// @brief 减少引用计数
void Release(); void Release();
/// \~chinese /// \~chinese
/// @brief 获取引用计数 /// @brief 获取引用计数
long GetRefCount() const; long GetRefCount() const;
protected: protected:

View File

@ -48,28 +48,28 @@ Resource::Data Resource::GetData() const
HRSRC res_info = FindResourceW(nullptr, MAKEINTRESOURCE(id_), type_); HRSRC res_info = FindResourceW(nullptr, MAKEINTRESOURCE(id_), type_);
if (res_info == nullptr) if (res_info == nullptr)
{ {
KGE_ERROR(L"FindResource failed"); KGE_ERROR("FindResource failed");
break; break;
} }
HGLOBAL res_data = LoadResource(nullptr, res_info); HGLOBAL res_data = LoadResource(nullptr, res_info);
if (res_data == nullptr) if (res_data == nullptr)
{ {
KGE_ERROR(L"LoadResource failed"); KGE_ERROR("LoadResource failed");
break; break;
} }
DWORD size = SizeofResource(nullptr, res_info); DWORD size = SizeofResource(nullptr, res_info);
if (size == 0) if (size == 0)
{ {
KGE_ERROR(L"SizeofResource failed"); KGE_ERROR("SizeofResource failed");
break; break;
} }
LPVOID buffer = LockResource(res_data); LPVOID buffer = LockResource(res_data);
if (buffer == nullptr) if (buffer == nullptr)
{ {
KGE_ERROR(L"LockResource failed"); KGE_ERROR("LockResource failed");
break; break;
} }

View File

@ -26,26 +26,26 @@ namespace kiwano
{ {
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @details * @details
* exe * exe
* L"WAVE" * "WAVE"
* IDR_WAVE_1: * IDR_WAVE_1:
* @code * @code
* Resource(IDR_WAVE_1, L"WAVE"); * Resource(IDR_WAVE_1, "WAVE");
* @endcode * @endcode
* : * :
* https://docs.microsoft.com/en-us/windows/desktop/menurc/resources * https://docs.microsoft.com/en-us/windows/desktop/menurc/resources
*/ */
class KGE_API Resource class KGE_API Resource
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 资源的二进制数据 /// @brief 资源的二进制数据
struct Data struct Data
{ {
void* buffer; ///< 资源数据 void* buffer; ///< 资源数据
uint32_t size; ///< 资源数据大小 uint32_t size; ///< 资源数据大小
Data(); Data();
@ -53,26 +53,26 @@ public:
}; };
/// \~chinese /// \~chinese
/// @brief 构造资源 /// @brief 构造资源
Resource(); Resource();
/// \~chinese /// \~chinese
/// @brief 构造资源 /// @brief 构造资源
/// @param id 资源 ID /// @param id 资源 ID
/// @param type 资源类型 /// @param type 资源类型
Resource(uint32_t id, const wchar_t* type); Resource(uint32_t id, const wchar_t* type);
/// \~chinese /// \~chinese
/// @brief 获取资源的二进制数据 /// @brief 获取资源的二进制数据
/// @return 资源数据 /// @return 资源数据
Resource::Data GetData() const; Resource::Data GetData() const;
/// \~chinese /// \~chinese
/// @brief 获取资源 ID /// @brief 获取资源 ID
uint32_t GetId() const; uint32_t GetId() const;
/// \~chinese /// \~chinese
/// @brief 获取资源类型 /// @brief 获取资源类型
const wchar_t* GetType() const; const wchar_t* GetType() const;
private: private:

View File

@ -36,7 +36,7 @@ private:
{ {
ObjectCreator() ObjectCreator()
{ {
(void)Singleton<_Ty>::Instance(); (void)Singleton<_Ty>::GetInstance();
} }
inline void Dummy() const {} inline void Dummy() const {}
@ -46,7 +46,7 @@ private:
public: public:
using object_type = _Ty; using object_type = _Ty;
static inline object_type& Instance() static inline object_type& GetInstance()
{ {
static object_type instance; static object_type instance;
creator_.Dummy(); creator_.Dummy();

View File

@ -26,7 +26,7 @@ namespace kiwano
{ {
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
struct DefaultSmartPtrRefProxy struct DefaultSmartPtrRefProxy
{ {
@ -45,7 +45,7 @@ struct DefaultSmartPtrRefProxy
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
template <typename _Ty> template <typename _Ty>
using SmartPtr = IntrusivePtr<_Ty, DefaultSmartPtrRefProxy>; using SmartPtr = IntrusivePtr<_Ty, DefaultSmartPtrRefProxy>;

View File

@ -18,6 +18,7 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE. // THE SOFTWARE.
#include <kiwano/core/Exception.h>
#include <kiwano/core/Logger.h> #include <kiwano/core/Logger.h>
#include <kiwano/core/Time.h> #include <kiwano/core/Time.h>
#include <regex> #include <regex>
@ -94,12 +95,13 @@ const Duration Duration::Hour = 60 * Duration::Minute;
namespace namespace
{ {
const auto duration_regex = std::wregex(LR"(^[-+]?([0-9]*(\.[0-9]*)?(h|m|s|ms)+)+$)"); const auto duration_regex = std::regex(R"(^[-+]?([0-9]*(\.[0-9]*)?(h|m|s|ms)+)+$)");
typedef std::unordered_map<String, Duration> UnitMap; typedef std::unordered_map<String, Duration> UnitMap;
const auto unit_map = UnitMap{
{ L"ms", Duration::Ms }, { L"s", Duration::Second }, { L"m", Duration::Minute }, { L"h", Duration::Hour } const auto unit_map =
}; UnitMap{ { "ms", Duration::Ms }, { "s", Duration::Second }, { "m", Duration::Minute }, { "h", Duration::Hour } };
} // namespace } // namespace
Duration::Duration() Duration::Duration()
@ -137,14 +139,14 @@ String Duration::ToString() const
{ {
if (IsZero()) if (IsZero())
{ {
return String(L"0s"); return String("0s");
} }
String result; String result;
long total_ms = milliseconds_; long total_ms = milliseconds_;
if (total_ms < 0) if (total_ms < 0)
{ {
result.append(L"-"); result.append("-");
total_ms = -total_ms; total_ms = -total_ms;
} }
@ -155,21 +157,21 @@ String Duration::ToString() const
if (hour) if (hour)
{ {
result.append(String::parse(hour)).append(L"h"); result.append(String::parse(hour)).append("h");
result.append(String::parse(min)).append(L"m"); result.append(String::parse(min)).append("m");
} }
else if (min) else if (min)
{ {
result.append(String::parse(min)).append(L"m"); result.append(String::parse(min)).append("m");
} }
if (ms != 0) if (ms != 0)
{ {
result.append(String::parse(static_cast<float>(sec) + static_cast<float>(ms) / 1000.f)).append(L"s"); result.append(String::parse(static_cast<float>(sec) + static_cast<float>(ms) / 1000.f)).append("s");
} }
else if (sec != 0) else if (sec != 0)
{ {
result.append(String::parse(sec)).append(L"s"); result.append(String::parse(sec)).append("s");
} }
return result; return result;
} }
@ -356,57 +358,59 @@ Duration Duration::Parse(const String& format)
if (!std::regex_match(format.c_str(), duration_regex)) if (!std::regex_match(format.c_str(), duration_regex))
{ {
throw std::runtime_error("Duration::Parse failed, invalid duration"); throw Exception("Duration::Parse failed, invalid duration");
} }
if (format.empty() || format == L"0") if (format.empty() || format == "0")
{ {
return ret; return ret;
} }
// ·ûºÅλ // 符号位
if (format[0] == L'-' || format[0] == L'+') if (format[0] == '-' || format[0] == '+')
{ {
negative = (format[0] == L'-'); negative = (format[0] == '-');
pos++; pos++;
} }
while (pos < len) while (pos < len)
{ {
// ÊýÖµ // 数值
size_t i = pos; size_t i = pos;
for (; i < len; ++i) for (; i < len; ++i)
{ {
wchar_t ch = format[i]; wchar_t ch = format[i];
if (!(ch == L'.' || L'0' <= ch && ch <= L'9')) if (!(ch == '.' || '0' <= ch && ch <= '9'))
{ {
break; break;
} }
} }
String num_str = format.substr(pos, i - pos); String num_str = format.substr(pos, i - pos);
pos = i; pos = i;
if (num_str.empty() || num_str == L".") if (num_str.empty() || num_str == ".")
throw std::runtime_error("Duration::Parse failed, invalid duration"); throw Exception("Duration::Parse failed, invalid duration");
// µ¥Î» // 单位
for (; i < len; ++i) for (; i < len; ++i)
{ {
wchar_t ch = format[i]; wchar_t ch = format[i];
if (ch == L'.' || L'0' <= ch && ch <= L'9') if (ch == '.' || '0' <= ch && ch <= '9')
{ {
break; break;
} }
} }
String unit_str = format.substr(pos, i - pos); String unit_str = format.substr(pos, i - pos);
pos = i; pos = i;
if (unit_map.find(unit_str) == unit_map.end()) if (unit_map.find(unit_str) == unit_map.end())
throw std::runtime_error("Duration::Parse failed, invalid duration"); throw Exception("Duration::Parse failed, invalid duration");
double num = std::wcstod(num_str.c_str(), nullptr); double num = std::stod(num_str.c_str());
Duration unit = unit_map.at(unit_str); Duration unit = unit_map.at(unit_str);
ret += unit * num; ret += unit * num;
} }

View File

@ -26,94 +26,94 @@ namespace kiwano
{ {
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @par * @par
* : * :
* @code * @code
* time::Second * 5 // 5 秒 * time::Second * 5 // 5 秒
* time::Hour * 1.5 // 1.5 小时 * time::Hour * 1.5 // 1.5 小时
* time::Hour * 3 + time::Minute * 45 + time::Second * 15 // 3 小时 45 分 15 * time::Hour * 3 + time::Minute * 45 + time::Second * 15 // 3 小时 45 分 15
* *
* @endcode * @endcode
* VS2015 使 time literals: * VS2015 使 time literals:
* @code * @code
* using namespace kiwano; * using namespace kiwano;
* 5_sec // 5 秒 * 5_sec // 5 秒
* 1.5_hour // 1.5 小时 * 1.5_hour // 1.5 小时
* 3_hour + 45_min + 15_sec // 3 小时 45 分 15 秒 * 3_hour + 45_min + 15_sec // 3 小时 45 分 15 秒
* @endcode * @endcode
*/ */
struct KGE_API Duration struct KGE_API Duration
{ {
/// \~chinese /// \~chinese
/// @brief 构造时间段 /// @brief 构造时间段
Duration(); Duration();
/// \~chinese /// \~chinese
/// @brief 构造时间段 /// @brief 构造时间段
/// @param milliseconds 毫秒数 /// @param milliseconds 毫秒数
Duration(long milliseconds); Duration(long milliseconds);
/// \~chinese /// \~chinese
/// @brief 获取毫秒数 /// @brief 获取毫秒数
long Milliseconds() const; long Milliseconds() const;
/// \~chinese /// \~chinese
/// @brief 获取秒数 /// @brief 获取秒数
float Seconds() const; float Seconds() const;
/// \~chinese /// \~chinese
/// @brief 获取分钟数 /// @brief 获取分钟数
float Minutes() const; float Minutes() const;
/// \~chinese /// \~chinese
/// @brief 获取小时数 /// @brief 获取小时数
float Hours() const; float Hours() const;
/// \~chinese /// \~chinese
/// @brief 时长是否是零 /// @brief 时长是否是零
/// @return 若时长是零返回true /// @return 若时长是零返回true
bool IsZero() const; bool IsZero() const;
/// \~chinese /// \~chinese
/// @brief 设置毫秒数 /// @brief 设置毫秒数
/// @param ms 毫秒数 /// @param ms 毫秒数
void SetMilliseconds(long ms); void SetMilliseconds(long ms);
/// \~chinese /// \~chinese
/// @brief 设置秒数 /// @brief 设置秒数
/// @param seconds 秒数 /// @param seconds 秒数
void SetSeconds(float seconds); void SetSeconds(float seconds);
/// \~chinese /// \~chinese
/// @brief 设置分钟数 /// @brief 设置分钟数
/// @param minutes 分钟数 /// @param minutes 分钟数
void SetMinutes(float minutes); void SetMinutes(float minutes);
/// \~chinese /// \~chinese
/// @brief 设置小时数 /// @brief 设置小时数
/// @param hours 小时数 /// @param hours 小时数
void SetHours(float hours); void SetHours(float hours);
/// \~chinese /// \~chinese
/// @brief 转为字符串 /// @brief 转为字符串
String ToString() const; String ToString() const;
/// \~chinese /// \~chinese
/// @brief 解析时间段字符串 /// @brief 解析时间段字符串
/// @param str 时间段字符串 /// @param str 时间段字符串
/// @details /// @details
/// 时间段字符串允许是有符号的浮点数, 并且带有时间单位后缀 /// 时间段字符串允许是有符号的浮点数, 并且带有时间单位后缀
/// 例如: "300ms", "-1.5h", "2h45m" /// 例如: "300ms", "-1.5h", "2h45m"
/// 允许的时间单位有 "ms", "s", "m", "h" /// 允许的时间单位有 "ms", "s", "m", "h"
/// @return 解析出的时间段 /// @return 解析出的时间段
/// @throw std::runtime_error 传入了一个不合法的格式 /// @throw kiwano::Exception 传入一个不合法的格式时抛出
static Duration Parse(const String& str); static Duration Parse(const String& str);
static const Duration Ms; ///< 毫秒 static const Duration Ms; ///< 毫秒
static const Duration Second; ///< 秒 static const Duration Second; ///< 秒
static const Duration Minute; ///< 分钟 static const Duration Minute; ///< 分钟
static const Duration Hour; ///< 小时 static const Duration Hour; ///< 小时
bool operator==(const Duration&) const; bool operator==(const Duration&) const;
bool operator!=(const Duration&) const; bool operator!=(const Duration&) const;
@ -159,28 +159,28 @@ private:
/** /**
* \~chinese * \~chinese
* @brief * @brief
* @par * @par
* @code * @code
* // 两时间相减, 可得到一个 Duration 对象 * // 两时间相减, 可得到一个 Duration 对象
* Time t1 = Time::Now(); * Time t1 = Time::Now();
* // 等待一段时间后 * // 等待一段时间后
* Time t2 = Time::Now(); * Time t2 = Time::Now();
* int ms = (t2 - t1).Milliseconds(); // 获取两时间相差的毫秒数 * int ms = (t2 - t1).Milliseconds(); // 获取两时间相差的毫秒数
* @endcode * @endcode
* @note * @note
*/ */
struct KGE_API Time struct KGE_API Time
{ {
Time(); Time();
/// \~chinese /// \~chinese
/// @brief 是否是零时 /// @brief 是否是零时
/// @return 若是零时返回true /// @return 若是零时返回true
bool IsZero() const; bool IsZero() const;
/// \~chinese /// \~chinese
/// @brief 获取当前时间 /// @brief 获取当前时间
static Time Now() noexcept; static Time Now() noexcept;
const Duration operator-(const Time&) const; const Duration operator-(const Time&) const;

View File

@ -29,8 +29,8 @@ class TimerManager;
KGE_DECLARE_SMART_PTR(Timer); KGE_DECLARE_SMART_PTR(Timer);
/// \~chinese /// \~chinese
/// @brief 定时器 /// @brief 定时器
/// @details 定时器用于每隔一段时间执行一次回调函数,且可以指定执行总次数 /// @details 定时器用于每隔一段时间执行一次回调函数,且可以指定执行总次数
class KGE_API Timer class KGE_API Timer
: public virtual ObjectBase : public virtual ObjectBase
, protected IntrusiveListItem<TimerPtr> , protected IntrusiveListItem<TimerPtr>
@ -40,85 +40,85 @@ class KGE_API Timer
public: public:
/// \~chinese /// \~chinese
/// @brief 定时器回调函数 /// @brief 定时器回调函数
/// @details /// @details
/// 回调函数第一个参数是定时器自身,第二个参数是距离上次更新的时间间隔 /// 回调函数第一个参数是定时器自身,第二个参数是距离上次更新的时间间隔
using Callback = Function<void(Timer* /* self */, Duration /* dt */)>; using Callback = Function<void(Timer* /* self */, Duration /* dt */)>;
/// \~chinese /// \~chinese
/// @brief 创建定时器 /// @brief 创建定时器
/// @param cb 回调函数 /// @param cb 回调函数
/// @param interval 时间间隔 /// @param interval 时间间隔
/// @param times 执行次数(设 -1 为永久执行) /// @param times 执行次数(设 -1 为永久执行)
static TimerPtr Create(Callback const& cb, Duration interval, int times = -1); static TimerPtr Create(Callback const& cb, Duration interval, int times = -1);
/// \~chinese /// \~chinese
/// @brief 创建定时器 /// @brief 创建定时器
/// @param name 名称 /// @param name 名称
/// @param cb 回调函数 /// @param cb 回调函数
/// @param interval 时间间隔 /// @param interval 时间间隔
/// @param times 执行次数(设 -1 为永久执行) /// @param times 执行次数(设 -1 为永久执行)
static TimerPtr Create(String const& name, Callback const& cb, Duration interval, int times = -1); static TimerPtr Create(String const& name, Callback const& cb, Duration interval, int times = -1);
/// \~chinese /// \~chinese
/// @brief 构造空定时器 /// @brief 构造空定时器
Timer(); Timer();
/// \~chinese /// \~chinese
/// @brief 启动定时器 /// @brief 启动定时器
void Start(); void Start();
/// \~chinese /// \~chinese
/// @brief 停止定时器 /// @brief 停止定时器
void Stop(); void Stop();
/// \~chinese /// \~chinese
/// @brief 移除定时器 /// @brief 移除定时器
void Remove(); void Remove();
/// \~chinese /// \~chinese
/// @brief 定时器是否在运行 /// @brief 定时器是否在运行
bool IsRunning() const; bool IsRunning() const;
/// \~chinese /// \~chinese
/// @brief 定时器是否可移除 /// @brief 定时器是否可移除
bool IsRemoveable() const; bool IsRemoveable() const;
/// \~chinese /// \~chinese
/// @brief 获取定时器执行过回调函数的次数 /// @brief 获取定时器执行过回调函数的次数
int GetRunTimes() const; int GetRunTimes() const;
/// \~chinese /// \~chinese
/// @brief 获取定时器执行回调函数的总次数 /// @brief 获取定时器执行回调函数的总次数
int GetTotalRunTimes() const; int GetTotalRunTimes() const;
/// \~chinese /// \~chinese
/// @brief 设置定时器执行回调函数的总次数 /// @brief 设置定时器执行回调函数的总次数
void SetTotalRunTimes(int times); void SetTotalRunTimes(int times);
/// \~chinese /// \~chinese
/// @brief 获取定时器执行时间间隔 /// @brief 获取定时器执行时间间隔
Duration GetInterval() const; Duration GetInterval() const;
/// \~chinese /// \~chinese
/// @brief 设置定时器执行时间间隔 /// @brief 设置定时器执行时间间隔
void SetInterval(Duration interval); void SetInterval(Duration interval);
/// \~chinese /// \~chinese
/// @brief 获取定时器回调函数 /// @brief 获取定时器回调函数
Callback GetCallback() const; Callback GetCallback() const;
/// \~chinese /// \~chinese
/// @brief 设置定时器回调函数 /// @brief 设置定时器回调函数
void SetCallback(const Callback& callback); void SetCallback(const Callback& callback);
private: private:
/// \~chinese /// \~chinese
/// @brief 更新定时器 /// @brief 更新定时器
void Update(Duration dt); void Update(Duration dt);
/// \~chinese /// \~chinese
/// @brief 重置定时器 /// @brief 重置定时器
void Reset(); void Reset();
private: private:

View File

@ -25,65 +25,65 @@ namespace kiwano
{ {
/** /**
* \~chinese * \~chinese
* @brief * @brief
*/ */
class KGE_API TimerManager class KGE_API TimerManager
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 定时器列表 /// @brief 定时器列表
using Timers = IntrusiveList<TimerPtr>; using Timers = IntrusiveList<TimerPtr>;
/// \~chinese /// \~chinese
/// @brief 添加定时器 /// @brief 添加定时器
/// @param cb 回调函数 /// @param cb 回调函数
/// @param interval 时间间隔 /// @param interval 时间间隔
/// @param times 执行次数(设 -1 为永久执行) /// @param times 执行次数(设 -1 为永久执行)
Timer* AddTimer(Timer::Callback const& cb, Duration interval, int times = -1); Timer* AddTimer(Timer::Callback const& cb, Duration interval, int times = -1);
/// \~chinese /// \~chinese
/// @brief 添加定时器 /// @brief 添加定时器
/// @param name 定时器名称 /// @param name 定时器名称
/// @param cb 回调函数 /// @param cb 回调函数
/// @param interval 时间间隔 /// @param interval 时间间隔
/// @param times 执行次数(设 -1 为永久执行) /// @param times 执行次数(设 -1 为永久执行)
Timer* AddTimer(String const& name, Timer::Callback const& cb, Duration interval, int times = -1); Timer* AddTimer(String const& name, Timer::Callback const& cb, Duration interval, int times = -1);
/// \~chinese /// \~chinese
/// @brief 添加定时器 /// @brief 添加定时器
Timer* AddTimer(TimerPtr timer); Timer* AddTimer(TimerPtr timer);
/// \~chinese /// \~chinese
/// @brief 启动定时器 /// @brief 启动定时器
void StartTimers(String const& timer_name); void StartTimers(String const& timer_name);
/// \~chinese /// \~chinese
/// @brief 停止定时器 /// @brief 停止定时器
void StopTimers(String const& timer_name); void StopTimers(String const& timer_name);
/// \~chinese /// \~chinese
/// @brief 移除定时器 /// @brief 移除定时器
void RemoveTimers(String const& timer_name); void RemoveTimers(String const& timer_name);
/// \~chinese /// \~chinese
/// @brief 启动所有定时器 /// @brief 启动所有定时器
void StartAllTimers(); void StartAllTimers();
/// \~chinese /// \~chinese
/// @brief 停止所有定时器 /// @brief 停止所有定时器
void StopAllTimers(); void StopAllTimers();
/// \~chinese /// \~chinese
/// @brief 移除所有定时器 /// @brief 移除所有定时器
void RemoveAllTimers(); void RemoveAllTimers();
/// \~chinese /// \~chinese
/// @brief 获取所有定时器 /// @brief 获取所有定时器
const Timers& GetAllTimers() const; const Timers& GetAllTimers() const;
protected: protected:
/// \~chinese /// \~chinese
/// @brief 更新定时器 /// @brief 更新定时器
void UpdateTimers(Duration dt); void UpdateTimers(Duration dt);
private: private:

View File

@ -29,7 +29,7 @@ KGE_DECLARE_SMART_PTR(Event);
/** /**
* \~chinese * \~chinese
* \defgroup Events * \defgroup Events
*/ */
/** /**
@ -38,35 +38,35 @@ KGE_DECLARE_SMART_PTR(Event);
*/ */
/// \~chinese /// \~chinese
/// @brief 事件 /// @brief 事件
class KGE_API Event : public RefCounter class KGE_API Event : public RefCounter
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 构造事件 /// @brief 构造事件
Event(EventType const& type); Event(EventType const& type);
virtual ~Event(); virtual ~Event();
/// \~chinese /// \~chinese
/// @brief 获取类型事件 /// @brief 获取类型事件
const EventType& GetType() const; const EventType& GetType() const;
/// \~chinese /// \~chinese
/// @brief 判断事件类型 /// @brief 判断事件类型
/// @return 是否是指定事件类型 /// @return 是否是指定事件类型
template <typename _Ty, typename = typename std::enable_if<std::is_base_of<Event, _Ty>::value, int>::type> template <typename _Ty, typename = typename std::enable_if<std::is_base_of<Event, _Ty>::value, int>::type>
bool IsType() const; bool IsType() const;
/// \~chinese /// \~chinese
/// @brief 安全转换为其他类型事件 /// @brief 安全转换为其他类型事件
/// @throw std::bad_cast 类型无法转换时抛出 /// @throw std::bad_cast 类型无法转换时抛出
template <typename _Ty, typename = typename std::enable_if<std::is_base_of<Event, _Ty>::value, int>::type> template <typename _Ty, typename = typename std::enable_if<std::is_base_of<Event, _Ty>::value, int>::type>
const _Ty* SafeCast() const; const _Ty* SafeCast() const;
/// \~chinese /// \~chinese
/// @brief 安全转换为其他类型事件 /// @brief 安全转换为其他类型事件
/// @throw std::bad_cast 类型无法转换时抛出 /// @throw std::bad_cast 类型无法转换时抛出
template <typename _Ty, typename = typename std::enable_if<std::is_base_of<Event, _Ty>::value, int>::type> template <typename _Ty, typename = typename std::enable_if<std::is_base_of<Event, _Ty>::value, int>::type>
_Ty* SafeCast(); _Ty* SafeCast();
@ -75,14 +75,14 @@ private:
}; };
/// \~chinese /// \~chinese
/// @brief 事件特性:判断指定类型是否是事件 /// @brief 事件特性:判断指定类型是否是事件
template <typename _Ty> template <typename _Ty>
struct IsEvent : public std::bool_constant<std::is_base_of<Event, _Ty>::value || std::is_same<Event, _Ty>::value> struct IsEvent : public std::bool_constant<std::is_base_of<Event, _Ty>::value || std::is_same<Event, _Ty>::value>
{ {
}; };
/// \~chinese /// \~chinese
/// @brief 事件特性:判断一个事件能否安全转换到另一事件类型 /// @brief 事件特性:判断一个事件能否安全转换到另一事件类型
template <typename _Ty, typename = typename std::enable_if<IsEvent<_Ty>::value, int>::type> template <typename _Ty, typename = typename std::enable_if<IsEvent<_Ty>::value, int>::type>
struct IsEventType struct IsEventType
{ {

View File

@ -31,7 +31,7 @@ namespace kiwano
*/ */
/// \~chinese /// \~chinese
/// @brief 事件类型 /// @brief 事件类型
class EventType : public std::type_index class EventType : public std::type_index
{ {
class Dummy class Dummy
@ -40,7 +40,7 @@ class EventType : public std::type_index
public: public:
/// \~chinese /// \~chinese
/// @brief 构建事件类型 /// @brief 构建事件类型
EventType(); EventType();
using std::type_index::type_index; using std::type_index::type_index;

View File

@ -35,7 +35,7 @@ KGE_DECLARE_SMART_PTR(KeyCharEvent);
*/ */
/// \~chinese /// \~chinese
/// @brief 键盘事件 /// @brief 键盘事件
class KGE_API KeyEvent : public Event class KGE_API KeyEvent : public Event
{ {
public: public:
@ -43,31 +43,31 @@ public:
}; };
/// \~chinese /// \~chinese
/// @brief 键盘按下事件 /// @brief 键盘按下事件
class KGE_API KeyDownEvent : public KeyEvent class KGE_API KeyDownEvent : public KeyEvent
{ {
public: public:
KeyCode code; ///< 键值 KeyCode code; ///< 键值
KeyDownEvent(); KeyDownEvent();
}; };
/// \~chinese /// \~chinese
/// @brief 键盘抬起事件 /// @brief 键盘抬起事件
class KGE_API KeyUpEvent : public KeyEvent class KGE_API KeyUpEvent : public KeyEvent
{ {
public: public:
KeyCode code; ///< 键值 KeyCode code; ///< 键值
KeyUpEvent(); KeyUpEvent();
}; };
/// \~chinese /// \~chinese
/// @brief 键盘字符事件 /// @brief 键盘字符事件
class KGE_API KeyCharEvent : public KeyEvent class KGE_API KeyCharEvent : public KeyEvent
{ {
public: public:
char value; ///< 字符 char value; ///< 字符
KeyCharEvent(); KeyCharEvent();
}; };

View File

@ -40,17 +40,17 @@ KGE_DECLARE_SMART_PTR(MouseWheelEvent);
*/ */
/// \~chinese /// \~chinese
/// @brief 鼠标事件 /// @brief 鼠标事件
class KGE_API MouseEvent : public Event class KGE_API MouseEvent : public Event
{ {
public: public:
Point pos; ///< 鼠标位置 Point pos; ///< 鼠标位置
MouseEvent(EventType const& type); MouseEvent(EventType const& type);
}; };
/// \~chinese /// \~chinese
/// @brief 鼠标移动事件 /// @brief 鼠标移动事件
class KGE_API MouseMoveEvent : public MouseEvent class KGE_API MouseMoveEvent : public MouseEvent
{ {
public: public:
@ -58,37 +58,37 @@ public:
}; };
/// \~chinese /// \~chinese
/// @brief 鼠标按键按下事件 /// @brief 鼠标按键按下事件
class KGE_API MouseDownEvent : public MouseEvent class KGE_API MouseDownEvent : public MouseEvent
{ {
public: public:
MouseButton button; ///< 鼠标键值 MouseButton button; ///< 鼠标键值
MouseDownEvent(); MouseDownEvent();
}; };
/// \~chinese /// \~chinese
/// @brief 鼠标按键抬起事件 /// @brief 鼠标按键抬起事件
class KGE_API MouseUpEvent : public MouseEvent class KGE_API MouseUpEvent : public MouseEvent
{ {
public: public:
MouseButton button; ///< 鼠标键值 MouseButton button; ///< 鼠标键值
MouseUpEvent(); MouseUpEvent();
}; };
/// \~chinese /// \~chinese
/// @brief 鼠标点击事件 /// @brief 鼠标点击事件
class KGE_API MouseClickEvent : public MouseEvent class KGE_API MouseClickEvent : public MouseEvent
{ {
public: public:
MouseButton button; ///< 鼠标键值 MouseButton button; ///< 鼠标键值
MouseClickEvent(); MouseClickEvent();
}; };
/// \~chinese /// \~chinese
/// @brief 鼠标移入事件 /// @brief 鼠标移入事件
class KGE_API MouseHoverEvent : public MouseEvent class KGE_API MouseHoverEvent : public MouseEvent
{ {
public: public:
@ -96,7 +96,7 @@ public:
}; };
/// \~chinese /// \~chinese
/// @brief 鼠标移出事件 /// @brief 鼠标移出事件
class KGE_API MouseOutEvent : public MouseEvent class KGE_API MouseOutEvent : public MouseEvent
{ {
public: public:
@ -104,11 +104,11 @@ public:
}; };
/// \~chinese /// \~chinese
/// @brief 鼠标滚轮事件 /// @brief 鼠标滚轮事件
class KGE_API MouseWheelEvent : public MouseEvent class KGE_API MouseWheelEvent : public MouseEvent
{ {
public: public:
float wheel; ///< 滚轮值 float wheel; ///< 滚轮值
MouseWheelEvent(); MouseWheelEvent();
}; };

View File

@ -36,7 +36,7 @@ KGE_DECLARE_SMART_PTR(WindowClosedEvent);
*/ */
/// \~chinese /// \~chinese
/// @brief 窗口事件 /// @brief 窗口事件
class KGE_API WindowEvent : public Event class KGE_API WindowEvent : public Event
{ {
public: public:
@ -44,49 +44,49 @@ public:
}; };
/// \~chinese /// \~chinese
/// @brief 窗口移动事件 /// @brief 窗口移动事件
class KGE_API WindowMovedEvent : public WindowEvent class KGE_API WindowMovedEvent : public WindowEvent
{ {
public: public:
int x; ///< 窗口左上角 x 坐标 int x; ///< 窗口左上角 x 坐标
int y; ///< 窗口左上角 y 坐标 int y; ///< 窗口左上角 y 坐标
WindowMovedEvent(); WindowMovedEvent();
}; };
/// \~chinese /// \~chinese
/// @brief 窗口大小变化事件 /// @brief 窗口大小变化事件
class KGE_API WindowResizedEvent : public WindowEvent class KGE_API WindowResizedEvent : public WindowEvent
{ {
public: public:
uint32_t width; ///< 窗口宽度 uint32_t width; ///< 窗口宽度
uint32_t height; ///< 窗口高度 uint32_t height; ///< 窗口高度
WindowResizedEvent(); WindowResizedEvent();
}; };
/// \~chinese /// \~chinese
/// @brief 窗口焦点变化事件 /// @brief 窗口焦点变化事件
class KGE_API WindowFocusChangedEvent : public WindowEvent class KGE_API WindowFocusChangedEvent : public WindowEvent
{ {
public: public:
bool focus; ///< 是否获取到焦点 bool focus; ///< 是否获取到焦点
WindowFocusChangedEvent(); WindowFocusChangedEvent();
}; };
/// \~chinese /// \~chinese
/// @brief 窗口标题更改事件 /// @brief 窗口标题更改事件
class KGE_API WindowTitleChangedEvent : public WindowEvent class KGE_API WindowTitleChangedEvent : public WindowEvent
{ {
public: public:
String title; ///< 标题 String title; ///< 标题
WindowTitleChangedEvent(); WindowTitleChangedEvent();
}; };
/// \~chinese /// \~chinese
/// @brief 窗口关闭事件 /// @brief 窗口关闭事件
class KGE_API WindowClosedEvent : public WindowEvent class KGE_API WindowClosedEvent : public WindowEvent
{ {
public: public:

View File

@ -70,7 +70,7 @@
#include <kiwano/render/ShapeSink.h> #include <kiwano/render/ShapeSink.h>
#include <kiwano/render/Texture.h> #include <kiwano/render/Texture.h>
#include <kiwano/render/GifImage.h> #include <kiwano/render/GifImage.h>
#include <kiwano/render/LayerArea.h> #include <kiwano/render/Layer.h>
#include <kiwano/render/TextLayout.h> #include <kiwano/render/TextLayout.h>
#include <kiwano/render/TextureCache.h> #include <kiwano/render/TextureCache.h>
#include <kiwano/render/Renderer.h> #include <kiwano/render/Renderer.h>
@ -86,7 +86,7 @@
#include <kiwano/2d/Frame.h> #include <kiwano/2d/Frame.h>
#include <kiwano/2d/FrameSequence.h> #include <kiwano/2d/FrameSequence.h>
#include <kiwano/2d/GifSprite.h> #include <kiwano/2d/GifSprite.h>
#include <kiwano/2d/Layer.h> #include <kiwano/2d/LayerActor.h>
#include <kiwano/2d/ShapeActor.h> #include <kiwano/2d/ShapeActor.h>
#include <kiwano/2d/Sprite.h> #include <kiwano/2d/Sprite.h>
#include <kiwano/2d/Stage.h> #include <kiwano/2d/Stage.h>

View File

@ -136,8 +136,6 @@
KGE_SUPPRESS_WARNING(4251) KGE_SUPPRESS_WARNING(4251)
#endif #endif
#define KGE_NOT_USED(VAR) ((void)VAR)
#define KGE_DEPRECATED(...) __declspec(deprecated(__VA_ARGS__)) #define KGE_DEPRECATED(...) __declspec(deprecated(__VA_ARGS__))
// Windows Header Files // Windows Header Files
@ -145,3 +143,5 @@ KGE_SUPPRESS_WARNING(4251)
#include <windows.h> #include <windows.h>
#endif // KGE_WIN32 #endif // KGE_WIN32
#define KGE_NOT_USED(VAR) ((void)VAR)

View File

@ -26,11 +26,11 @@ namespace kiwano
namespace math namespace math
{ {
// //
// 随机数 // 随机数
// //
// 获取指定范围内的一个随机数, 如: // 获取指定范围内的一个随机数, 如:
// int n = math::Random(1, 5); // 获取 1~5 内的随机整数, 包含 1 和 5 // int n = math::Random(1, 5); // 获取 1~5 内的随机整数, 包含 1 和 5
// 产生的随机数类型取决于参数的类型, 如获取随机浮点数: // 产生的随机数类型取决于参数的类型, 如获取随机浮点数:
// float d = math::Random(1.2f, 1.5f); // float d = math::Random(1.2f, 1.5f);
// //

Some files were not shown because too many files have changed in this diff Show More