二、创建控制台窗口和游戏循环

(甲)为何我们需要创建控制台窗口

虽然游戏需要的是Windows窗口,但是这个窗口可以帮助我们查看即时的调试信息,不输出调试的程序就和不写注释的程序一样,后来修改的人总是很难受(也可能是自己跳这个坑)。

(乙)创建

我们直接在上一章的Tutorial_01项目里进行修改,DND有一个控制台调试类(DebuggerConsole),如下使用即可

DebuggerConsole debug;//定义Debugger调试器变量
Debug::SetDebugger(&debug);//传给Debug设置

DND最核心的类是Game类,用户需要继承它实现一个类,假设我们就取名为T01

class T01 : public Game
{
public:virtual void _update() override{//帧函数debug_info(L"update");}virtual void _init() override{//初始化}virtual void _release() override{//结束}
};

其中_update函数是会一直循环执行的函数,称为帧函数。假设游戏有60帧,那么一秒钟此函数执行60次。

_init函数用于写一些加载资源初始化的代码,_release是程序结束之前调用的函数。

在帧函数里,我们用debug_info函数输出了文本"update",学过C语言都知道,双引号括起来是字符串。而在前面加L的含义是,双字节字符串。也就是wchar_t类型,是占两个字节的,而char只占一个字节,也就是8位,只能表示[0, 255],所以在以前用两个char表示更多的文字符号。而现在更先进的直接用wchar_t表示字符了,比如上一章用到的MessageBox,实际上是一个宏,实际微软实现了两个MessageBox函数,一个用char传参,一个用wchar_t传参。为了代码兼容不用修改,就做了如下处理:

#ifdef UNICODE
#define MessageBox  MessageBoxW
#else
#define MessageBox  MessageBoxA
#endif // !UNICODE

可以看到,定义了UNICODE宏,则MessageBox为MessageBoxW,否则为MessageBoxA。C和C++的标准库函数也定义了两套函数,加w前缀或后缀的就是使用的宽字符(wchar_t)作为参数。比如字符串拷贝函数就分为了strcpy与wcscpy。

回到正题,由于需要使用到DND图形库默认的资源,以及加载dll,需要设置工作路径,也就是程序读取文件的根目录,如下图所示:

现在再回到代码层面,T01的内容已经写好,需要定义一个T01全局变量,接着在主函数里,如下调用:

T01 g_t01;DNDMain()
{g_t01.Init();//初始化 DND库g_t01.EnterLoop();//进入游戏循环g_t01.Release();//释放资源
}

其中Init函数会初始化库,EnterLoop函数就进入了游戏循环,等到EnterLoop结束,才会执行Release函数释放库的资源,最后才结束了程序。

这次的运行就会输出许多的日志了,等到库的资源初始化完毕,就会一直循环执行_update()函数我们所写的代码:

最后反复执行输出update:

只输出一个文本实在太无趣了,我们可以这样输出FPS:

virtual void _update() override
{//帧函数//将无符号整形UINT32转为字符串StringString str = String::Format(256, L"FPS: %u", time->GetRealFPS());debug_info(str);//打印FPS
}
virtual void _init() override
{//初始化time->SetFPS(0);//设为0以不限制帧数(默认为60)
}

运行结果如下,可以看到FPS有900多,实际上创建窗口后什么都不输出,FPS可以到四五千。往控制台打印字符串实际是比较慢的操作。

(丙)完整代码

#include <DND.h>
using namespace DND;class T01 : public Game
{
public:virtual void _update() override{//帧函数String str = String::Format(256, L"FPS: %u", time->GetRealFPS());debug_info(str);}virtual void _init() override{//初始化time->SetFPS(0);//设为0以不限制帧数(默认为60)}virtual void _release() override{//结束}
};T01 g_t01;DNDMain()
{DebuggerConsole debug;Debug::SetDebugger(&debug);g_t01.Init();g_t01.EnterLoop();g_t01.Release();//MessageBox(NULL, L"Hello World!", L"标题栏", MB_OK);
}

【DND图形库】二、创建控制台窗口和游戏循环相关推荐

  1. 2.创建适合游戏的窗口和消息循环

    2.创建适合游戏的窗口和消息循环 本章前言: 创建游戏窗口和处理消息循环是很重要的事情,我尝试过几种不同的窗口处理方式,这次打算使用WS_POPUP样式的窗口(无边框).上一次的框架代码把创建窗口和消 ...

  2. 游戏设计模式阅读笔记8——序列模式(游戏循环)

    目录 一.意图 二.动机 三.游戏循环 四.实例代码 1.能跑多快跑多快 2.休息一下 3.可以走一小步,也可以走一大步 4.固定时间刷新 五.目前的游戏循环 六.用电量相关 七.总结 1.固定时间步 ...

  3. 【Unity3D】Unity 编辑器窗口布局 ( 创建 Unity3D 项目 | 添加物体 | 层级窗口 | 场景窗口 | 游戏窗口 | 属性窗口 | 项目窗口 | 控制台窗口 | 窗口位置修改 )

    文章目录 一.在 Unity Hub 中创建 Unity 2020 编辑器版本的 Unity3D 项目 二.Unity 编辑器窗口布局 1.添加物体 2.菜单栏和工具栏 3.Hierarchy 层级窗 ...

  4. 【OpenGL】二十四、OpenGL 纹理贴图 ( 读取文件内容 | 桌面程序添加控制台窗口 | ‘fopen‘: This function may be unsafe 错误处理 )

    文章目录 一.文件读取 二.报错处理 ( 'fopen': This function or variable may be unsafe. ) 三.桌面程序添加控制台窗口 四.相关资源 一.文件读取 ...

  5. [实战]C++加Lua加SDL来重写龙神录弹幕游戏(2):Lua创建SDL窗口

    完成了准备工作之后,就可以开始撸代码了.因为项目也不是很大,就打算大部分都用lua来开发.上一篇已经写了一部分测试代码,但都是塞到一个Main.cpp之中,主要是为了测试配置是否成功.这次的工作就要把 ...

  6. 【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区

    00. 目录 文章目录 00. 目录 01. COORD结构体 02. SMALL_RECT结构 03. CONSOLE_SCREEN_BUFFER_INFO结构体 04. GetConsoleScr ...

  7. 【DND图形库】一、简介与环境配置

    一.简介与环境配置 (甲)简介 这是一个2D图形库,基于DirectX11,使用C++作为开发语言,最低支持Windows7和DirectX11显卡(如果显卡不支持,绘图效率会很低). 主要的目的是开 ...

  8. EGE相关:控制台窗口的设置

    EGE专栏:EGE专栏 文章目录 相关问题快速浏览 1. 控制台窗口是什么? 2. 原本还能使用控制台,为什么配置了EGE后就不能用了? 3. 使用printf()为什么不能在EGE的窗口上显示 4. ...

  9. C++项目实战(二)——简化版 “吃豆子游戏---pacman” 实现

    本项目通过使用 windows 窗口应用程序 实现一个简化版的 吃豆子游戏,主要涉及的知识点包含有:面向对象编程思想.windows 消息循环的工作原理.windows 窗口应用程序实现.父类与子类的 ...

最新文章

  1. 独家 | 每个数据科学家应该知道的五种检测异常值的方法(附Python代码)
  2. hdu4998 旋转坐标系
  3. Synbak 2.1 发布,系统备份工具
  4. 【UAV】光流传感器代码分析
  5. Unsafe类方法详解
  6. 记录使用websocket时因为Sec-Websocket-Protocol遇到的一个问题
  7. 用C#来学习唐诗三百首和全唐诗
  8. eclipse maven打包jar 部分jsp无法访问_Maven系列教材 (九)- 在Eclipse中创建maven风格的java web项目...
  9. 这个 DNS 新漏洞可导致大规模的 DDoS 攻击活动
  10. 裴礼文数学分析中的典型问题与方法第5章级数练习
  11. IP切换器是做什么用的?
  12. 3D点云处理:点云曲率-主曲率/高斯曲率/平均曲率
  13. VMware虚拟机Ubuntu系统如何连接网络
  14. oracle19c创建表空间,Oracle19c 创建表空间
  15. 开始使用Elasticsearch (2): 了解如何进行搜索
  16. c语言变量大全,C语言变量
  17. java 兔子的生娃问题
  18. C++ websocket 使用体验
  19. 【第3版emWin教程】第53章 emWin6.x的按钮Button控件
  20. 计算机408考研究竟有多难?

热门文章

  1. 剑指 Offer 03——10
  2. 【数据分析实例】1000 万条淘宝用户行为数据实时分析
  3. 四十一、深入Java中的 File类
  4. 关于数据库插入中文乱码问题
  5. 效率飞起!BML CodeLab发布重磅更新
  6. CVPR 2020 三篇有趣的论文解读
  7. pytorch基本数学运算:加法 减法 乘法 除法 指数 对数 绝对值
  8. 洛谷P3919可持久化线段树
  9. 算法竞赛入门与进阶 (三)贪心
  10. python中的异常处理 try..except