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

天行健 君子當自強而不息

創建游戲內核(9)【C風格版】

 

本篇是創建游戲內核(8)【C風格版】的續篇,關于該內核的細節說明請參考創建游戲內核(9)

 

接口:

BOOL load_texture_from_file(LPDIRECT3DTEXTURE9* texture, pcstr filename, DWORD transparent, D3DFORMAT format);
BOOL create_texture(LPDIRECT3DTEXTURE9* texture, DWORD width, DWORD height, D3DFORMAT format);
BOOL clone_texture(LPDIRECT3DTEXTURE9* dest_texture, 
const LPDIRECT3DTEXTURE9 src_texture);

long get_texture_width(const LPDIRECT3DTEXTURE9 texture);
long get_texture_height(const LPDIRECT3DTEXTURE9 texture);
long get_texture_format(const LPDIRECT3DTEXTURE9 texture);

BOOL draw_texture(ID3DXSprite* sprite, 
                  
const LPDIRECT3DTEXTURE9 texture,                   
                  
const RECT*       texture_src_rect,                 
                  
long dest_x,      long dest_y,
                  
float x_scale,    float y_scale,
                  D3DCOLOR color);

實現:

//-------------------------------------------------------------------
// Create texture object from specified file, you can specify transparent
// value and pixel format of the texture.
//-------------------------------------------------------------------
BOOL load_texture_from_file(LPDIRECT3DTEXTURE9* texture, pcstr filename, DWORD transparent, D3DFORMAT format)
{
    
// check condition first
    if(filename == NULL)
        
return FALSE;

    
// create a texture from file
    if(FAILED(D3DXCreateTextureFromFileEx(g_d3d_device, filename, D3DX_DEFAULT, D3DX_DEFAULT,
        D3DX_DEFAULT, 0, format, D3DPOOL_MANAGED, D3DX_FILTER_TRIANGLE, D3DX_FILTER_TRIANGLE,
        transparent, NULL, NULL, texture)))
    {
        
return FALSE;
    }

    
return TRUE;
}

//-------------------------------------------------------------------
// Creates a texture resource.
//-------------------------------------------------------------------
BOOL create_texture(LPDIRECT3DTEXTURE9* texture, DWORD width, DWORD height, D3DFORMAT format)
{
    
if(FAILED(g_d3d_device->CreateTexture(width, height, 0, 0, format, D3DPOOL_MANAGED, texture, NULL)))
        
return FALSE;

    
return TRUE;
}

//-------------------------------------------------------------------
// Clone d3d texture object from an existing IDirect3DTexture9 object 
// instance.
//-------------------------------------------------------------------
BOOL clone_texture(LPDIRECT3DTEXTURE9* dest_texture, const LPDIRECT3DTEXTURE9 src_texture)
{            
    
if(src_texture == NULL)
        
return FALSE;

    
// copy texture over, from source to dest.

    D3DSURFACE_DESC surface_desc;

    
if(FAILED(src_texture->GetLevelDesc(0, &surface_desc)))
        
return FALSE;    
    
    g_d3d_device->CreateTexture(surface_desc.Width, surface_desc.Height, 0, 0, 
                                surface_desc.Format, D3DPOOL_MANAGED, dest_texture, NULL);

    D3DLOCKED_RECT src_rect, dest_rect;

    
// locks a rectangle on a texture resource
    src_texture->LockRect(0, &src_rect, NULL, D3DLOCK_READONLY);
    (*dest_texture)->LockRect(0, &dest_rect, NULL, 0);

    memcpy(dest_rect.pBits, src_rect.pBits, src_rect.Pitch * surface_desc.Height);

    
// unlocks a rectangle on a texture resource
    src_texture->UnlockRect(0);
    (*dest_texture)->UnlockRect(0);

    
return TRUE;
}

//-------------------------------------------------------------------
// Get width of the texture.
//-------------------------------------------------------------------
long get_texture_width(const LPDIRECT3DTEXTURE9 texture)
{    
    
if(texture == NULL)
        
return 0;

    D3DSURFACE_DESC surface_desc;

    
if(FAILED(texture->GetLevelDesc(0, &surface_desc)))
        
return 0;

    
return surface_desc.Width;
}

//-------------------------------------------------------------------
// Get height of the texture.
//-------------------------------------------------------------------
long get_texture_height(const LPDIRECT3DTEXTURE9 texture)
{    
    
if(texture == NULL)
        
return 0;

    D3DSURFACE_DESC surface_desc;

    
if(FAILED(texture->GetLevelDesc(0, &surface_desc)))
        
return 0;

    
return surface_desc.Height;
}

//-------------------------------------------------------------------
// Get texture storage format.
//-------------------------------------------------------------------
long get_texture_format(const LPDIRECT3DTEXTURE9 texture)
{    
    
if(texture == NULL)
        
return D3DFMT_UNKNOWN;

    D3DSURFACE_DESC surface_desc;

    
if(FAILED(texture->GetLevelDesc(0, &surface_desc)))
        
return D3DFMT_UNKNOWN;

    
return surface_desc.Format;
}

//-------------------------------------------------------------------
// Draw a 2D portion of texture to device.
//-------------------------------------------------------------------
BOOL draw_texture(ID3DXSprite* sprite, 
                  
const LPDIRECT3DTEXTURE9 texture,                   
                  
const RECT*       texture_src_rect,                  
                  
long dest_x,      long dest_y,
                  
float x_scale,    float y_scale,
                  D3DCOLOR color)
{
    
// check condition
    if(texture == NULL || sprite == NULL)
        
return FALSE;    

    
// set the portion of the source texture

    D3DXMATRIX transform_matrix(x_scale,    0,          0,  0,
                                0,          y_scale,    0,  0,
                                0,          0,          1,  0,
                                0,          0,          0,  1);

    
// sets the sprite transforma
    sprite->SetTransform(&transform_matrix);

    D3DXVECTOR3 dest_pos = D3DXVECTOR3((
float)dest_x, (float)dest_y, 0);

    
// adds a sprite to the list of batched sprites
    if(FAILED(sprite->Draw(texture, texture_src_rect, NULL, &dest_pos, color)))
        
return FALSE;

    
return TRUE;
}

測試代碼:
/***********************************************************************************
PURPOSE:
    Test D3D texture function.
***********************************************************************************/


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

typedef 
struct DATA
{    
    ID3DXSprite*        sprite;
    IDirect3DTexture9*  texture;

    RECT                texture_rect;    
} *DATA_PTR;

//--------------------------------------------------------------------------------
// Initialize data for game.
//--------------------------------------------------------------------------------
BOOL game_init(void* data)
{
    DATA_PTR in_data = (DATA_PTR) data;

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

    
// load the texture map
    if(! load_texture_from_file(&in_data->texture, "tiger1.jpg", 0, D3DFMT_UNKNOWN))
        
return FALSE;

    g_d3d_device->SetTexture(0, in_data->texture);

    RECT& rect = in_data->texture_rect;

    rect.left   = 0;
    rect.top    = 0;
    rect.right  = get_window_width(g_hwnd);
    rect.bottom = get_window_height(g_hwnd);
   
    
// create sprite
    if(FAILED(D3DXCreateSprite(g_d3d_device, &in_data->sprite)))
        
return FALSE;

    
return TRUE;
}

//--------------------------------------------------------------------------------
// Render every game frame.
//--------------------------------------------------------------------------------
BOOL game_frame(void* data)
{
    DATA_PTR in_data = (DATA_PTR) data;

    clear_display_buffer(D3DCOLOR_RGBA(0, 0, 0, 255));

    IDirect3DTexture9* texture = in_data->texture;

    
if(SUCCEEDED(g_d3d_device->BeginScene()))
    {
        ID3DXSprite* sprite = in_data->sprite;

        
if(SUCCEEDED(sprite->Begin(0)))
        {
            draw_texture(sprite, texture, &in_data->texture_rect, 0, 0, 1, 1, 0xFFFFFFFF);

            sprite->End();
        }        

        g_d3d_device->EndScene();
    }

    present_display();

    
return TRUE;
}

//--------------------------------------------------------------------------------
// Release all game resources.
//--------------------------------------------------------------------------------
BOOL game_shutdown(void* data)
{
    DATA_PTR in_data = (DATA_PTR) data;

    release_com(in_data->sprite);
    release_com(in_data->texture);
    
    destroy_display();

    
return TRUE;
}

//--------------------------------------------------------------------------------
// Main function, routine entry.
//--------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE inst, HINSTANCE pre_inst, LPSTR cmd_line, int cmd_show)
{    
    DWORD client_width  = 800;
    DWORD client_height = 520;
    DWORD x_pos = (get_screen_width()  - client_width) / 2;
    DWORD y_pos = (get_screen_height() - client_height) / 4;

    
if(! build_window(inst, "texture class", "texture test", WS_OVERLAPPEDWINDOW,
                      x_pos, y_pos, client_width, client_height))
    {
        
return -1;
    }

    DATA data;

    memset(&data, 0, 
sizeof(data));
    
    run_game(game_init, game_frame, game_shutdown, &data);
    
    
return 0;
}

截圖:


posted on 2007-10-25 23:29 lovedday 閱讀(739) 評論(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>
            久久久久国产精品麻豆ai换脸| 欧美剧在线观看| 在线观看一区二区视频| 久久人人精品| 欧美精品成人| 欧美在线首页| 欧美精品日日鲁夜夜添| 欧美亚洲一区二区在线| 免费在线欧美黄色| 久久国产综合精品| 欧美日韩国产区| 久久久久久网站| 欧美涩涩网站| 欧美黄在线观看| 国产一区在线看| 夜夜爽av福利精品导航| 永久555www成人免费| 在线视频精品一区| 亚洲精品久久久久久久久久久久| 亚洲欧美日韩国产中文| 一区二区三区国产在线| 免费欧美日韩| 久久综合电影| 欧美日韩亚洲一区二区三区| 美日韩精品视频| 国产精品系列在线播放| 亚洲人成在线影院| 亚洲第一精品福利| 久久狠狠婷婷| 久久九九精品| 国产精品欧美日韩| 一区二区欧美日韩| 一区二区精品| 欧美噜噜久久久xxx| 亚洲国产精品va在看黑人| 激情av一区二区| 欧美一区二区三区视频免费| 午夜在线精品偷拍| 欧美日韩一区国产| 亚洲精品乱码久久久久久蜜桃91 | 亚洲精品国产精品国自产在线| 极品少妇一区二区三区精品视频| 亚洲欧美日韩综合| 欧美在线视频不卡| 国产婷婷色综合av蜜臀av | 国产日产亚洲精品| 亚洲一区二区av电影| 在线综合亚洲| 国产精品久久网| 亚洲综合国产| 久久久久国产成人精品亚洲午夜| 国产老女人精品毛片久久| 午夜精品久久久久久99热软件| 欧美一区深夜视频| 国产一区二区中文字幕免费看| 午夜视频久久久| 久久夜色撩人精品| 亚洲人成久久| 欧美日韩在线精品一区二区三区| 一区二区不卡在线视频 午夜欧美不卡'| 在线亚洲一区| 国产精品毛片在线| 久久精品网址| 亚洲国产国产亚洲一二三| 日韩午夜在线观看视频| 欧美日本国产视频| 欧美福利专区| 9色精品在线| 国产精品久久久久久久久久三级 | 久久久久久久久久久久久9999| 久久中文字幕导航| 9久草视频在线视频精品| 国产精品久久久久久久久久ktv| 亚洲一级二级在线| 久久久噜噜噜久久久| 亚洲激情第一区| 国产精品福利在线| 久久久久久久久久久久久久一区 | 国产伦精品一区二区三区高清版| 一区二区精品在线观看| 亚洲在线1234| 1024精品一区二区三区| 欧美日韩国产综合新一区| 午夜精品久久久久久久白皮肤| 免费在线观看成人av| 亚洲一区在线直播| 在线观看av不卡| 国产精品国产精品| 老司机久久99久久精品播放免费| 99热免费精品在线观看| 免费成人高清在线视频| 一二三四社区欧美黄| 国产欧美一区在线| 欧美成年人在线观看| 欧美一级免费视频| 一本一本久久| 欧美激情一区二区三区不卡| 销魂美女一区二区三区视频在线| 亚洲精品一区二区三区福利| 欧美一区三区三区高中清蜜桃| 亚洲激情在线观看视频免费| 久久免费视频观看| 欧美一级电影久久| 一本色道久久综合| 1000部国产精品成人观看| 国产精品蜜臀在线观看| 欧美日韩伦理在线免费| 久久综合色影院| 欧美一区二区三区啪啪| 一区二区三区偷拍| 免费一区二区三区| 久久久亚洲成人| 欧美一区激情视频在线观看| 亚洲影视在线播放| 日韩视频二区| 亚洲精品久久久久久下一站 | 久久电影一区| 午夜久久资源| 亚洲女人天堂成人av在线| 99国产精品自拍| 99亚洲视频| 亚洲美女黄色片| 亚洲精品视频一区二区三区| 亚洲国产高潮在线观看| 一区国产精品| 国产精品都在这里| 欧美日韩精品在线| 欧美视频国产精品| 欧美午夜宅男影院在线观看| 欧美体内she精视频| 欧美视频一区在线| 欧美午夜精品理论片a级按摩| 欧美乱妇高清无乱码| 欧美剧在线免费观看网站| 欧美日韩国产麻豆| 欧美午夜一区二区福利视频| 欧美性大战久久久久| 欧美午夜理伦三级在线观看| 午夜国产不卡在线观看视频| 亚洲欧美国产高清| 欧美中文在线视频| 久久婷婷影院| 欧美精品三级日韩久久| 国产精品高潮呻吟久久| 国产日韩欧美黄色| 精品成人在线视频| 亚洲精品九九| 午夜精品一区二区三区在线播放| 欧美亚洲专区| 免费成人高清| 亚洲精选中文字幕| 午夜精品久久久久久| 久久久久久久久久久一区| 欧美成人精品影院| 欧美午夜精品久久久久久久| 国产午夜久久久久| 亚洲人成网站777色婷婷| 亚洲性感美女99在线| 久久久久久久一区| 亚洲黄色尤物视频| 午夜精品福利在线观看| 久久一区国产| 国产在线成人| 性娇小13――14欧美| 亚洲人成毛片在线播放女女| 久久久精品动漫| 国产欧美日韩91| 亚洲午夜视频在线观看| 欧美激情黄色片| 久久精品在线视频| 国产婷婷色一区二区三区四区| 一区二区国产日产| 欧美激情中文字幕在线| 久久久久久久久久久一区| 国产精品一二| 亚洲免费在线观看| 亚洲精品一区二区三区四区高清 | 欧美专区福利在线| 一区二区三区福利| 欧美日韩国产大片| 亚洲精品在线三区| 亚洲电影第三页| 美女诱惑一区| 91久久精品国产91性色| 免费高清在线一区| 久久婷婷亚洲| 亚洲电影在线免费观看| 久久午夜羞羞影院免费观看| 欧美一区二区成人| 国产亚洲综合精品| 久久只有精品| 久久日韩粉嫩一区二区三区| 又紧又大又爽精品一区二区| 久久视频在线看| 久久久久久999| 亚洲国产欧美一区| 91久久国产综合久久蜜月精品 | 亚洲在线观看免费视频| 妖精视频成人观看www| 欧美午夜欧美|