• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天行健 君子當自強而不息

            創建游戲內核(11)【OO改良版】

             

            本篇是創建游戲內核(10)【OO改良版】的續篇,關于該內核的細節說明請參閱創建游戲內核(11)


            接口:

            DWORD get_vertices_size(LPDIRECT3DVERTEXBUFFER9 vertex_buffer);
            DWORD get_num_bytes_per_vertex(LPDIRECT3DVERTEXBUFFER9 vertex_buffer);
            DWORD get_vertex_fvf(LPDIRECT3DVERTEXBUFFER9 vertex_buffer);
            DWORD get_num_vertices(LPDIRECT3DVERTEXBUFFER9 vertex_buffer);

            //================================================================================
            // Defines for class VERTEX_BUFFER.
            //================================================================================
            class VERTEX_BUFFER
            {
            public:
                VERTEX_BUFFER();
                ~VERTEX_BUFFER();

                IDirect3DVertexBuffer9* get_vertex_buffer();

                DWORD get_vertices_size();
                DWORD get_num_bytes_per_vertex();
                DWORD get_vertex_fvf();
                DWORD get_num_vertices();

                BOOL create(DWORD num_vertices, DWORD num_bytes_per_vertex, DWORD fvf);    
                
            void free();

                BOOL is_loaded();

                BOOL fill_in(DWORD first_vertex, DWORD num_vertices, 
            void* vertex_list);
                BOOL render(DWORD first_vertex, DWORD num_primitives, DWORD type);

                BOOL 
            lock(DWORD first_vertex = 0, DWORD num_vertices = 0);
                BOOL unlock();
                
            void* get_ptr();

            private:
                IDirect3DVertexBuffer9* m_vertex_buffer; 
            // pointer to Direct3D vertex buffer object
                char* m_ptr;                             // pointer to vertex data buffer
            };

            typedef VERTEX_BUFFER* VERTEX_BUFFER_PTR;
             

            實現:

            //---------------------------------------------------------------------------
            // Return the total size of vertices.
            //---------------------------------------------------------------------------
            DWORD get_vertices_size(LPDIRECT3DVERTEXBUFFER9 vertex_buffer)
            {
                D3DVERTEXBUFFER_DESC _buffer_desc;

                vertex_buffer->GetDesc(&_buffer_desc);

                
            return _buffer_desc.Size;
            }

            //---------------------------------------------------------------------------
            // Return the size of a vertex for a flexible vertex format (FVF)
            //---------------------------------------------------------------------------
            DWORD get_num_bytes_per_vertex(LPDIRECT3DVERTEXBUFFER9 vertex_buffer)
            {
                D3DVERTEXBUFFER_DESC _buffer_desc;

                vertex_buffer->GetDesc(&_buffer_desc);

                
            return D3DXGetFVFVertexSize(_buffer_desc.FVF);
            }

            //---------------------------------------------------------------------------
            // Return vertex flexible format.
            //---------------------------------------------------------------------------
            DWORD get_vertex_fvf(LPDIRECT3DVERTEXBUFFER9 vertex_buffer)
            {
                D3DVERTEXBUFFER_DESC _buffer_desc;

                vertex_buffer->GetDesc(&_buffer_desc);

                
            return _buffer_desc.FVF;
            }

            //---------------------------------------------------------------------------
            // Return the number of vertices.
            //---------------------------------------------------------------------------
            DWORD get_num_vertices(LPDIRECT3DVERTEXBUFFER9 vertex_buffer)
            {
                D3DVERTEXBUFFER_DESC _buffer_desc;

                vertex_buffer->GetDesc(&_buffer_desc);

                
            return _buffer_desc.Size / D3DXGetFVFVertexSize(_buffer_desc.FVF);
            }

            //---------------------------------------------------------------------------
            // Constructor, initialize data member.
            //---------------------------------------------------------------------------
            VERTEX_BUFFER::VERTEX_BUFFER()
            {
                memset(
            this, 0, sizeof(*this));
            }

            //---------------------------------------------------------------------------
            // Destructor, free vertex buffer resource.
            //---------------------------------------------------------------------------
            VERTEX_BUFFER::~VERTEX_BUFFER()
            {
                free();
            }

            //---------------------------------------------------------------------------
            // Get pointer to vetex buffer.
            //---------------------------------------------------------------------------
            IDirect3DVertexBuffer9* VERTEX_BUFFER::get_vertex_buffer()
            {
                
            return m_vertex_buffer;
            }
            //---------------------------------------------------------------------------
            // Return the total size of vertices.
            //---------------------------------------------------------------------------
            DWORD VERTEX_BUFFER::get_vertices_size()
            {
                
            return ::get_vertices_size(m_vertex_buffer);
            }

            //---------------------------------------------------------------------------
            // Gets the size of a vertex for a flexible vertex format (FVF)
            //---------------------------------------------------------------------------
            DWORD VERTEX_BUFFER::get_num_bytes_per_vertex()
            {
                
            return ::get_num_bytes_per_vertex(m_vertex_buffer);
            }

            //---------------------------------------------------------------------------
            // Get flexible vertex format.
            //---------------------------------------------------------------------------
            DWORD VERTEX_BUFFER::get_vertex_fvf()
            {
                
            return ::get_vertex_fvf(m_vertex_buffer);
            }

            //---------------------------------------------------------------------------
            // Get number of vertex.
            //---------------------------------------------------------------------------
            DWORD VERTEX_BUFFER::get_num_vertices()
            {
                
            return ::get_num_vertices(m_vertex_buffer);
            }

            //---------------------------------------------------------------------------
            // create vertex buffer.
            //---------------------------------------------------------------------------
            BOOL VERTEX_BUFFER::create(DWORD num_vertices, DWORD num_bytes_per_vertex, DWORD fvf)
            {
                
            // free vertex buffer resource first
                free();

                
            // Check condition
                if(g_d3d_device == NULL)
                    
            return FALSE;

                
            if(num_vertices == 0 || num_bytes_per_vertex == 0 || fvf == 0)
                    
            return FALSE;

                
            // create vertex buffer now
                if(FAILED(g_d3d_device->CreateVertexBuffer(
                    num_vertices * num_bytes_per_vertex, 0, fvf, D3DPOOL_MANAGED, &m_vertex_buffer, NULL)))
                    
            return FALSE;

                
            return TRUE;
            }

            //---------------------------------------------------------------------------
            // free vertex buffer resource, reset data member.
            //---------------------------------------------------------------------------
            void VERTEX_BUFFER::free()
            {
                release_com(m_vertex_buffer);
            }

            //---------------------------------------------------------------------------
            // copy vertex data from VertexList to vertex buffer.
            //---------------------------------------------------------------------------
            BOOL VERTEX_BUFFER::fill_in(DWORD first_vertex, DWORD num_vertices, void* vertex_list)
            {
                
            // check condition
                if(vertex_list == NULL || m_vertex_buffer == NULL)
                    
            return FALSE;

                
            // lock the vertex buffer
                if(! lock(first_vertex, num_vertices))
                    
            return FALSE;

                
            // copy vertices to vertex buffer
                memcpy(m_ptr, vertex_list, num_vertices * get_num_bytes_per_vertex());

                
            // unlock vertex buffer
                return unlock();
            }

            //---------------------------------------------------------------------------
            // render vertex buffer into display.
            //---------------------------------------------------------------------------
            BOOL VERTEX_BUFFER::render(unsigned long first_vertex, unsigned long num_primitives, DWORD type)
            {
                
            if(g_d3d_device == NULL || m_vertex_buffer == NULL)
                    
            return FALSE;

                
            // binds a vertex buffer to a device data stream
                g_d3d_device->SetStreamSource(0, m_vertex_buffer, 0, get_num_bytes_per_vertex());

                
            // sets the current vertex stream declaration
                g_d3d_device->SetFVF(get_vertex_fvf());

                
            // Renders a sequence of nonindexed, geometric primitives of the specified type from the current set 
                // of data input streams.
                g_d3d_device->DrawPrimitive((D3DPRIMITIVETYPE) type, first_vertex, num_primitives);

                
            return TRUE;
            }

            //---------------------------------------------------------------------------
            // lock vertex buffer from specified position with specified length.
            //---------------------------------------------------------------------------
            BOOL VERTEX_BUFFER::lock(DWORD first_vertex, DWORD num_vertices)
            {
                
            if(m_vertex_buffer == NULL)
                    
            return FALSE;

                DWORD _num_bytes_per_vertex = get_num_bytes_per_vertex();

                
            // locks a range of vertex data and obtains a pointer to the vertex buffer memory
                if(FAILED(m_vertex_buffer->Lock(first_vertex * _num_bytes_per_vertex, num_vertices * _num_bytes_per_vertex, 
                                                (
            void**)&m_ptr, 0)))
                    
            return FALSE;

                
            return TRUE;
            }

            //---------------------------------------------------------------------------
            // unlock vertex buffer.
            //---------------------------------------------------------------------------
            BOOL VERTEX_BUFFER::unlock()
            {
                
            if(m_vertex_buffer == NULL)
                    
            return FALSE;

                
            if(FAILED(m_vertex_buffer->Unlock()))
                    
            return FALSE;

                
            return TRUE;
            }

            //---------------------------------------------------------------------------
            // Check whether vertex buffer has created successfully.
            //---------------------------------------------------------------------------
            BOOL VERTEX_BUFFER::is_loaded()
            {
                
            return m_vertex_buffer ? TRUE : FALSE;
            }

            //---------------------------------------------------------------------------
            // Ger pointer to vertex data.
            //---------------------------------------------------------------------------
            void* VERTEX_BUFFER::get_ptr()
            {
                
            return (void*)m_ptr;
            }
             

            測試代碼:
            /***********************************************************************************
            PURPOSE:
                Test D3D vertex buffer.
            ***********************************************************************************/


            #include "core_common.h"
            #include "core_framework.h"
            #include "core_graphics.h"

            // The 2D vertex format and descriptor
            typedef struct
            {
                
            float x, y, z;      // 2D coordinates
                float rhw;          // rhw
                D3DCOLOR diffuse;   // diffuse color component
            } VERTEX;

            #define VERTEX_FVF   (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

            //===========================================================================
            // Defines class APP which public inherits from class FRAMEWORK.
            //===========================================================================
            class APP : public FRAMEWORK
            {
            public:    
                BOOL init()
                {
                    
            // initialize vertex data
                    VERTEX _verts[] = {
                      { 100.0f, 100.0f, 1.0f, 1.0f, D3DCOLOR_RGBA(0,64,128,255) },
                      { 300.0f, 100.0f, 1.0f, 1.0f, D3DCOLOR_RGBA(0,64,128,255) },
                      { 100.0f, 300.0f, 1.0f, 1.0f, D3DCOLOR_RGBA(0,64,128,255) },
                      { 300.0f, 300.0f, 1.0f, 1.0f, D3DCOLOR_RGBA(0,64,128,255) },
                      {  50.0f, 150.0f, 1.0f, 1.0f, D3DCOLOR_RGBA(128,0,0,128)  },
                      { 350.0f, 150.0f, 1.0f, 1.0f, D3DCOLOR_RGBA(128,0,0,128)  },
                      {  50.0f, 350.0f, 1.0f, 1.0f, D3DCOLOR_RGBA(128,0,0,128)  },
                      { 350.0f, 350.0f, 1.0f, 1.0f, D3DCOLOR_RGBA(128,0,0,128)  }
                    }; 

                    
            // Create Direct3D and Direct3DDevice object
                    if(! create_display(g_hwnd, get_client_width(g_hwnd), get_client_height(g_hwnd), 16, TRUE, FALSE))
                        
            return FALSE;    

                    DWORD num_vertices = 
            sizeof(_verts) / sizeof(VERTEX);

                    m_vertex_buffer.create(num_vertices, 
            sizeof(VERTEX), VERTEX_FVF);
                    m_vertex_buffer.fill_in(0, num_vertices, _verts);
                    
                    
            return TRUE;
                }

                BOOL frame()
                {
                    clear_display_buffer(D3DCOLOR_RGBA(0, 0, 0, 255));

                    
            if(SUCCEEDED(g_d3d_device->BeginScene()))
                    {       
                        enalbe_alpha_blending(FALSE, 0, 0);
                        m_vertex_buffer.render(0, 2, D3DPT_TRIANGLESTRIP);

                        enalbe_alpha_blending(TRUE, D3DBLEND_SRCALPHA, D3DBLEND_INVSRCALPHA);
                        m_vertex_buffer.render(4, 2, D3DPT_TRIANGLESTRIP);

                        g_d3d_device->EndScene();
                    }

                    present_display();

                    
            return TRUE;
                }

                BOOL shutdown()
                {
                    release_com(g_d3d_device);
                    release_com(g_d3d);

                    
            return TRUE;
                }
               
            private:
                VERTEX_BUFFER     m_vertex_buffer;
            };


            int PASCAL WinMain(HINSTANCE inst, HINSTANCE, LPSTR cmd_line, int cmd_show)
            {
                APP app;

                
            if(! build_window(inst, "MainClass", "MainWindow", WS_OVERLAPPEDWINDOW, 0, 0, 640, 480))
                    
            return -1;
                
                app.run();

                
            return 0;
            }

             

            posted on 2007-10-06 23:53 lovedday 閱讀(384) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            久久青青草原亚洲av无码| 久久久久亚洲AV无码观看| 国产精品久久久久AV福利动漫| 99久久国产热无码精品免费 | 高清免费久久午夜精品| 精品久久久久久中文字幕| 久久久久国产一级毛片高清版| 久久精品女人天堂AV麻| 亚洲国产另类久久久精品黑人 | 久久精品无码专区免费青青| 久久这里只精品国产99热| 久久精品中文无码资源站| 久久综合中文字幕| 少妇高潮惨叫久久久久久| 久久久久香蕉视频| 欧美日韩中文字幕久久伊人| 欧美精品乱码99久久蜜桃| 成人a毛片久久免费播放| 日韩人妻无码精品久久免费一 | 久久人妻少妇嫩草AV无码专区| 精品久久久久久国产牛牛app| 婷婷五月深深久久精品| 久久亚洲AV无码西西人体| 国产精品久久99| 久久久久人妻精品一区| 一本一道久久综合狠狠老| 婷婷久久综合九色综合绿巨人 | 久久精品无码一区二区日韩AV| 久久久久久午夜成人影院| 久久久久久综合网天天| 亚洲精品久久久www| 性做久久久久久久久| 久久露脸国产精品| 久久久中文字幕日本| 久久久久无码专区亚洲av| 欧美精品福利视频一区二区三区久久久精品 | 中文字幕精品久久久久人妻| 久久久久无码中| 久久受www免费人成_看片中文| 伊人久久精品影院| 综合网日日天干夜夜久久|