原文: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)的更多相关文章

  1. Directx11教程(4) 一个最基本D3D应用程序(2)

    原文:Directx11教程(4) 一个最基本D3D应用程序(2) 接着上篇教程的代码,本篇加入基本的D3D代码,实现一个完整的D3D11程序框架. 我们增加一个新类D3DClass, 用来处理3D渲 ...

  2. Directx11教程(20) 一个简单的水面

    原文:Directx11教程(20) 一个简单的水面 nnd,以前发的这篇教程怎么没有了?是我自己误删除了,还是被系统删除了? 找不到存稿了,没有心情再写一遍了.      简单说一下,本篇教程就是实 ...

  3. Directx11教程(8) 一个新的camera类

    原文:Directx11教程(8) 一个新的camera类      本章我们将替换掉CameraClass类,实现一个稍微靠谱点的摄像机类.并通过Q,W,E,A,S,D,Z,X,C等按键实现摄像机的 ...

  4. Directx11教程(11) 增加一个debug宏

    原文:Directx11教程(11) 增加一个debug宏       现在我们在common.h中增加一个debug的宏,在每个d3d11函数后调用,如果d3d函数出错,它能够给出程序中错误的代码行 ...

  5. Directx11教程(6) 画一个简单的三角形(2)

    原文:Directx11教程(6) 画一个简单的三角形(2)      在上篇教程中,我们实现了在D3D11中画一个简单的三角形,但是,当我们改变窗口大小时候,三角形形状却随着窗口高宽比例改变而改变, ...

  6. Directx11教程(56) 建立一个skydome

    原文:Directx11教程(56) 建立一个skydome       本章建立一个skydome(天空穹),主要学习如何使用cube mapping.      cube map就是把六张纹理当作 ...

  7. Directx11教程(19) 画一个简单的地形

    原文:Directx11教程(19) 画一个简单的地形       通常我们在xz平面定义一个二维的网格,然后y的值根据一定的函数计算得到,比如正弦.余弦函数的组合等等,可以得到一个看似不错的地形或者 ...

  8. Directx11教程(10) 画一个简易坐标轴

    原文:Directx11教程(10) 画一个简易坐标轴       本篇教程中,我们将在三维场景中,画一个简易的坐标轴,分别用红.绿.蓝三种颜色表示x,y,z轴的正向坐标轴. 为此,我们要先建立一个A ...

  9. Directx11教程(9) 增加一个TimerClass类

    原文:Directx11教程(9) 增加一个TimerClass类      在上篇教程代码的基础上,我们增加一个TimerClass类,这个类的功能很简单,就是可以计算相邻2帧的时间差.利用这个时间 ...

随机推荐

  1. vue.js_05_vue.js的过滤器

    1.过滤器的定义和使用 实现:将页面的中的单纯替换成,用户传来的文字. 全局过滤器:所有的Vue对象都可以使用 <body> <div id="app"> ...

  2. thinkphp浏览历史功能实现方法

    这篇文章主要介绍了thinkphp浏览历史功能实现方法,可实现浏览器的浏览历史功能,是非常实用的技巧,需要的朋友可以参考下 本文实例讲述了thinkphp浏览历史功能实现方法,分享给大家供大家参考.具 ...

  3. springboot核心技术(一)-----入门、配置

    Hello World 1.创建一个maven工程:(jar) 2.导入spring boot相关的依赖 <parent> <groupId>org.springframewo ...

  4. ERROR:ORA-30076: 对析出来源无效的析出字段

    DEBUG:key: sql: select count(*) as col_0_0_ from jc_user cmsuser0_ where 1=1 and cmsuser0_.register_ ...

  5. python-web-下载所有xkcd漫画

    下载所有xkcd漫画 # downloads every single xkcd comic import requests,os,bs4 url='http://xkcd.com' # start ...

  6. 2019-5-25-如何在-CMD-启动的软件传入带空格的路径

    title author date CreateTime categories 如何在 CMD 启动的软件传入带空格的路径 lindexi 2019-05-25 09:31:46 +0800 2019 ...

  7. 基于VSCode的vue单文件组件模板设置---一次设置,可爽终生

    第一步: 第二步: 第三步: 打开vue.json文件后,如果是初次设置,应该如下图所示,绿色注释部分不用管,注意那两个白色大括号 第四步:在大括号内全部粘贴如下代码,保存即可完成vue模板的设置 & ...

  8. Javascript模块化编程(一)模块的写法最佳实践

    Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块但是,Javascript不是一种模块化编程语言,它不支持类clas ...

  9. mysql8.0 安装版没有my.ini

    这时候,打开 benchmark,看一下实际路径就好了

  10. Redis → Windows下搭建redis集群

    一,redis集群介绍 Redis cluster(redis集群)是在版本3.0后才支持的架构,和其他集群一样,都是为了解决单台服务器不够用的情况,也防止了主服务器宕机无备用服务器,多个节点网络互联 ...