青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當自強而不息

創建游戲內核(11)【接口與實現分離版】

 

本篇是創建游戲內核(10)【接口與實現分離版】的續篇,關于該內核的細節說明請參考創建游戲內核(11),這個版本主要是按照功能劃分模塊的思想,并嚴格按照接口與實現相分離的原則來寫的,沒有用面向對象的思想來寫,沒有繼承沒有多態。大家可以對比兩個版本,比較優劣。


接口:

BOOL create_vertex_buffer(LPDIRECT3DVERTEXBUFFER9* vertex_buffer, 
                          
ulong num_vertices, ulong vertex_size, DWORD fvf);

BOOL copy_vertex_buffer(LPDIRECT3DVERTEXBUFFER9 vertex_buffer, 
                        
ulong first_vertex, ulong num_vertices,
                        
void* vertex_list);

BOOL render_vertex_buffer(LPDIRECT3DVERTEXBUFFER9 vertex_buffer, 
                          
ulong first_vertex, ulong num_primitives, DWORD primitive_type);

ulong get_vertex_size(LPDIRECT3DVERTEXBUFFER9 vertex_buffer);
DWORD get_vertex_fvf(LPDIRECT3DVERTEXBUFFER9 vertex_buffer);

實現:
//---------------------------------------------------------------------------
// create vertex buffer.
//---------------------------------------------------------------------------
BOOL create_vertex_buffer(LPDIRECT3DVERTEXBUFFER9* vertex_buffer, 
                          
ulong num_vertices, ulong vertex_size, DWORD fvf)
{
    
// check condition
    if(g_d3d_device == NULL)
        
return FALSE;

    
if(FAILED(g_d3d_device->CreateVertexBuffer(num_vertices * vertex_size, 0, fvf, D3DPOOL_MANAGED, 
        vertex_buffer, NULL)))
    {
        
return FALSE;
    }

    
return TRUE;
}

//---------------------------------------------------------------------------
// copy vertex data from VertexList to vertex buffer.
//---------------------------------------------------------------------------
BOOL copy_vertex_buffer(LPDIRECT3DVERTEXBUFFER9 vertex_buffer, 
                        
ulong first_vertex, ulong num_vertices,
                        
void* vertex_list)
{
    
// check condition first
    if(g_d3d_device == NULL)
        
return FALSE;

    
ulong _vertex_size = get_vertex_size(vertex_buffer);
    
ulong vertex_total_size = num_vertices * _vertex_size;

    
char* _ptr;

    
// locks a range of vertex data and obtains a pointer to the vertex buffer memory
    if(FAILED(vertex_buffer->Lock(first_vertex * _vertex_size, vertex_total_size, (void**) &_ptr, 0)))
        
return FALSE;

    
// copy vertices to vertex buffer
    memcpy(_ptr, vertex_list, vertex_total_size);

    
// unlock vertex buffer
    if(FAILED(vertex_buffer->Unlock()))
        
return FALSE;

    
return TRUE;
}

//---------------------------------------------------------------------------
// render vertex buffer into display.
//---------------------------------------------------------------------------
BOOL render_vertex_buffer(LPDIRECT3DVERTEXBUFFER9 vertex_buffer, 
                          
ulong first_vertex, ulong num_primitives, DWORD primitive_type)
{
    
if(g_d3d_device == NULL || vertex_buffer == NULL)
        
return FALSE;

    
ulong _vertex_size = get_vertex_size(vertex_buffer);

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

    DWORD _fvf = get_vertex_fvf(vertex_buffer);

    
// sets the current vertex stream declaration
    g_d3d_device->SetFVF(_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) primitive_type, first_vertex, num_primitives);

    
return TRUE;
}

//---------------------------------------------------------------------------
// Return the size of a vertex for a flexible vertex format (FVF)
//---------------------------------------------------------------------------
ulong get_vertex_size(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;
}

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


#include <windows.h>
#include "core_framework.h"
#include "core_graphics.h"
#include "core_tool.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)

IDirect3DVertexBuffer9* g_vertex_buffer;
IDirect3DTexture9*      g_texture;

//--------------------------------------------------------------------------------
// Initialize data for game.
//--------------------------------------------------------------------------------
BOOL game_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_window_width(g_hwnd), get_window_height(g_hwnd), 16, TRUE, FALSE))
        
return FALSE;    

    create_vertex_buffer(&g_vertex_buffer, 
sizeof(_verts), sizeof(VERTEX), VERTEX_FVF);
    copy_vertex_buffer(g_vertex_buffer, 0, 8, _verts);

    
return TRUE;
}

//--------------------------------------------------------------------------------
// Render every game frame.
//--------------------------------------------------------------------------------
BOOL game_frame()
{
    clear_display_buffer(D3DCOLOR_RGBA(0, 0, 0, 255));

    
if(SUCCEEDED(g_d3d_device->BeginScene()))
    {       
        enalbe_alpha_blending(FALSE, 0, 0);
        render_vertex_buffer(g_vertex_buffer, 0, 2, D3DPT_TRIANGLESTRIP);        

        enalbe_alpha_blending(TRUE, D3DBLEND_SRCALPHA, D3DBLEND_INVSRCALPHA);
        render_vertex_buffer(g_vertex_buffer, 4, 2, D3DPT_TRIANGLESTRIP);

        g_d3d_device->EndScene();
    }

    present_display();

    
return TRUE;
}

//--------------------------------------------------------------------------------
// Release all game resources.
//--------------------------------------------------------------------------------
BOOL game_shutdown()
{
    release_com(g_vertex_buffer);
    release_com(g_d3d_device);
    release_com(g_d3d);

    
return TRUE;
}

//--------------------------------------------------------------------------------
// Main function, routine entry.
//--------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE inst, HINSTANCE pre_inst, LPSTR cmd_line, int cmd_show)
{    
    
if(! build_window(inst, "MainClass", "MainWindow", WS_OVERLAPPEDWINDOW, 0, 0, 640, 480))
        
return FALSE;

    run_game(game_init, game_frame, game_shutdown);
    
    
return 0;
}

點擊下載源碼和工程

程序截圖:


posted on 2007-10-04 02:16 lovedday 閱讀(229) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            美腿丝袜亚洲色图| 国产伦一区二区三区色一情| 亚洲电影在线看| 你懂的国产精品| 久久亚洲影院| 日韩视频在线免费| 亚洲看片一区| 国产精品香蕉在线观看| 久久久www成人免费毛片麻豆| 欧美亚洲自偷自偷| 亚洲电影中文字幕| 亚洲日本电影| 国产精品久久久久久久久久ktv| 亚洲中午字幕| 久久成人国产| 亚洲精品美女在线观看播放| 亚洲人成绝费网站色www| 欧美日韩无遮挡| 欧美影院成人| 久久综合九色综合欧美狠狠| 99成人精品| 性8sex亚洲区入口| 亚洲黄色成人久久久| 一本久道久久久| 国产真实久久| 99精品视频免费全部在线| 国产精品有限公司| 亚洲第一级黄色片| 国产精品香蕉在线观看| 欧美成人免费va影院高清| 欧美三级黄美女| 久久伊人亚洲| 国产精品美女久久| 亚洲国产精品成人精品| 国产农村妇女精品一区二区| 你懂的一区二区| 国产精品外国| 亚洲三级毛片| 伊人蜜桃色噜噜激情综合| 在线视频中文亚洲| 亚洲精品老司机| 性亚洲最疯狂xxxx高清| 亚洲视频欧美在线| 久久性色av| 欧美一区二区日韩一区二区| 欧美精品www在线观看| 久久噜噜噜精品国产亚洲综合| 欧美日韩卡一卡二| 欧美国产综合一区二区| 国产亚洲一二三区| 亚洲一区免费视频| 亚洲午夜精品一区二区三区他趣| 久久在线免费| 久久婷婷久久一区二区三区| 国产精品欧美日韩一区二区| 亚洲精品在线三区| 亚洲日韩第九十九页| 久久久999| 噜噜噜91成人网| 国产精品高潮呻吟久久| 亚洲免费成人av电影| 亚洲精选国产| 欧美久久视频| 亚洲国产欧美一区| 亚洲美女黄网| 欧美日本不卡高清| 日韩视频免费观看| 亚洲视频狠狠| 欧美午夜精品久久久久免费视 | 亚洲国产精品精华液2区45| 亚洲欧美久久久久一区二区三区| 亚洲影院在线观看| 国产精品免费视频xxxx| 亚洲欧美日韩国产一区| 午夜欧美大尺度福利影院在线看| 欧美四级剧情无删版影片| 99国产精品99久久久久久| 亚洲视频在线播放| 国产精品女人毛片| 午夜精品久久久久| 久久亚洲精品网站| 亚洲精品国产精品久久清纯直播| 久久永久免费| 最新国产乱人伦偷精品免费网站 | 国产精品久99| 亚洲永久免费观看| 久久久久久精| 亚洲人成亚洲人成在线观看图片| 欧美精品一区二区三区在线看午夜| 亚洲国产成人久久综合| 在线一区二区视频| 国产精品入口麻豆原神| 欧美主播一区二区三区| 欧美国产亚洲视频| 亚洲欧美视频在线观看视频| 国产三区二区一区久久| 欧美成人性生活| 亚洲一区二区久久| 欧美成人精品1314www| 亚洲视频免费观看| 国产一区二区三区在线观看视频 | 国产日韩亚洲欧美综合| 久久久久国产精品人| 亚洲精品欧美专区| 欧美一区二区三区四区在线| 亚洲高清不卡av| 国产精品你懂得| 老司机成人在线视频| 亚洲一级在线观看| 免费观看一区| 亚洲一级二级| 在线电影院国产精品| 国产精品久久中文| 欧美国产日本在线| 欧美一级视频精品观看| 亚洲精品欧洲| 蜜桃av综合| 性欧美精品高清| 一区二区三区产品免费精品久久75 | 亚洲精品美女久久久久| 久久久免费观看视频| 亚洲影院色无极综合| 亚洲国产精品久久| 国产综合在线看| 国产精品二区在线| 欧美黄在线观看| 久久久噜噜噜久久人人看| 亚洲欧美视频一区| 一区二区三区国产在线观看| 亚洲黄一区二区三区| 免费观看在线综合色| 欧美伊人久久久久久午夜久久久久 | 国产精品自拍小视频| 欧美视频精品在线观看| 欧美日产一区二区三区在线观看| 免费成人av资源网| 久久久水蜜桃av免费网站| 欧美在线视频免费观看| 欧美一区日韩一区| 亚洲欧美日韩国产| 亚洲欧美日韩国产精品| 亚洲欧美日韩在线观看a三区| 亚洲色图制服丝袜| 亚洲免费一在线| 午夜精品福利电影| 午夜在线一区二区| 亚洲欧美影院| 欧美一区二区性| 久久av免费一区| 久热精品视频在线观看| 老司机精品视频一区二区三区| 久久男人资源视频| 久久婷婷一区| 亚洲自拍电影| 亚洲桃花岛网站| 亚洲国产精品一区二区久| 亚洲激情专区| 亚洲国产精品久久精品怡红院| 欧美成人免费小视频| 亚洲国产一区二区视频| 欧美va亚洲va国产综合| 免费成人高清| 麻豆精品在线视频| 亚洲激情女人| 亚洲激情社区| 亚洲精品中文字幕女同| 亚洲午夜久久久久久久久电影院| 99国产精品私拍| 在线视频欧美精品| 午夜综合激情| 欧美在线一二三| 欧美影片第一页| 亚洲欧美日本日韩| 免费久久99精品国产自| 免费成人在线观看视频| 农夫在线精品视频免费观看| 欧美日韩中文字幕精品| 欧美午夜精品久久久久久浪潮| 国产精品乱人伦一区二区| 国产精品久久久久久av下载红粉 | 最新成人av在线| 亚洲一区二区四区| 午夜欧美大片免费观看| 久久精品九九| 欧美日一区二区三区在线观看国产免 | 亚洲美女一区| 亚洲欧美日韩在线综合| 欧美在线观看一区| 亚洲国产欧美在线人成| 亚洲先锋成人| 久久精品视频免费播放| 午夜综合激情| 欧美日韩免费观看一区| 国产精品一香蕉国产线看观看 | 久久国产精品99久久久久久老狼| 久久久久久久精| 欧美日韩在线一二三| 亚洲日本免费电影| 欧美一区二区免费观在线| 久热国产精品|