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

天行健 君子當自強而不息

創建游戲內核(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 閱讀(738) 評論(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>
            亚洲性夜色噜噜噜7777| 一区二区三区高清不卡| 99国产精品国产精品久久| 国产日韩欧美精品一区| 国产精品视频网| 国产精品人人做人人爽人人添| 欧美日韩亚洲一区二区三区在线| 欧美经典一区二区三区| 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲一区二区欧美| 亚洲一区免费视频| 欧美一区网站| 久久这里有精品视频| 免费美女久久99| 亚洲理论在线观看| 亚洲免费在线播放| 老司机免费视频久久| 欧美久久久久久蜜桃| 国产精品久久久久影院亚瑟 | 日韩小视频在线观看专区| 中文在线不卡| 鲁大师成人一区二区三区| 欧美日韩一区二区三区四区五区| 国产欧美一区二区精品性色| 在线免费观看日本欧美| 亚洲另类一区二区| 久久精品国产精品亚洲精品| 亚洲区一区二| 正在播放亚洲| 欧美成人福利视频| 国产视频一区二区在线观看| 日韩视频一区二区在线观看 | 日韩一级不卡| 久久久www| 国产精品久久久久一区| 亚洲精品之草原avav久久| 久久激情久久| 亚洲一区二区三区高清不卡| 欧美激情bt| 在线观看一区二区视频| 久久国产福利| 亚洲一区二区成人| 欧美日韩情趣电影| 亚洲精品国产拍免费91在线| 久久精品一级爱片| 亚洲尤物在线视频观看| 欧美日韩国产欧| 亚洲精品黄色| 欧美插天视频在线播放| 欧美一区二区三区四区高清| 欧美午夜免费影院| 亚洲专区一二三| 亚洲精品久久7777| 欧美不卡三区| 亚洲激情视频在线| 美脚丝袜一区二区三区在线观看| 香蕉久久a毛片| 国产精品羞羞答答xxdd| 亚洲一区成人| 99视频在线观看一区三区| 欧美大秀在线观看| 在线欧美电影| 亚洲第一在线综合在线| 久久久久久国产精品mv| 校园春色国产精品| 国产精品久久久久免费a∨| 亚洲天堂av在线免费观看| 亚洲精品女av网站| 久久久久久久久久看片| 国产日韩精品在线播放| 欧美一区二区精品久久911| 一区二区免费在线观看| 欧美性开放视频| 午夜在线成人av| 99精品视频一区| 欧美特黄视频| 亚洲影视综合| 亚洲校园激情| 国产欧美一区二区精品性| 欧美一区二区三区免费视| 亚洲欧美成人网| 国产精品视频xxxx| 欧美在线视频观看| 久久久国产午夜精品| 国内精品视频一区| 欧美成人免费视频| 一区二区免费在线视频| 一区二区三区欧美激情| 国产精品亚洲激情| 久久婷婷国产综合精品青草| 久久久久久网| 日韩手机在线导航| 夜夜嗨av一区二区三区四区| 国产欧美一区二区三区在线看蜜臀| 欧美亚洲免费| 久久精品中文字幕一区| 亚洲精选久久| 亚洲一区www| 在线观看一区视频| 一本色道久久综合狠狠躁篇怎么玩| 国产精品香蕉在线观看| 亚洲国产裸拍裸体视频在线观看乱了 | 欧美亚洲自偷自偷| 久久精品网址| 亚洲美女视频网| 亚洲一区二区三区四区五区午夜| 一区二区亚洲欧洲国产日韩| 亚洲第一区在线| 国产麻豆视频精品| 亚洲精品色图| 一区二区三区无毛| 一区二区高清在线| 亚洲美女淫视频| 久久躁狠狠躁夜夜爽| 欧美午夜精品久久久| 欧美va亚洲va香蕉在线| 国产精品高潮呻吟久久av无限| 蜜臀av一级做a爰片久久| 国产精品久久久久久一区二区三区 | 免费av成人在线| 欧美一区日本一区韩国一区| 欧美.www| 你懂的视频一区二区| 国产精品资源| 亚洲视频综合在线| 亚洲免费观看高清完整版在线观看熊| 久久精品成人| 久久精品国语| 国产伦精品一区二区三区高清版| 亚洲日本在线视频观看| 伊人色综合久久天天| 亚洲女性裸体视频| 亚洲午夜一区二区三区| 欧美精品一区二区三区一线天视频| 久久在线免费| 国产一区二区三区在线观看网站 | 欧美午夜在线视频| 亚洲毛片av| 日韩一区二区精品葵司在线| 免费观看日韩av| 亚洲国产精品毛片| 亚洲经典在线看| 老牛影视一区二区三区| 久久在线视频在线| 黄网动漫久久久| 久久久亚洲欧洲日产国码αv | 亚洲黄色三级| 亚洲精品久久久蜜桃 | 欧美成人精品一区二区三区| 欧美高清不卡在线| 亚洲高清中文字幕| 免费在线观看日韩欧美| 欧美成人网在线| 亚洲黄色在线| 免费观看亚洲视频大全| 亚洲国产视频直播| 激情综合自拍| 美女精品网站| 亚洲日本成人在线观看| 一区二区电影免费观看| 欧美亚日韩国产aⅴ精品中极品| av不卡免费看| 久久精品久久99精品久久| 亚洲第一伊人| 欧美手机在线视频| 久久国产精品亚洲77777| 欧美电影专区| 亚洲视频在线看| 国产亚洲免费的视频看| 美女精品自拍一二三四| 亚洲免费观看高清在线观看 | 欧美专区在线| 亚洲国产精品久久久久秋霞不卡| 欧美精品在线免费播放| 西西人体一区二区| 亚洲国产精品久久久久秋霞蜜臀| 国产精品久久久一本精品| 亚洲淫片在线视频| 免费成人性网站| 亚洲最新合集| 国产日韩欧美黄色| 欧美精品一区二区视频| 欧美一区二区三区免费大片| 亚洲国产高清自拍| 性欧美videos另类喷潮| 影音先锋中文字幕一区二区| 亚洲国产欧美久久| 久久精品在这里| 亚洲视频免费看| 激情文学一区| 国产精品乱码一区二区三区| 美国三级日本三级久久99| 日韩视频亚洲视频| 狠狠色综合网| 欧美日一区二区在线观看| 久久久综合香蕉尹人综合网| 一区二区不卡在线视频 午夜欧美不卡'| 久久精品国产精品亚洲综合| 亚洲综合国产精品| 亚洲伦理在线免费看|