• <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游戲編程相關鏈接

            搜索

            最新評論

            精品综合久久久久久88小说| 国产情侣久久久久aⅴ免费| 久久久av波多野一区二区| 人妻无码久久一区二区三区免费| 亚洲色大成网站WWW久久九九| 国产精品乱码久久久久久软件| 人妻少妇久久中文字幕| 国产精品一久久香蕉国产线看观看| 99久久精品国产麻豆| 久久高清一级毛片| 亚洲欧美久久久久9999| AV色综合久久天堂AV色综合在| 青青热久久综合网伊人| 中文成人无码精品久久久不卡| 精品久久8x国产免费观看| 久久精品综合一区二区三区| 久久精品九九亚洲精品| 久久久久九九精品影院| 久久国产欧美日韩精品 | 亚洲精品无码久久久久| 久久黄视频| 9久久9久久精品| 91麻豆国产精品91久久久| 热re99久久精品国产99热| 97久久久久人妻精品专区| 婷婷久久综合九色综合九七| 久久国产免费直播| 激情伊人五月天久久综合| 国产精品久久久久a影院| 久久精品国产色蜜蜜麻豆| 久久综合久久综合久久| 国产成人综合久久综合| 久久香蕉国产线看观看精品yw| 国产精品中文久久久久久久| 九九久久精品国产| 久久99精品久久久久久野外| 欧美久久综合性欧美| 91精品国产91热久久久久福利 | 国产精品99久久99久久久| 亚洲成色www久久网站夜月| 久久福利资源国产精品999|