Feature: runner settings

This commit is contained in:
Nomango 2020-05-29 18:44:20 +08:00
parent ee165a234f
commit a62f1f4d2d
9 changed files with 131 additions and 70 deletions

View File

@ -28,7 +28,7 @@ void ImGuiModule::SetupModule()
// Setup Dear ImGui style
ImGui::StyleColorsDark();
window_ = Application::GetInstance().GetMainWindow();
window_ = Application::GetInstance().GetWindow();
// Setup Platform/Renderer bindings
io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional)

View File

@ -62,14 +62,14 @@ void Button::SetStatus(Status status)
if (status == Status::Normal)
{
Application::GetInstance().GetMainWindow()->SetCursor(CursorType::Arrow);
Application::GetInstance().GetWindow()->SetCursor(CursorType::Arrow);
if (mouse_out_callback_)
mouse_out_callback_(this, GetBoundActor());
}
else if (status == Status::Hover)
{
Application::GetInstance().GetMainWindow()->SetCursor(CursorType::Hand);
Application::GetInstance().GetWindow()->SetCursor(CursorType::Hand);
if (old_status != Status::Pressed)
{

View File

@ -19,9 +19,8 @@
// THE SOFTWARE.
#include <kiwano/platform/Application.h>
#include <kiwano/platform/Input.h>
#include <kiwano/base/Director.h>
#include <kiwano/utils/Logger.h>
#include <kiwano/base/Director.h>
#include <kiwano/render/Renderer.h>
#include <kiwano/render/TextureCache.h>
#include <kiwano/utils/ResourceCache.h>
@ -39,9 +38,6 @@ Application::Application()
, is_paused_(false)
, time_scale_(1.f)
{
Use(Renderer::GetInstance());
Use(Input::GetInstance());
Use(Director::GetInstance());
}
Application::~Application()
@ -49,25 +45,22 @@ Application::~Application()
this->Destroy();
}
void Application::Run(RunnerPtr runner, bool debug)
void Application::Run(RunnerPtr runner)
{
KGE_ASSERT(runner);
runner_ = runner;
running_ = true;
is_paused_ = false;
// Initialize runner
runner->InitSettings();
// Setup all modules
for (auto c : modules_)
{
c->SetupModule();
}
if (debug)
{
Director::GetInstance().ShowDebugInfo(true);
Renderer::GetInstance().GetContext().SetCollectingStatus(true);
}
// Everything is ready
runner->OnReady();
@ -128,16 +121,19 @@ void Application::Destroy()
runner_ = nullptr;
}
// Clear all resources
// Clear user resources
Director::GetInstance().ClearStages();
ResourceCache::GetInstance().Clear();
TextureCache::GetInstance().Clear();
for (auto iter = modules_.rbegin(); iter != modules_.rend(); ++iter)
{
(*iter)->DestroyModule();
}
modules_.clear();
// Clear device resources
TextureCache::GetInstance().Clear();
Renderer::GetInstance().Destroy();
}
void Application::Use(Module& module)

View File

@ -58,7 +58,7 @@ public:
* @param debug
* @note
*/
void Run(RunnerPtr runner, bool debug = false);
void Run(RunnerPtr runner);
/**
* \~chinese
@ -99,9 +99,9 @@ public:
/**
* \~chinese
* @brief »ñÈ¡Ö÷´°¿Ú
* @brief »ñÈ¡´°¿Ú
*/
WindowPtr GetMainWindow() const;
WindowPtr GetWindow() const;
/**
* \~chinese
@ -183,10 +183,10 @@ inline RunnerPtr Application::GetRunner() const
return runner_;
}
inline WindowPtr Application::GetMainWindow() const
inline WindowPtr Application::GetWindow() const
{
KGE_ASSERT(runner_);
return runner_->GetMainWindow();
return runner_->GetWindow();
}
inline TickerPtr Application::GetFrameTicker() const

View File

@ -20,24 +20,25 @@
#include <kiwano/utils/Logger.h>
#include <kiwano/platform/Runner.h>
#include <kiwano/platform/Input.h>
#include <kiwano/platform/Application.h>
#define KGE_MAX_SKIP_FRAMES 10
#include <kiwano/render/Renderer.h>
#include <kiwano/base/Director.h>
namespace kiwano
{
RunnerPtr Runner::Create(WindowPtr main_window)
RunnerPtr Runner::Create(Settings settings)
{
RunnerPtr ptr = memory::New<Runner>();
if (ptr)
{
ptr->SetMainWindow(main_window);
ptr->SetSettings(settings);
}
return ptr;
}
RunnerPtr Runner::Create(WindowPtr main_window, Function<void()> on_ready, Function<void()> on_destroy)
RunnerPtr Runner::Create(Settings settings, Function<void()> on_ready, Function<void()> on_destroy)
{
class CallbackRunner : public Runner
{
@ -63,7 +64,7 @@ RunnerPtr Runner::Create(WindowPtr main_window, Function<void()> on_ready, Funct
{
ptr->on_ready = on_ready;
ptr->on_destroy = on_destroy;
ptr->SetMainWindow(main_window);
ptr->SetSettings(settings);
}
return ptr;
}
@ -72,6 +73,36 @@ Runner::Runner() {}
Runner::~Runner() {}
void Runner::InitSettings()
{
if (settings_.debug_mode)
{
// Show console window before creating main window
Logger::GetInstance().ShowConsole(true);
}
// Create game window
WindowPtr window =
Window::Create(settings_.title, settings_.width, settings_.height, settings_.icon, settings_.resizable);
SetWindow(window);
// Update renderer settings
Renderer::GetInstance().MakeContextForWindow(window);
Renderer::GetInstance().SetClearColor(settings_.bg_color);
Renderer::GetInstance().SetVSyncEnabled(settings_.vsync_enabled);
// Use defaut modules
Application::GetInstance().Use(Input::GetInstance());
Application::GetInstance().Use(Director::GetInstance());
// Enable debug mode
if (settings_.debug_mode)
{
Director::GetInstance().ShowDebugInfo(true);
Renderer::GetInstance().GetContext().SetCollectingStatus(true);
}
}
bool Runner::MainLoop(Duration dt)
{
if (!main_window_)
@ -79,7 +110,7 @@ bool Runner::MainLoop(Duration dt)
if (main_window_->ShouldClose())
{
if (this->OnClosing())
if (this->OnClose())
return false;
main_window_->SetShouldClose(false);

View File

@ -22,6 +22,8 @@
#include <kiwano/core/Common.h>
#include <kiwano/core/Time.h>
#include <kiwano/platform/Window.h>
#include <kiwano/render/Color.h>
#include <kiwano/render/Texture.h>
namespace kiwano
{
@ -30,26 +32,52 @@ class Application;
KGE_DECLARE_SMART_PTR(Runner);
/**
* \~chinese
* @brief
*/
struct Settings
{
uint32_t width; ///< 窗口宽度
uint32_t height; ///< 窗口高度
String title; ///< 窗口标题
uint32_t icon; ///< 窗口图标
bool resizable; ///< 窗口大小可调整
Color bg_color; ///< 窗口背景色
bool vsync_enabled; ///< 垂直同步
bool debug_mode; ///< 调试模式
Settings()
: width(800)
, height(600)
, title("Kiwano")
, icon()
, resizable(false)
, bg_color(Color::Black)
, vsync_enabled(true)
, debug_mode(false)
{
}
};
/**
* \~chinese
* @brief
*/
class KGE_API Runner : public ObjectBase
{
friend class Application;
public:
/// \~chinese
/// @brief 创建程序运行器
/// @param main_window 主窗口
static RunnerPtr Create(WindowPtr main_window);
static RunnerPtr Create(Settings settings);
/// \~chinese
/// @brief 创建程序运行器
/// @param main_window 主窗口
/// @param on_ready 应用程序初始化完成后执行的回调函数
/// @param on_destroy 应用程序销毁时执行的回调函数
static RunnerPtr Create(WindowPtr main_window, Function<void()> on_ready, Function<void()> on_destroy = nullptr);
static RunnerPtr Create(Settings settings, Function<void()> on_ready, Function<void()> on_destroy = nullptr);
Runner();
@ -69,7 +97,7 @@ public:
/// @brief 应用程序关闭处理
/// @details 重载该函数以处理用户关闭应用程序时的行为,如保存用户数据等
/// @return 返回true允许用户关闭程序否则阻止程序关闭
virtual bool OnClosing();
virtual bool OnClose();
/// \~chinese
/// @brief 应用程序主循环
@ -79,14 +107,29 @@ public:
virtual bool MainLoop(Duration dt);
/// \~chinese
/// @brief »ñÈ¡Ö÷´°¿Ú
WindowPtr GetMainWindow() const;
/// @brief 获取窗口
WindowPtr GetWindow() const;
/// \~chinese
/// @brief ÉèÖÃÖ÷´°¿Ú
void SetMainWindow(WindowPtr window);
/// @brief 设置窗口
void SetWindow(WindowPtr window);
/// \~chinese
/// @brief 获取设置
Settings GetSettings() const;
protected:
/// \~chinese
/// @brief 修改设置
void SetSettings(Settings settings);
private:
friend class Application;
void InitSettings();
private:
Settings settings_;
WindowPtr main_window_;
};
@ -94,19 +137,29 @@ inline void Runner::OnReady() {}
inline void Runner::OnDestroy() {}
inline bool Runner::OnClosing()
inline bool Runner::OnClose()
{
return true;
}
inline WindowPtr Runner::GetMainWindow() const
inline WindowPtr Runner::GetWindow() const
{
return main_window_;
}
inline void Runner::SetMainWindow(WindowPtr window)
inline void Runner::SetWindow(WindowPtr window)
{
main_window_ = window;
}
inline Settings Runner::GetSettings() const
{
return settings_;
}
inline void Runner::SetSettings(Settings settings)
{
settings_ = settings;
}
} // namespace kiwano

View File

@ -79,13 +79,13 @@ public:
void Resize(uint32_t width, uint32_t height) override;
protected:
RendererImpl();
void MakeContextForWindow(WindowPtr window) override;
void Destroy() override;
protected:
RendererImpl();
private:
using ID2DDeviceResources = kiwano::graphics::directx::ID2DDeviceResources;
using ID3DDeviceResources = kiwano::graphics::directx::ID3DDeviceResources;

View File

@ -31,22 +31,6 @@ Renderer::Renderer()
{
}
void Renderer::SetupModule()
{
WindowPtr window = Application::GetInstance().GetMainWindow();
MakeContextForWindow(window);
}
void Renderer::DestroyModule()
{
Destroy();
}
void Renderer::HandleEvent(Event* evt)
{
// DO NOTHING
}
void Renderer::BeginDraw()
{
KGE_ASSERT(render_ctx_);

View File

@ -44,7 +44,7 @@ namespace kiwano
* \~chinese
* @brief
*/
class KGE_API Renderer : public EventModule
class KGE_API Renderer : public Noncopyable
{
public:
/// \~chinese
@ -235,20 +235,17 @@ public:
/// @throw kiwano::SystemError 呈现失败时抛出
virtual void Present() = 0;
public:
void SetupModule() override;
/// \~chinese
/// @brief 为窗口创建渲染上下文
virtual void MakeContextForWindow(WindowPtr window) = 0;
void DestroyModule() override;
void HandleEvent(Event* evt) override;
/// \~chinese
/// @brief 销毁渲染器资源
virtual void Destroy() = 0;
protected:
Renderer();
virtual void MakeContextForWindow(WindowPtr window) = 0;
virtual void Destroy() = 0;
protected:
bool vsync_;
Color clear_color_;