【DND图形库】二、创建控制台窗口和游戏循环
二、创建控制台窗口和游戏循环
(甲)为何我们需要创建控制台窗口
虽然游戏需要的是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图形库】二、创建控制台窗口和游戏循环相关推荐
- 2.创建适合游戏的窗口和消息循环
2.创建适合游戏的窗口和消息循环 本章前言: 创建游戏窗口和处理消息循环是很重要的事情,我尝试过几种不同的窗口处理方式,这次打算使用WS_POPUP样式的窗口(无边框).上一次的框架代码把创建窗口和消 ...
- 游戏设计模式阅读笔记8——序列模式(游戏循环)
目录 一.意图 二.动机 三.游戏循环 四.实例代码 1.能跑多快跑多快 2.休息一下 3.可以走一小步,也可以走一大步 4.固定时间刷新 五.目前的游戏循环 六.用电量相关 七.总结 1.固定时间步 ...
- 【Unity3D】Unity 编辑器窗口布局 ( 创建 Unity3D 项目 | 添加物体 | 层级窗口 | 场景窗口 | 游戏窗口 | 属性窗口 | 项目窗口 | 控制台窗口 | 窗口位置修改 )
文章目录 一.在 Unity Hub 中创建 Unity 2020 编辑器版本的 Unity3D 项目 二.Unity 编辑器窗口布局 1.添加物体 2.菜单栏和工具栏 3.Hierarchy 层级窗 ...
- 【OpenGL】二十四、OpenGL 纹理贴图 ( 读取文件内容 | 桌面程序添加控制台窗口 | ‘fopen‘: This function may be unsafe 错误处理 )
文章目录 一.文件读取 二.报错处理 ( 'fopen': This function or variable may be unsafe. ) 三.桌面程序添加控制台窗口 四.相关资源 一.文件读取 ...
- [实战]C++加Lua加SDL来重写龙神录弹幕游戏(2):Lua创建SDL窗口
完成了准备工作之后,就可以开始撸代码了.因为项目也不是很大,就打算大部分都用lua来开发.上一篇已经写了一部分测试代码,但都是塞到一个Main.cpp之中,主要是为了测试配置是否成功.这次的工作就要把 ...
- 【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区
00. 目录 文章目录 00. 目录 01. COORD结构体 02. SMALL_RECT结构 03. CONSOLE_SCREEN_BUFFER_INFO结构体 04. GetConsoleScr ...
- 【DND图形库】一、简介与环境配置
一.简介与环境配置 (甲)简介 这是一个2D图形库,基于DirectX11,使用C++作为开发语言,最低支持Windows7和DirectX11显卡(如果显卡不支持,绘图效率会很低). 主要的目的是开 ...
- EGE相关:控制台窗口的设置
EGE专栏:EGE专栏 文章目录 相关问题快速浏览 1. 控制台窗口是什么? 2. 原本还能使用控制台,为什么配置了EGE后就不能用了? 3. 使用printf()为什么不能在EGE的窗口上显示 4. ...
- C++项目实战(二)——简化版 “吃豆子游戏---pacman” 实现
本项目通过使用 windows 窗口应用程序 实现一个简化版的 吃豆子游戏,主要涉及的知识点包含有:面向对象编程思想.windows 消息循环的工作原理.windows 窗口应用程序实现.父类与子类的 ...
最新文章
- 独家 | 每个数据科学家应该知道的五种检测异常值的方法(附Python代码)
- hdu4998 旋转坐标系
- Synbak 2.1 发布,系统备份工具
- 【UAV】光流传感器代码分析
- Unsafe类方法详解
- 记录使用websocket时因为Sec-Websocket-Protocol遇到的一个问题
- 用C#来学习唐诗三百首和全唐诗
- eclipse maven打包jar 部分jsp无法访问_Maven系列教材 (九)- 在Eclipse中创建maven风格的java web项目...
- 这个 DNS 新漏洞可导致大规模的 DDoS 攻击活动
- 裴礼文数学分析中的典型问题与方法第5章级数练习
- IP切换器是做什么用的?
- 3D点云处理:点云曲率-主曲率/高斯曲率/平均曲率
- VMware虚拟机Ubuntu系统如何连接网络
- oracle19c创建表空间,Oracle19c 创建表空间
- 开始使用Elasticsearch (2): 了解如何进行搜索
- c语言变量大全,C语言变量
- java 兔子的生娃问题
- C++ websocket 使用体验
- 【第3版emWin教程】第53章 emWin6.x的按钮Button控件
- 计算机408考研究竟有多难?