• <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>

            天行健 君子當自強而不息

            創(chuàng)建游戲內(nèi)核(9)【C風格版】

             

            本篇是創(chuàng)建游戲內(nèi)核(8)【C風格版】的續(xù)篇,關(guān)于該內(nèi)核的細節(jié)說明請參考創(chuàng)建游戲內(nèi)核(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);

            實現(xiàn):

            //-------------------------------------------------------------------
            // 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 閱讀(729) 評論(0)  編輯 收藏 引用

            公告

            導航

            統(tǒng)計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關(guān)鏈接

            搜索

            最新評論

            国产精品久久久久国产A级| 久久精品综合一区二区三区| 色综合久久中文字幕综合网| 99久久国产亚洲综合精品| 久久婷婷五月综合色奶水99啪| 国产成人精品综合久久久| 久久精品成人国产午夜| 色诱久久av| 精品久久久久久综合日本| 亚洲午夜福利精品久久| 国内精品久久久久影院日本 | 国内精品久久久久久久影视麻豆| 伊人久久国产免费观看视频 | 欧美久久亚洲精品| 天天躁日日躁狠狠久久| 久久久久无码精品国产app| 久久久久亚洲精品天堂| 久久只有这精品99| 国产激情久久久久影院| 久久国产亚洲高清观看| 久久大香萑太香蕉av| 国产精品免费久久久久久久久 | 伊人久久大香线蕉精品不卡| 国产精品综合久久第一页| 无遮挡粉嫩小泬久久久久久久 | 久久影视综合亚洲| 国产精品一久久香蕉国产线看| 亚洲中文字幕久久精品无码APP| 久久国产视屏| 久久国产精品免费一区二区三区| 精品久久香蕉国产线看观看亚洲| 久久精品蜜芽亚洲国产AV| 国产精品久久久久久久久软件 | 久久久久波多野结衣高潮| 国产精品久久久久久久久软件| 中文国产成人精品久久亚洲精品AⅤ无码精品| AV狠狠色丁香婷婷综合久久| 国产精品国色综合久久| 亚洲国产另类久久久精品小说| 中文字幕无码精品亚洲资源网久久| 午夜精品久久久内射近拍高清|