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

天行健 君子當自強而不息

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

 

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

 

在三維中繪制二維貼片

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

一個角色在三維世界里四處移動(通常是沿著一個軸線移動),當角色移動時,攝像機也跟著移動。攝像機需要停留在一個比角色較高的平移位置上,這樣就會產(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 閱讀(666) 評論(1)  編輯 收藏 引用

評論

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

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


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


公告

導航

統(tǒng)計

常用鏈接

隨筆分類(178)

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

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            日韩特黄影片| 在线播放亚洲| 亚洲国产精品久久久久| 欧美午夜视频网站| 亚洲电影免费观看高清完整版在线 | 久久精品视频在线观看| 欧美成人资源| 蜜桃伊人久久| 国产日韩av一区二区| 一区二区三区免费看| 9色porny自拍视频一区二区| 久久免费黄色| 麻豆精品网站| 在线播放精品| 久久免费视频一区| 久久亚洲综合| 激情国产一区二区| 欧美中文字幕在线观看| 欧美一区午夜视频在线观看| 欧美午夜精品理论片a级大开眼界| 亚洲国产综合视频在线观看| 最新亚洲视频| 欧美gay视频激情| 欧美xx69| 亚洲三级免费| 欧美好吊妞视频| 亚洲人午夜精品| 在线视频亚洲欧美| 欧美视频一区| 中日韩在线视频| 午夜亚洲视频| 国产亚洲欧美日韩日本| 亚洲欧美另类在线观看| 久久精品女人| 玉米视频成人免费看| 免费在线观看精品| 亚洲精品国产无天堂网2021| 99视频国产精品免费观看| 欧美精品18| 一二三区精品福利视频| 亚洲欧美激情一区| 国产喷白浆一区二区三区| 欧美影院一区| 亚洲二区免费| 亚洲一区中文字幕在线观看| 国产伦理一区| 美女网站久久| 一二三四社区欧美黄| 久久精品国产成人| 亚洲国产成人一区| 欧美日本二区| 午夜精品久久久久久久99黑人| 久久久久久9| 亚洲最新在线视频| 国产九九精品| 欧美高清在线| 亚洲欧美在线免费| 亚洲第一黄色网| 性伦欧美刺激片在线观看| 黄色av一区| 国产精品qvod| 久久久久九九九九| 一区二区三区视频观看| 久久久精品久久久久| 亚洲人成欧美中文字幕| 国产美女精品视频| 欧美精品一区二区在线播放| 亚洲欧美日韩区| 亚洲国产成人精品女人久久久| 香蕉久久国产| 在线视频你懂得一区二区三区| 国产一区成人| 国产精品videossex久久发布| 久久久久久成人| 亚洲午夜一区二区三区| 欧美黄色成人网| 欧美在线免费一级片| 99re66热这里只有精品4| 国产亚洲一级高清| 国产精品高潮视频| 欧美刺激午夜性久久久久久久| 新狼窝色av性久久久久久| 日韩亚洲国产欧美| 欧美激情按摩| 久久一区二区三区四区五区| 亚洲欧美中文另类| 一本久久青青| 日韩视频精品在线| 亚洲国产另类精品专区| 国产日韩精品一区| 国产精品欧美一区二区三区奶水 | 国产午夜精品理论片a级大结局| 欧美美女日韩| 欧美成年人视频网站欧美| 久久久久一区二区三区| 欧美一级在线播放| 午夜视频一区在线观看| 亚洲天堂网在线观看| 99国产精品自拍| 亚洲日韩成人| 亚洲精品视频在线| 亚洲精品午夜| 日韩亚洲欧美成人一区| 亚洲日本中文字幕区| 亚洲日本欧美天堂| 91久久亚洲| 亚洲美女在线看| 亚洲免费观看在线视频| 亚洲久久成人| 国产精品99久久99久久久二8| 日韩午夜免费视频| 一本色道88久久加勒比精品 | 久久一区二区三区超碰国产精品| 欧美中文字幕不卡| 久久精品导航| 欧美mv日韩mv国产网站| 欧美激情在线| 欧美视频精品一区| 国产欧美视频一区二区| 国产日韩专区| 亚洲国产精品黑人久久久| 亚洲娇小video精品| 99成人精品| 亚洲综合好骚| 久久影视三级福利片| 欧美成人蜜桃| 亚洲免费观看高清完整版在线观看熊| 中日韩高清电影网| 欧美一区二粉嫩精品国产一线天| 久久久www成人免费精品| 免费欧美网站| 欧美特黄视频| 极品少妇一区二区三区精品视频| 亚洲国产老妈| 午夜国产欧美理论在线播放| 久久综合伊人77777蜜臀| 亚洲高清在线精品| 亚洲午夜在线观看| 久久在线观看视频| 欧美日韩一区三区| 国精品一区二区三区| 亚洲精品中文字幕在线观看| 午夜精品美女久久久久av福利| 久久日韩粉嫩一区二区三区| 亚洲人成高清| 性8sex亚洲区入口| 欧美巨乳波霸| 红杏aⅴ成人免费视频| 国产精品99久久久久久有的能看| 久久精品国产久精国产爱| 亚洲成人在线视频播放| 亚洲女优在线| 免费人成精品欧美精品| 国产欧美欧洲在线观看| 亚洲伦理在线观看| 久久精品一区二区三区四区 | 欧美黄色一区二区| 亚洲婷婷在线| 欧美成ee人免费视频| 国产欧美日韩在线观看| 一区二区国产在线观看| 欧美电影免费观看大全| 亚洲欧美日韩精品| 欧美精品电影在线| 一区二区三区亚洲| 亚洲欧美中文另类| 99视频精品| 欧美成人精品高清在线播放| 国产视频亚洲精品| 午夜精品成人在线| 亚洲精品一区二区网址| 久久婷婷亚洲| 国产自产高清不卡| 久久国产精品色婷婷| 99天天综合性| 欧美日韩视频专区在线播放| 亚洲国产精品成人综合色在线婷婷 | 中文亚洲免费| 欧美日本一道本在线视频| 在线看片第一页欧美| 久久久久久久久久久久久久一区| 亚洲自拍高清| 国产精品外国| 亚洲欧美视频在线观看视频| 99国产精品| 欧美日韩中文字幕日韩欧美| 亚洲精品视频啊美女在线直播| 欧美mv日韩mv亚洲| 久久综合给合久久狠狠狠97色69| 好吊成人免视频| 久久天堂av综合合色| 久久se精品一区精品二区| 国产一区二区三区直播精品电影| 午夜亚洲影视| 欧美在线国产| 国内成人精品2018免费看| 久久久之久亚州精品露出| 久久精品91久久久久久再现| 黑丝一区二区| 欧美福利在线|