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

            天行健 君子當(dāng)自強(qiáng)而不息

            2D和3D圖形引擎的混合(1)

             

            在圖形技術(shù)的應(yīng)用中,既沒有什么限制,也沒有什么必須遵守的規(guī)則。也就是說,沒有限制使用二維圖形或三維圖形,完全可以將它們兩者無損地混合在一起。

             

            在三維中繪制二維貼片

            需要一個代表游戲?qū)哟蔚娜S網(wǎng)格模型,如下圖所示:

            一個角色在三維世界里四處移動(通常是沿著一個軸線移動),當(dāng)角色移動時,攝像機(jī)也跟著移動。攝像機(jī)需要停留在一個比角色較高的平移位置上,這樣就會產(chǎn)生出全三維的層次效果。不需要別的額外操作,只要加載一個代表層次的網(wǎng)格模型,創(chuàng)建一組代表了物體(例如玩家角色)的二維貼片,并將每件東西正確地排列繪制到每幀中即可。

            下載源碼和工程

            代碼:

            /************************************************************************************
            PURPOSE:
                 2D in 3D test.
            ************************************************************************************/


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

            #define TILE_SIZE 64

            enum DIR { LEFT = 0, RIGHT };

            class APP : public FRAMEWORK
            {
            public:
                BOOL init()
                {
                    
            if(! create_display(g_hwnd, get_client_width(g_hwnd), get_client_height(g_hwnd), 16, TRUE, TRUE))
                        
            return FALSE;
                    
                    set_perspective(D3DX_PI / 4, 1.3333f, 1.0f, 10000.0f);        

                    ShowCursor(TRUE);                          

                    
            // initialize input and input device
                    m_input.create(g_hwnd, get_window_inst());
                    m_keyboard.create_keyboard(&m_input);        

                    
            // load the mesh and create a nodetree mesh from it

                    
            if(! m_level_mesh.load("..\\Data\\Level.x", "..\\Data\\"))
                        
            return FALSE;

                    m_level_object.create(&m_level_mesh);

                    
            // load the 2D texture
                    if(! m_2d_object.load("..\\Data\\Tiles.bmp", D3DCOLOR_RGBA(0, 0, 0, 255), D3DFMT_A1R5G5B5))
                        
            return FALSE;

                    
            // set player position
                    m_x_pos = -900.0f;
                    m_y_pos = m_z_pos = 0.0f;        

                    
            // enable lighting and setup light

                    g_d3d_device->SetRenderState(D3DRS_LIGHTING, TRUE);
                    set_ambient_light(0, 0, 0);
                    g_d3d_device->LightEnable(0, TRUE);        
                    
                    
            // create a directional light to illuminate the scene

                    m_light.set_default_state();
                    m_light.set_type(D3DLIGHT_DIRECTIONAL);
                    m_light.set_diffuse(192, 192, 192);
                    m_light.set_ambient(0, 0, 0);
                    m_light.point(0.0f, 60.0f, -100.0f, 0.0f, 0.0f, 0.0f);

                    m_camera.set_default_state();

                    m_font.create("Arial", 16, TRUE, FALSE);
                    
                    
            return TRUE;
                }

                BOOL frame()
                {
                    
            static DWORD time_now = timeGetTime();       

                    
            // calculate elapsed time (plus speed boost)
                    ulong time_elapsed = timeGetTime() - time_now;
                    time_now = timeGetTime();

                    
            // read keyboard data        
                    m_keyboard.read();

                    
            // process input and update everything, ESC quits program.
                    if(m_keyboard.get_key_state(KEY_ESC))
                        
            return FALSE;
                    
                    
            // process movement
                    float x_move = 0.0f;

                    
            if(m_keyboard.get_key_state(KEY_LEFT))
                        x_move =  -(
            float)(time_elapsed * 0.5f);

                    
            if(m_keyboard.get_key_state(KEY_RIGHT))
                        x_move =  (
            float)(time_elapsed * 0.5f);

                    uchar red, green, blue;

                    m_light.get_diffuse(&red, &green, &blue);

                    
            if(m_keyboard.get_key_state(KEY_ADD))
                    {
                        
            if(red < 255)
                            ++red;

                        
            if(green < 255)
                            ++green;

                        
            if(blue < 255)
                            ++blue;

                        m_light.set_diffuse(red, green, blue);
                    }

                    
            if(m_keyboard.get_key_state(KEY_SUBTRACT))
                    {
                        
            if(red > 0)
                            --red;

                        
            if(green > 0)
                            --green;

                        
            if(blue > 0)
                            --blue;

                        m_light.set_diffuse(red, green, blue);
                    }

                    
            char diffuse_msg[256];
                    sprintf(diffuse_msg, "diffuse color: red = %d, green = %d, blue = %d\n", red, green, blue);

                    
            // check for intersections (allowing climbing as well)

                    
            float dist, diff;               

                    diff = (x_move < 0.0f ? -32.0f : 32.0f);

                    D3DXMESH_PTR d3d_mesh = m_level_mesh.get_root_mesh_info()->m_d3d_mesh;

                    
            if(is_ray_intersect_mesh(d3d_mesh,
                                             m_x_pos + diff,          m_y_pos + m_above_floor, m_z_pos,
                                             m_x_pos + diff + x_move, m_y_pos + m_above_floor, m_z_pos,
                                             &dist))
                    {
                        x_move = 0.0f;
                    }

                    
            // fix height of player
                    m_y_pos = closest_height_below_object(d3d_mesh, m_x_pos + x_move, m_y_pos + m_above_floor, m_z_pos);

                    
            static float frame = 0.0f;
                    
            static enum DIR dir = RIGHT;

                    
            // update animation frame
                    if(! float_equal(x_move, 0.0f))
                    {
                        
            // change direction of travel (for aniamtion)
                        if(x_move < 0.0f)   // move left
                        {
                            frame -= (time_elapsed * 0.015f);

                            
            if(frame < 0.0f)
                                frame = 7.0f;

                            dir = LEFT;
                        }
                        
            else    // move right
                        {
                            frame += (time_elapsed * 0.015f);

                            
            if(frame >= 8.0f)
                                frame = 0.0f;

                            dir = RIGHT;
                        }
                    }
                    
            else
                    {
                        frame = 3.0f;
                    }

                    
            // move player
                    m_x_pos += x_move;

                    
            // position camera by character position
                    m_camera.point(m_x_pos, m_y_pos + 200.0f, m_z_pos - 500.0f,
                                   m_x_pos, m_y_pos, m_z_pos);
                    
                    
            // set camera
                    g_d3d_device->SetTransform(D3DTS_VIEW, m_camera.get_view_matrix());       
                    
                    
            // render everything
                    clear_display(0, 1.0f);                       

                    
            // begin render now
                    if(SUCCEEDED(g_d3d_device->BeginScene()))        
                    {
                        
            // render the level mesh
                        g_d3d_device->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
                        g_d3d_device->SetLight(0, m_light.get_d3d_light());
                        m_level_object.render();

                        
            // render 2D object

                        g_d3d_device->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
                        enable_alpha_testing();
                        
                        g_d3d_sprite->Begin(0);

                        
            ulong tile_index, tile_x, tile_y;

                        tile_index = (dir == LEFT ? 1 : 0) * 8 + (
            long)frame;

                        tile_x = tile_index % 4 * TILE_SIZE;
                        tile_y = tile_index / 4 * TILE_SIZE;
                        
                        m_2d_object.draw(140, 60, tile_x, tile_y, TILE_SIZE, TILE_SIZE, 2.0f, 2.0f, 0xFFFFFFFF);

                        g_d3d_sprite->End();

                        disable_alpha_testing();

                        m_font.draw(diffuse_msg, 0, 0, 0, 0, D3DCOLOR_RGBA(255, 255, 255, 255), DT_LEFT);

                        g_d3d_device->EndScene();            
                    }

                    present_display();

                    
            return TRUE;
                }

                BOOL shutdown()
                {
                    destroy_display();

                    
            return TRUE;
                }

            private:  
                CAMERA          m_camera;
                LIGHT           m_light;
                FONT            m_font;
                   
                INPUT           m_input;
                INPUT_DEVICE    m_keyboard; 

                TEXTURE         m_2d_object;

                MESH            m_level_mesh;    
                OBJECT          m_level_object;

                
            float           m_x_pos, m_y_pos, m_z_pos;
                
                
            static const float m_above_floor;
            };

            const float APP::m_above_floor = 84.0f;

            int WINAPI WinMain(HINSTANCE inst, HINSTANCE, LPSTR cmd_line, int cmd_show)
            {
                DWORD client_width  = 640;
                DWORD client_height = 480;
                DWORD x_pos = (get_screen_width()  - client_width) / 2;
                DWORD y_pos = (get_screen_height() - client_height) / 4;

                DWORD window_style = WS_BORDER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU;

                
            if(! build_window(inst, "2d_in_3d_class", "2D in 3D Test", window_style,
                                  x_pos, y_pos, client_width, client_height))
                {
                    
            return -1;
                }

                APP app;
                app.run();

                
            return 0;
            }
             

            使用+或-改變光源的散射光屬性,左右箭頭鍵控制怪物行走。


            截圖:


            posted on 2007-10-27 15:38 lovedday 閱讀(658) 評論(1)  編輯 收藏 引用

            評論

            # re: 2D和3D圖形引擎的混合(1) 2007-10-28 23:29 neoragex2002

            這個技法在很多射擊游戲中已經(jīng)用到了。  回復(fù)  更多評論   


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            公告

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            隨筆分類(178)

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

            搜索

            最新評論

            久久久久亚洲精品天堂久久久久久| 久久久久人妻一区精品| 久久婷婷国产综合精品| 国产亚洲色婷婷久久99精品| 99久久精品国产一区二区| 久久综合一区二区无码| 亚洲中文久久精品无码| 亚洲狠狠久久综合一区77777| 亚洲国产成人久久一区WWW| 久久久久久久久久久精品尤物| 国产精品一区二区久久| 无码精品久久一区二区三区| 婷婷伊人久久大香线蕉AV| 国产精品久久久久久久午夜片| 中文字幕久久精品| 热99re久久国超精品首页| 久久天天躁夜夜躁狠狠躁2022| 久久国产精品成人免费| 一本久久a久久精品vr综合| 国产AⅤ精品一区二区三区久久| 国产成人久久精品一区二区三区| 国产精品欧美亚洲韩国日本久久 | 伊人久久精品无码二区麻豆| 99久久国产综合精品网成人影院 | 久久精品中文字幕一区| 精品视频久久久久| 91麻豆精品国产91久久久久久| 亚洲综合伊人久久综合| 久久精品国产清自在天天线 | 91久久精品电影| 午夜不卡888久久| 久久被窝电影亚洲爽爽爽| 久久亚洲AV成人出白浆无码国产| 久久久久久久精品妇女99| 久久婷婷国产剧情内射白浆| 久久精品综合网| 怡红院日本一道日本久久 | 久久久久久久精品妇女99| 香蕉久久AⅤ一区二区三区| 久久伊人色| 久久精品无码一区二区WWW|