应用程序

应用程序Application 控制游戏的整个生命周期,包括游戏初始化、启动、结束以及事件分发等。

单例模式

应用程序是 Kiwano 中最常见的单例模式之一,使用 GetInstance() 获取该对象的引用。

// 获取应用程序实例
Application& app = Application::GetInstance();
// 调用 Quit() 函数退出游戏
app.Quit();

游戏生命周期

应用程序通过 Run() 函数启动整个游戏,启动游戏前需要一个 运行器Runner

// 创建运行器
RefPtr<Runner> runner = new Runner(window);
// 启动游戏
Application::GetInstance().Run(runner);

Run() 函数的第二个参数是可选参数,用于指示是否开启调试模式

// 在调试状态下启动游戏,第二个参数意为 debug
Application::GetInstance().Run(runner, true);

调试模式下画面左上角会出现调试信息,用于辅助解决性能问题或内存泄漏等。

在代码的任意地方可以通过 Quit() 函数来结束游戏。

// 退出游戏
Application::GetInstance().Quit();

添加模块

应用程序可以通过添加 模块Module 的方式扩展游戏功能,例如Kiwano的音频模块、ImGui模块、HTTP模块都是作为扩展模块添加到游戏中的。

使用 Use() 函数添加一个模块:

// 获取音频模块实例
audio::Module& am = audio::Module::GetInstance();
// 添加音频模块
Application::GetInstance().Use(am);

应用程序会自动完成模块的初始化、运行和销毁,无需关心模块的内部运行过程。

注意:添加模块应在 Run 函数启动游戏前执行

事件分发

应用程序控制着整个事件系统,可以使用 DispatchEvent 发送用户自定义的事件

RefPtr<Event> event = ...;
Application::GetInstance().DispatchEvent(event);

时间缩放因子

时间缩放因子可以在一定程度上控制游戏速度,例如快进2倍或放慢到0.5倍。

// 将游戏时间加快到2倍
Application::GetInstance().SetTimeScale(2.0);

时间因子只会影响到update与dt相关的部分,也就是仅对 update = f(dt); 的部分生效。
如果用户通过Kiwano以外的方式处理时间,那么时间因子也不生效。

在主线程中执行函数

如果你在多线程下工作,在其他线程的代码下需要执行一段主线程运行的函数时,可以通过 PerformInMainThread 函数执行

void TestFunc()
{
    KGE_LOG("Run test!");
}

// 在主线程中执行 TestFunc 函数
Application::GetInstance().PerformInMainThread(TestFunc);

PerformInMainThread() 是非阻塞的,执行完后立即返回,并在主线程执行回调函数时阻塞

results matching ""

    No results matching ""