zoukankan      html  css  js  c++  java
  • Directx11教程(3) 一个最基本D3D应用程序(1)

        在前一篇教程程序代码的基础上,这次我们将增加2个类:

    InputClass,键盘处理的代码将放在这个类里面,GraphicsClass类,D3D渲染的代码放在这个类里,这两个类都是SystemClass类的成员变量,SystemClass类中会调用这2个类实例的初始化、渲染以及shutdown函数。

       增加这个两个类后,应用的程序的框架如下:

    image

    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;
        }

    程序执行后,界面和前两篇教程给出的是一样的。

    image

    工程文件myTutorialD3D11_2

    代码下载:

    https://files.cnblogs.com/mikewolf2002/myTutorialD3D11.zip

  • 相关阅读:
    eclipse运行maven项目报错:找不到ContextLoaderListener、IntrospectorCleanupListener
    音乐播放器项目计划进度安排
    音乐播放器计划书
    抽奖程序
    显示默认目录中的所有文件名
    单字符和多字符的文件输出
    求和
    第二周 登录小界面
    第一周随笔
    小组图书管理系统项目进度表
  • 原文地址:https://www.cnblogs.com/mikewolf2002/p/2385834.html
Copyright © 2011-2022 走看看