diff --git a/projects/kiwano/kiwano.vcxproj b/projects/kiwano/kiwano.vcxproj
index 4bd46c9f..aee8098b 100644
--- a/projects/kiwano/kiwano.vcxproj
+++ b/projects/kiwano/kiwano.vcxproj
@@ -48,10 +48,12 @@
-
+
+
+
@@ -165,8 +167,10 @@
-
+
+
+
diff --git a/projects/kiwano/kiwano.vcxproj.filters b/projects/kiwano/kiwano.vcxproj.filters
index ff452122..f22d5eea 100644
--- a/projects/kiwano/kiwano.vcxproj.filters
+++ b/projects/kiwano/kiwano.vcxproj.filters
@@ -40,6 +40,9 @@
{f70cecd8-6d5b-405d-8466-d3ca2db9b806}
+
+ {554a3b32-ec18-4123-a12e-b176ec10fbdc}
+
@@ -279,9 +282,6 @@
event
-
- event
-
event
@@ -396,6 +396,15 @@
base\component
+
+ event\listener
+
+
+ event\listener
+
+
+ event\listener
+
@@ -560,9 +569,6 @@
event
-
- event
-
event
@@ -653,6 +659,15 @@
base\component
+
+ event\listener
+
+
+ event\listener
+
+
+ event\listener
+
diff --git a/src/kiwano/event/Event.h b/src/kiwano/event/Event.h
index 172bf8a9..7bb54891 100644
--- a/src/kiwano/event/Event.h
+++ b/src/kiwano/event/Event.h
@@ -30,11 +30,11 @@ KGE_DECLARE_SMART_PTR(Event);
/**
* \~chinese
- * \defgroup Events 事件
+ * \defgroup Event 事件
*/
/**
- * \addtogroup Events
+ * \addtogroup Event
* @{
*/
@@ -60,16 +60,16 @@ public:
bool IsType() const;
/// \~chinese
- /// @brief 安全转换为其他类型事件
- /// @throw std::bad_cast 类型无法转换时抛出
+ /// @brief 转换为其他类型事件
+ /// @return 其他类型事件指针,如果事件类型无法转换,返回空指针
template
- const _Ty* SafeCast() const;
+ const _Ty* Cast() const;
/// \~chinese
- /// @brief 安全转换为其他类型事件
- /// @throw std::bad_cast 类型无法转换时抛出
+ /// @brief 转换为其他类型事件
+ /// @return 其他类型事件指针,如果事件类型无法转换,返回空指针
template
- _Ty* SafeCast();
+ _Ty* Cast();
private:
const EventType type_;
@@ -102,16 +102,16 @@ inline bool Event::IsType() const
}
template
-inline const _Ty* Event::SafeCast() const
+inline const _Ty* Event::Cast() const
{
- return const_cast(this)->SafeCast<_Ty>();
+ return const_cast(this)->Cast<_Ty>();
}
template
-inline _Ty* Event::SafeCast()
+inline _Ty* Event::Cast()
{
if (!this->IsType<_Ty>())
- throw std::bad_cast();
+ return nullptr;
return dynamic_cast<_Ty*>(this);
}
diff --git a/src/kiwano/event/EventDispatcher.h b/src/kiwano/event/EventDispatcher.h
index 5c5e2952..a3260efd 100644
--- a/src/kiwano/event/EventDispatcher.h
+++ b/src/kiwano/event/EventDispatcher.h
@@ -19,7 +19,7 @@
// THE SOFTWARE.
#pragma once
-#include
+#include
namespace kiwano
{
diff --git a/src/kiwano/event/EventType.h b/src/kiwano/event/EventType.h
index ae104bc0..0aba6cc0 100644
--- a/src/kiwano/event/EventType.h
+++ b/src/kiwano/event/EventType.h
@@ -26,7 +26,7 @@
namespace kiwano
{
/**
- * \addtogroup Events
+ * \addtogroup Event
* @{
*/
diff --git a/src/kiwano/event/KeyEvent.h b/src/kiwano/event/KeyEvent.h
index b97b4d11..2925ccbb 100644
--- a/src/kiwano/event/KeyEvent.h
+++ b/src/kiwano/event/KeyEvent.h
@@ -30,7 +30,7 @@ KGE_DECLARE_SMART_PTR(KeyUpEvent);
KGE_DECLARE_SMART_PTR(KeyCharEvent);
/**
- * \addtogroup Events
+ * \addtogroup Event
* @{
*/
diff --git a/src/kiwano/event/MouseEvent.h b/src/kiwano/event/MouseEvent.h
index 013ea032..06f7f002 100644
--- a/src/kiwano/event/MouseEvent.h
+++ b/src/kiwano/event/MouseEvent.h
@@ -35,7 +35,7 @@ KGE_DECLARE_SMART_PTR(MouseOutEvent);
KGE_DECLARE_SMART_PTR(MouseWheelEvent);
/**
- * \addtogroup Events
+ * \addtogroup Event
* @{
*/
diff --git a/src/kiwano/event/WindowEvent.h b/src/kiwano/event/WindowEvent.h
index 40d59754..a76bba70 100644
--- a/src/kiwano/event/WindowEvent.h
+++ b/src/kiwano/event/WindowEvent.h
@@ -33,7 +33,7 @@ KGE_DECLARE_SMART_PTR(WindowClosedEvent);
class Window;
/**
- * \addtogroup Events
+ * \addtogroup Event
* @{
*/
diff --git a/src/kiwano/event/EventListener.cpp b/src/kiwano/event/listener/EventListener.cpp
similarity index 98%
rename from src/kiwano/event/EventListener.cpp
rename to src/kiwano/event/listener/EventListener.cpp
index 5821ebef..2497d498 100644
--- a/src/kiwano/event/EventListener.cpp
+++ b/src/kiwano/event/listener/EventListener.cpp
@@ -19,7 +19,7 @@
// THE SOFTWARE.
#pragma once
-#include
+#include
namespace kiwano
{
diff --git a/src/kiwano/event/EventListener.h b/src/kiwano/event/listener/EventListener.h
similarity index 97%
rename from src/kiwano/event/EventListener.h
rename to src/kiwano/event/listener/EventListener.h
index 621619cd..facc2874 100644
--- a/src/kiwano/event/EventListener.h
+++ b/src/kiwano/event/listener/EventListener.h
@@ -30,6 +30,16 @@ class EventDispatcher;
KGE_DECLARE_SMART_PTR(EventListener);
+/**
+ * \~chinese
+ * \defgroup EventListener 事件监听器
+ */
+
+/**
+ * \addtogroup EventListener
+ * @{
+ */
+
/**
* \~chinese
* @brief 事件监听器
@@ -114,6 +124,8 @@ private:
bool swallow_;
};
+/** @} */
+
inline void EventListener::Start()
{
running_ = true;
diff --git a/src/kiwano/event/listener/KeyEventListener.cpp b/src/kiwano/event/listener/KeyEventListener.cpp
new file mode 100644
index 00000000..4edae4b6
--- /dev/null
+++ b/src/kiwano/event/listener/KeyEventListener.cpp
@@ -0,0 +1,39 @@
+// 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
+
+namespace kiwano
+{
+
+void KeyEventListener::Handle(Event* evt)
+{
+ if (auto key_evt = evt->Cast())
+ {
+ OnKeyDown(key_evt->code);
+ }
+ else if (auto key_evt = evt->Cast())
+ {
+ OnKeyUp(key_evt->code);
+ }
+}
+
+} // namespace kiwano
diff --git a/src/kiwano/event/listener/KeyEventListener.h b/src/kiwano/event/listener/KeyEventListener.h
new file mode 100644
index 00000000..916c2427
--- /dev/null
+++ b/src/kiwano/event/listener/KeyEventListener.h
@@ -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.
+
+#pragma once
+#include
+#include
+
+namespace kiwano
+{
+
+KGE_DECLARE_SMART_PTR(KeyEventListener);
+
+/**
+ * \addtogroup EventListener
+ * @{
+ */
+
+/**
+ * \~chinese
+ * @brief 按键事件监听器
+ */
+class KGE_API KeyEventListener
+ : public EventListener
+{
+public:
+ /// \~chinese
+ /// @brief 按键按下时
+ /// @param key 按键键值
+ virtual void OnKeyDown(KeyCode key) {}
+
+ /// \~chinese
+ /// @brief 按键抬起时
+ /// @param key 按键键值
+ virtual void OnKeyUp(KeyCode key) {}
+
+ /// \~chinese
+ /// @brief 处理消息
+ void Handle(Event* evt) override;
+};
+
+/** @} */
+
+} // namespace kiwano
diff --git a/src/kiwano/event/listener/MouseEventListener.cpp b/src/kiwano/event/listener/MouseEventListener.cpp
new file mode 100644
index 00000000..526833fd
--- /dev/null
+++ b/src/kiwano/event/listener/MouseEventListener.cpp
@@ -0,0 +1,137 @@
+// 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
+
+namespace kiwano
+{
+
+void MouseEventListener::Handle(Event* evt)
+{
+ if (auto mouse_evt = evt->Cast())
+ {
+ OnMouseMoving(mouse_evt->pos);
+ }
+ else if (auto mouse_evt = evt->Cast())
+ {
+ OnMouseDown(mouse_evt->pos, mouse_evt->button);
+ }
+ else if (auto mouse_evt = evt->Cast())
+ {
+ OnMouseUp(mouse_evt->pos, mouse_evt->button);
+ }
+ else if (auto mouse_evt = evt->Cast())
+ {
+ OnMouseWheelScrolling(mouse_evt->pos, mouse_evt->wheel);
+ }
+}
+
+MouseDragEventListener::MouseDragEventListener()
+ : is_dragging_{ false, false, false }
+ , drag_point_{}
+{
+}
+
+void MouseDragEventListener::Handle(Event* evt)
+{
+ if (auto mouse_evt = evt->Cast())
+ {
+ const auto button = mouse_evt->button;
+ if (OnDragStart(mouse_evt->pos, button))
+ {
+ SetDragging(button, true);
+ SetDragPoint(button, mouse_evt->pos);
+ SetDragPrevPoint(button, mouse_evt->pos);
+ }
+ }
+
+ if (auto mouse_evt = evt->Cast())
+ {
+ for (int i = 0; i < MouseButtonNum; i++)
+ {
+ const auto button = MouseButton(i);
+ if (IsDragging(button))
+ {
+ auto new_pos = mouse_evt->pos;
+ auto offset = new_pos - GetDragPrevPoint(button);
+ OnDragging(offset, button);
+ SetDragPrevPoint(button, new_pos);
+ }
+ }
+ }
+
+ if (auto mouse_evt = evt->Cast())
+ {
+ const auto button = mouse_evt->button;
+ if (IsDragging(button))
+ {
+ OnDragEnd(mouse_evt->pos, button);
+
+ SetDragging(button, false);
+ SetDragPoint(button, Point());
+ SetDragPrevPoint(button, Point());
+ }
+ }
+}
+
+bool MouseDragEventListener::IsDragging(MouseButton button)
+{
+ int index = int(button);
+ KGE_ASSERT(index >= 0 && index < MouseButtonNum);
+ return is_dragging_[index];
+}
+
+void MouseDragEventListener::SetDragging(MouseButton button, bool dragging)
+{
+ int index = int(button);
+ KGE_ASSERT(index >= 0 && index < MouseButtonNum);
+ is_dragging_[index] = dragging;
+}
+
+Point MouseDragEventListener::GetDragPoint(MouseButton button)
+{
+ int index = int(button);
+ KGE_ASSERT(index >= 0 && index < MouseButtonNum);
+ return drag_point_[index];
+}
+
+void MouseDragEventListener::SetDragPoint(MouseButton button, Point pos)
+{
+ int index = int(button);
+ KGE_ASSERT(index >= 0 && index < MouseButtonNum);
+ drag_point_[index] = pos;
+}
+
+Point MouseDragEventListener::GetDragPrevPoint(MouseButton button)
+{
+ int index = int(button);
+ KGE_ASSERT(index >= 0 && index < MouseButtonNum);
+ return drag_prev_point_[index];
+}
+
+void MouseDragEventListener::SetDragPrevPoint(MouseButton button, Point pos)
+{
+ int index = int(button);
+ KGE_ASSERT(index >= 0 && index < MouseButtonNum);
+ drag_prev_point_[index] = pos;
+}
+
+} // namespace kiwano
diff --git a/src/kiwano/event/listener/MouseEventListener.h b/src/kiwano/event/listener/MouseEventListener.h
new file mode 100644
index 00000000..8628431a
--- /dev/null
+++ b/src/kiwano/event/listener/MouseEventListener.h
@@ -0,0 +1,137 @@
+// 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
+#include
+
+namespace kiwano
+{
+
+KGE_DECLARE_SMART_PTR(MouseEventListener);
+KGE_DECLARE_SMART_PTR(MouseDragEventListener);
+
+/**
+ * \addtogroup EventListener
+ * @{
+ */
+
+/**
+ * \~chinese
+ * @brief 鼠标事件监听器
+ */
+class KGE_API MouseEventListener
+ : public EventListener
+{
+public:
+ /// \~chinese
+ /// @brief 鼠标移动时
+ /// @param pos 鼠标位置
+ virtual void OnMouseMoving(const Point& pos) {}
+
+ /// \~chinese
+ /// @brief 鼠标按下时
+ /// @param pos 鼠标位置
+ /// @param button 鼠标键值
+ virtual void OnMouseDown(const Point& pos, MouseButton button) {}
+
+ /// \~chinese
+ /// @brief 鼠标抬起时
+ /// @param pos 鼠标位置
+ /// @param button 鼠标键值
+ virtual void OnMouseUp(const Point& pos, MouseButton button) {}
+
+ /// \~chinese
+ /// @brief 鼠标滚轮滚动时
+ /// @param pos 鼠标位置
+ /// @param wheel 鼠标滚轮滚动值
+ virtual void OnMouseWheelScrolling(const Point& pos, float wheel) {}
+
+ /// \~chinese
+ /// @brief 处理消息
+ void Handle(Event* evt) override;
+};
+
+/**
+ * \~chinese
+ * @brief 鼠标拖动事件监听器
+ */
+class KGE_API MouseDragEventListener : public EventListener
+{
+public:
+ MouseDragEventListener();
+
+ /// \~chinese
+ /// @brief 鼠标拖动开始
+ /// @param pos 鼠标位置
+ /// @param button 鼠标键值
+ /// @return 是否响应这次拖动
+ virtual bool OnDragStart(const Point& pos, MouseButton button)
+ {
+ return true;
+ }
+
+ /// \~chinese
+ /// @brief 鼠标拖动时
+ /// @param offset 鼠标位置偏移量
+ /// @param button 鼠标键值
+ virtual void OnDragging(const Point& offset, MouseButton button) {}
+
+ /// \~chinese
+ /// @brief 鼠标拖动结束
+ /// @param pos 鼠标位置
+ /// @param button 鼠标键值
+ virtual void OnDragEnd(const Point& pos, MouseButton button) {}
+
+ /// \~chinese
+ /// @brief 获取鼠标按键的拖动状态
+ bool IsDragging(MouseButton button);
+
+ /// \~chinese
+ /// @brief 获取鼠标按键的起始拖动位置
+ Point GetDragPoint(MouseButton button);
+
+ /// \~chinese
+ /// @brief 处理消息
+ void Handle(Event* evt) override;
+
+private:
+ void SetDragging(MouseButton button, bool dragging);
+
+ void SetDragPoint(MouseButton button, Point pos);
+
+ Point GetDragPrevPoint(MouseButton button);
+
+ void SetDragPrevPoint(MouseButton button, Point pos);
+
+private:
+ enum : int
+ {
+ MouseButtonNum = 3
+ };
+
+ bool is_dragging_[MouseButtonNum];
+ Point drag_point_[MouseButtonNum];
+ Point drag_prev_point_[MouseButtonNum];
+};
+
+/** @} */
+
+} // namespace kiwano
diff --git a/src/kiwano/kiwano.h b/src/kiwano/kiwano.h
index 111fbecd..9af44c4c 100644
--- a/src/kiwano/kiwano.h
+++ b/src/kiwano/kiwano.h
@@ -49,7 +49,6 @@
#include
#include
-
//
// event
//
@@ -58,7 +57,9 @@
#include
#include
#include
-#include
+#include
+#include
+#include
#include
//
diff --git a/src/kiwano/platform/Keys.h b/src/kiwano/platform/Keys.h
index 76d13785..635090f8 100644
--- a/src/kiwano/platform/Keys.h
+++ b/src/kiwano/platform/Keys.h
@@ -118,4 +118,30 @@ enum class KeyCode
Last
};
+
+inline KeyCode operator+(KeyCode lhs, int rhs) noexcept
+{
+ return KeyCode(int(lhs) + rhs);
+}
+
+inline KeyCode operator-(KeyCode lhs, int rhs) noexcept
+{
+ return KeyCode(int(lhs) - rhs);
+}
+
+inline KeyCode operator+(int lhs, KeyCode rhs) noexcept
+{
+ return KeyCode(lhs + int(rhs));
+}
+
+inline KeyCode operator-(int lhs, KeyCode rhs) noexcept
+{
+ return KeyCode(lhs - int(rhs));
+}
+
+inline int operator-(KeyCode lhs, KeyCode rhs) noexcept
+{
+ return int(lhs) - int(rhs);
+}
+
} // namespace kiwano
diff --git a/src/kiwano/render/DirectX/RendererImpl.cpp b/src/kiwano/render/DirectX/RendererImpl.cpp
index d8040307..8683a4c1 100644
--- a/src/kiwano/render/DirectX/RendererImpl.cpp
+++ b/src/kiwano/render/DirectX/RendererImpl.cpp
@@ -161,9 +161,9 @@ void RendererImpl::HandleEvent(EventModuleContext& ctx)
{
Renderer::HandleEvent(ctx);
- if (ctx.evt->IsType())
+ auto evt = ctx.evt->Cast();
+ if (evt)
{
- auto evt = ctx.evt->SafeCast();
HMONITOR monitor = ::MonitorFromWindow(evt->window->GetHandle(), MONITOR_DEFAULTTONULL);
if (monitor_ != monitor)
{
diff --git a/src/kiwano/render/Renderer.cpp b/src/kiwano/render/Renderer.cpp
index d1610a7e..07713af7 100644
--- a/src/kiwano/render/Renderer.cpp
+++ b/src/kiwano/render/Renderer.cpp
@@ -57,9 +57,9 @@ void Renderer::HandleEvent(EventModuleContext& ctx)
{
if (auto_reset_resolution_)
{
- if (ctx.evt->IsType())
+ auto evt = ctx.evt->Cast();
+ if (evt)
{
- auto evt = ctx.evt->SafeCast();
Resize(evt->width, evt->height);
}
}
diff --git a/src/kiwano/utils/ConfigIni.cpp b/src/kiwano/utils/ConfigIni.cpp
index da728718..118cca95 100644
--- a/src/kiwano/utils/ConfigIni.cpp
+++ b/src/kiwano/utils/ConfigIni.cpp
@@ -281,7 +281,7 @@ bool ConfigIni::HasKey(const String& section, const String& key) const
{
if (HasSection(section))
{
- return !!sections_.at(section).count(section);
+ return !!sections_.at(section).count(key);
}
return false;
}
diff --git a/src/kiwano/utils/EventTicker.h b/src/kiwano/utils/EventTicker.h
index c71b49d3..a5a11e5f 100644
--- a/src/kiwano/utils/EventTicker.h
+++ b/src/kiwano/utils/EventTicker.h
@@ -30,7 +30,7 @@ KGE_DECLARE_SMART_PTR(TickEvent);
KGE_DECLARE_SMART_PTR(EventTicker);
/**
- * \addtogroup Events
+ * \addtogroup Event
* @{
*/