Directx11教程(3) 一个最基本D3D应用程序(1)
原文:Directx11教程(3) 一个最基本D3D应用程序(1)
在前一篇教程程序代码的基础上,这次我们将增加2个类:
InputClass,键盘处理的代码将放在这个类里面,GraphicsClass类,D3D渲染的代码放在这个类里,这两个类都是SystemClass类的成员变量,SystemClass类中会调用这2个类实例的初始化、渲染以及shutdown函数。
增加这个两个类后,应用的程序的框架如下:

System Class类有点小变动,增加了两个成员变量m_Input,m_Graphics,分别处理输入和渲染的操作。
SystemClass.h改变的代码如下:
class SystemClass
{
public:
SystemClass(void);
…
HWND m_hwnd;
//InputClass和GraphicsClass是SystemClass的两个成员变量
InputClass* m_Input;
GraphicsClass* m_Graphics;
};
SystemClass.cpp改变的代码主要如下:
SystemClass::SystemClass(void)
{
m_Input = 0;
m_Graphics = 0;
}
SystemClass::SystemClass(const SystemClass &)
{
}
SystemClass::~SystemClass(void)
{
}
//调用窗口初始化函数和其它一些类的初始化函数
bool SystemClass::Initialize()
{
int screenWidth = 0, screenHeight = 0;
// 初始化窗口
InitializeWindows(screenWidth, screenHeight);
//创建input对象处理键盘输入
m_Input = new InputClass;
if(!m_Input)
{
return false;
}
// 初始化输入对象.
m_Input->Initialize();
// 创建图形对象,这个对象将渲染应用程序中的所有物体
m_Graphics = new GraphicsClass;
if(!m_Graphics)
{
return false;
}
// 初始化图形对象
result = m_Graphics->Initialize(screenWidth, screenHeight, m_hwnd);
if(!result)
{
return false;
}
return true;
}
void SystemClass::Shutdown()
{
//其它类的一些销毁工作
if(m_Graphics)
{
m_Graphics->Shutdown();
delete m_Graphics;
m_Graphics = 0;
}
if(m_Input)
{
delete m_Input;
m_Input = 0;
}
// 执行一些销毁工作.
ShutdownWindows();
}
在Frame函数中检测用户按键以及调用图形渲染函数。
bool SystemClass::Frame()
{
bool result;
//检测用户是否按下ESC键,如果按下,退出程序.
if(m_Input->IsKeyDown(VK_ESCAPE))
{
return false;
}
// 执行帧渲染函数.
bool result = m_Graphics->Frame();
if(!result)
{
return false;
}
return true;
}
LRESULT CALLBACK SystemClass::MessageHandler(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam)
{
switch(umsg)
{
// 检测按键消息.
case WM_KEYDOWN:
{
m_Input->KeyDown((unsigned int)wparam);
return 0;
}
case WM_KEYUP:
{
m_Input->KeyUp((unsigned int)wparam);
return 0;
}
//任何其它消息发送到windows缺省处理.
default:
{
return DefWindowProc(hwnd, umsg, wparam, lparam);
}
}
}
InputClass.h代码如下:
#pragma once
class InputClass
{
public:
InputClass(void);
InputClass(const InputClass&);
~InputClass(void);
void Initialize();
void KeyDown(unsigned int);
void KeyUp(unsigned int);
bool IsKeyDown(unsigned int);
private:
bool m_keys[256];//用来存放256个虚拟键是否被按下
};
InputClass.cpp代码如下:
#include "InputClass.h"
InputClass::InputClass(void)
{
}
InputClass::InputClass(const InputClass&)
{
}
InputClass::~InputClass(void)
{
}
void InputClass::Initialize()
{
int i;
// 初始所有的键都是非按下状态.
for(i=0; i<256; i++)
{
m_keys[i] = false;
}
return;
}
void InputClass::KeyDown(unsigned int input)
{
//键被按下.
m_keys[input] = true;
return;
}
void InputClass::KeyUp(unsigned int input)
{
//释放按键.
m_keys[input] = false;
return;
}
bool InputClass::IsKeyDown(unsigned int key)
{
// 判断键是否被按下?
return m_keys[key];
}
GraphicsClass.h代码如下:
#pragma once
#include <windows.h>
/////////////
// GLOBALS //
/////////////
const bool FULL_SCREEN = false; //是否全屏
const bool VSYNC_ENABLED = true; //是否垂直同步
const float SCREEN_DEPTH = 1000.0f; //深度,远点
const float SCREEN_NEAR = 0.1f; //深度,近点
class GraphicsClass
{
public:
GraphicsClass(void);
GraphicsClass(const GraphicsClass&);
~GraphicsClass(void);
bool Initialize(int, int, HWND);
void Shutdown();
bool Frame();
private:
bool Render();
};
GraphicsClass.cpp代码如下,注意现在只是一个框架,并没有实际的渲染代码,下一篇日志中,我们将加入D3D的初始化操作代码:
#include "GraphicsClass.h"
GraphicsClass::GraphicsClass(void)
{
}
GraphicsClass::GraphicsClass(const GraphicsClass&)
{
}
GraphicsClass::~GraphicsClass(void)
{
}
bool GraphicsClass:: Initialize(int screenWidth, int screenHeight, HWND hwnd)
{
return true;
}
void GraphicsClass::Shutdown()
{
return;
}
bool GraphicsClass::Frame()
{
return true;
}
bool GraphicsClass::Render()
{
return true;
}
程序执行后,界面和前两篇教程给出的是一样的。

工程文件myTutorialD3D11_2
代码下载:
http://files.cnblogs.com/mikewolf2002/myTutorialD3D11.zip
Directx11教程(3) 一个最基本D3D应用程序(1)的更多相关文章
- Directx11教程(4) 一个最基本D3D应用程序(2)
原文:Directx11教程(4) 一个最基本D3D应用程序(2) 接着上篇教程的代码,本篇加入基本的D3D代码,实现一个完整的D3D11程序框架. 我们增加一个新类D3DClass, 用来处理3D渲 ...
- Directx11教程(20) 一个简单的水面
原文:Directx11教程(20) 一个简单的水面 nnd,以前发的这篇教程怎么没有了?是我自己误删除了,还是被系统删除了? 找不到存稿了,没有心情再写一遍了. 简单说一下,本篇教程就是实 ...
- Directx11教程(8) 一个新的camera类
原文:Directx11教程(8) 一个新的camera类 本章我们将替换掉CameraClass类,实现一个稍微靠谱点的摄像机类.并通过Q,W,E,A,S,D,Z,X,C等按键实现摄像机的 ...
- Directx11教程(11) 增加一个debug宏
原文:Directx11教程(11) 增加一个debug宏 现在我们在common.h中增加一个debug的宏,在每个d3d11函数后调用,如果d3d函数出错,它能够给出程序中错误的代码行 ...
- Directx11教程(6) 画一个简单的三角形(2)
原文:Directx11教程(6) 画一个简单的三角形(2) 在上篇教程中,我们实现了在D3D11中画一个简单的三角形,但是,当我们改变窗口大小时候,三角形形状却随着窗口高宽比例改变而改变, ...
- Directx11教程(56) 建立一个skydome
原文:Directx11教程(56) 建立一个skydome 本章建立一个skydome(天空穹),主要学习如何使用cube mapping. cube map就是把六张纹理当作 ...
- Directx11教程(19) 画一个简单的地形
原文:Directx11教程(19) 画一个简单的地形 通常我们在xz平面定义一个二维的网格,然后y的值根据一定的函数计算得到,比如正弦.余弦函数的组合等等,可以得到一个看似不错的地形或者 ...
- Directx11教程(10) 画一个简易坐标轴
原文:Directx11教程(10) 画一个简易坐标轴 本篇教程中,我们将在三维场景中,画一个简易的坐标轴,分别用红.绿.蓝三种颜色表示x,y,z轴的正向坐标轴. 为此,我们要先建立一个A ...
- Directx11教程(9) 增加一个TimerClass类
原文:Directx11教程(9) 增加一个TimerClass类 在上篇教程代码的基础上,我们增加一个TimerClass类,这个类的功能很简单,就是可以计算相邻2帧的时间差.利用这个时间 ...
随机推荐
- mysql报错:You must reset your password using ALTER USER statement before executing this statement.
新安装mysql后,登录后,执行任何命令都会报错: You must reset your password using ALTER USER statement before executing t ...
- 省际联动distpicker插件的使用讲解
1.在使用input页面加载script的引用 <script src="js/distpicker/distpicker.data.js"></script&g ...
- 左神算法书籍《程序员代码面试指南》——1_08构造数组的MaxTree
[题目] 将一个没有重复数字的数组中的数据构造一个二叉树 每个节点都是该子树的最大值 [要求] 时间复杂度为O(N)[题解] 使用单调栈,栈的顺序是维持从大到小排序 通过使用单调栈,将数组中中所有数的 ...
- 2016年省赛 G Triple Nim
2016年省赛 G Triple Nimnim游戏,要求开始局面为先手必败,也就是异或和为0.如果n为奇数,二进制下最后一位只有两种可能1,1,1和1,0,0,显然异或和为1,所以方案数为0如果n为偶 ...
- Javascript-简单的计时钟表
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- JNI初级:android studio生成so文件详细过程
本文主要参考blog:http://blog.csdn.net/jkan2001/article/details/54316375 下面是本人结合blog生成so包过程中遇到一些问题和解决方法 (1) ...
- node学习记录——搭建web服务器
web服务器的基本知识 功能:1.接收HTTP请求(get,post,delete,put)2.处理HTTP请求 常见的web服务器架构: 1. Nginx/Apache:负责接收http请求,确定谁 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之SimpleRemoteWithUndoTest[转]
命令模式可以很轻松的实现撤销(Undo)功能. 命令的接受者: 1unit uReceiveObject; 2 3interface 4 5type 6 TLight = class(T ...
- redis异常-MISCONF Redis is configured to save RDB snapshots
在eclipse中用java代码通过jedis操作redis的时候,报这个错: redis.clients.jedis.exceptions.JedisDataException: MISCON ...
- div覆盖div DIV相互重叠如何解决
div覆盖div,出现div与div盒子之间产生重叠覆盖现象,而内容没有出现覆盖重叠现象原因与解决方法.DIVCSS5通过CSS图文案例介绍产生原因与解决方法.DIV与DIV覆盖原因与解决方法. 可能 ...