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

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

創(chuàng)建3D圖形引擎(4)【OO改良版】

 

本篇是創(chuàng)建3D圖形引擎(3)【OO改良版】的續(xù)篇,以創(chuàng)建游戲內(nèi)核【OO改良版】中編寫的代碼為基礎(chǔ)進(jìn)行開發(fā),細(xì)節(jié)說明請參閱創(chuàng)建3D圖形引擎(4)

 

下載源碼和工程

 

接口:

/*************************************************************************
PURPOSE:
    Interface for sky box.
*************************************************************************/


#ifndef _SKY_BOX_H
#define _SKY_BOX_H

#include "core_common.h"

enum SKY_BOX_SIDES  { TOP = 0, BOTTOM, LEFT, RIGHT, FRONT, BACK };

//=====================================================================================
// This calss encapsulate how to make sky box.
//=====================================================================================
typedef class SKY_BOX
{
private:
    typedef 
struct SKY_BOX_VERTEX
    {
        
float x, y, z;
        
float u, v;
    } *SKY_BOX_VERTEX_PTR;

    
#define SKY_BOX_FVF (D3DFVF_XYZ | D3DFVF_TEX1)

private:    
    TEXTURE         m_textures[6];      
// face texture (0 - 5)
    VERTEX_BUFFER   m_vertex_buffer;    // mesh vertex buffer
    WORLD_POSITION  m_pos;              // sky box position

public:
    SKY_BOX();
    ~SKY_BOX();

    BOOL create();
    
void free();

    
void set_default_state();
    BOOL load_texture(
short side, pcstr filename, D3DCOLOR transparent, D3DFORMAT format);

    
void rotate(float x_rot, float y_rot, float z_rot);
    
void rotate_rel(float x_rot, float y_rot, float z_rot);

    BOOL render(CAMERA_PTR camera, BOOL alpha_blend);
} *SKY_BOX_PTR;

#endif

實(shí)現(xiàn):
 
/*************************************************************************
PURPOSE:
    Implement for sky box.
*************************************************************************/


#include "core_common.h"
#include "core_graphics.h"
#include "sky_box.h"

//----------------------------------------------------------------------------------
// Constructor, initialize member data.
//----------------------------------------------------------------------------------
SKY_BOX::SKY_BOX()
{    
}

//----------------------------------------------------------------------------------
// Destructor, release allocated resource.
//----------------------------------------------------------------------------------
SKY_BOX::~SKY_BOX()
{
    free();
}

//----------------------------------------------------------------------------------
// Release allocated resource.
//----------------------------------------------------------------------------------
void SKY_BOX::free()
{    
    
for(short i = 0; i < 6; i++)
        m_textures[i].free();

    m_vertex_buffer.free();
}

//----------------------------------------------------------------------------------
// Set default state for sky box.
//----------------------------------------------------------------------------------
void SKY_BOX::set_default_state()
{
    m_pos.set_default_state();
}

//----------------------------------------------------------------------------------
// Create a sky box class object.
//----------------------------------------------------------------------------------
BOOL SKY_BOX::create()
{
    SKY_BOX_VERTEX verts[24] = {
        { -10.0f,  10.0f, -10.0f, 0.0f, 0.0f },  
// Top
        {  10.0f,  10.0f, -10.0f, 1.0f, 0.0f },
        { -10.0f,  10.0f,  10.0f, 0.0f, 1.0f },
        {  10.0f,  10.0f,  10.0f, 1.0f, 1.0f },

        { -10.0f, -10.0f,  10.0f, 0.0f, 0.0f },  
// Bottom
        {  10.0f, -10.0f,  10.0f, 1.0f, 0.0f },
        { -10.0f, -10.0f, -10.0f, 0.0f, 1.0f },
        {  10.0f, -10.0f, -10.0f, 1.0f, 1.0f },

        { -10.0f,  10.0f, -10.0f, 0.0f, 0.0f },  
// Left
        { -10.0f,  10.0f,  10.0f, 1.0f, 0.0f },
        { -10.0f, -10.0f, -10.0f, 0.0f, 1.0f },
        { -10.0f, -10.0f,  10.0f, 1.0f, 1.0f },

        {  10.0f,  10.0f,  10.0f, 0.0f, 0.0f },  
// Right
        {  10.0f,  10.0f, -10.0f, 1.0f, 0.0f },
        {  10.0f, -10.0f,  10.0f, 0.0f, 1.0f },
        {  10.0f, -10.0f, -10.0f, 1.0f, 1.0f },

        { -10.0f,  10.0f,  10.0f, 0.0f, 0.0f },  
// Front
        {  10.0f,  10.0f,  10.0f, 1.0f, 0.0f },
        { -10.0f, -10.0f,  10.0f, 0.0f, 1.0f },
        {  10.0f, -10.0f,  10.0f, 1.0f, 1.0f },
        
        {  10.0f,  10.0f, -10.0f, 0.0f, 0.0f },  
// Back
        { -10.0f,  10.0f, -10.0f, 1.0f, 0.0f },
        {  10.0f, -10.0f, -10.0f, 0.0f, 1.0f },
        { -10.0f, -10.0f, -10.0f, 1.0f, 1.0f },
    };

    free();     
// free a prior sky box

    // error checking
    if(g_d3d_device == NULL)
        
return FALSE;

    
// create the vertex buffer (and copy over sky box vertices)
    if(m_vertex_buffer.create(24, sizeof(SKY_BOX_VERTEX), SKY_BOX_FVF))
        m_vertex_buffer.fill_in(0, 24, (
void*)verts);

    
// rotate the sky box into default orientation
    rotate(0.0f, 0.0f, 0.0f);

    
return TRUE;
}

//----------------------------------------------------------------------------------
// Set a specific side's texture map, allow for transparent and storage format changes.
//----------------------------------------------------------------------------------
BOOL SKY_BOX::load_texture(short side, pcstr filename, D3DCOLOR transparent, D3DFORMAT format)
{
    
// error checking
    if(g_d3d_device == NULL || side < 0 || side > 5)
        
return FALSE;

    m_textures[side].free();    
// free prior texture

    
return m_textures[side].load(filename, transparent, format);
}

//----------------------------------------------------------------------------------
// Rotate box to an absolute rotation.
//----------------------------------------------------------------------------------
void SKY_BOX::rotate(float x_rot, float y_rot, float z_rot)
{
    m_pos.rotate(x_rot, y_rot, z_rot);
}

//----------------------------------------------------------------------------------
// Rotate box to an relative rotation.
//----------------------------------------------------------------------------------
void SKY_BOX::rotate_rel(float x_rot, float y_rot, float z_rot)
{
    m_pos.rotate_rel(x_rot, y_rot, z_rot);
}

//----------------------------------------------------------------------------------
// Render the sky box (using optional alpha-blending) and using current view 
// transformation from camera.
//----------------------------------------------------------------------------------
BOOL SKY_BOX::render(CAMERA_PTR camera, BOOL alpha_blend)
{
    
// error checking
    if(g_d3d_device == NULL || camera == NULL)
        
return FALSE;

    
// position sky box around viewer
    m_pos.move(camera->get_x_pos(), camera->get_y_pos(), camera->get_z_pos());
    g_d3d_device->SetTransform(D3DTS_WORLD, m_pos.get_world_matrix());    

    
// enable alpha testing and alpha blending

    enable_alpha_testing();

    
if(alpha_blend)
        enable_alpha_blending(D3DBLEND_SRCCOLOR, D3DBLEND_DESTCOLOR);

    
// draw each layer
    for(short i = 0; i < 6; i++)
    {
        
if(m_textures[i].is_loaded())
        {
            g_d3d_device->SetTexture(0, m_textures[i].get_d3d_texture());            
            m_vertex_buffer.render(i * 4, 2, D3DPT_TRIANGLESTRIP);
        }
    }

    
// disable alpha testing and alpha blending

   disable_alpha_testing();

    
if(alpha_blend)
        disable_alpha_blending();

    
return TRUE;
}

測試代碼:
/************************************************************************************
PURPOSE:
     node tree mesh test.
************************************************************************************/


#include "core_common.h"
#include "core_framework.h"
#include "core_graphics.h"
#include "core_input.h"
#include "core_sound.h"
#include "frustum.h"
#include "node_tree_mesh.h"
#include "sky_box.h"

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);
    
        
// enable lighting and setup light

        g_d3d_device->SetRenderState(D3DRS_LIGHTING, TRUE);
        set_ambient_light(24, 24, 24);
        g_d3d_device->LightEnable(0, TRUE);        
        
        m_light.set_default_state();
        m_light.set_attenuation_0(0.4f);
        m_light.set_range(1000.0f);

        m_camera.set_default_state();

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

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

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

        m_node_tree_mesh.create(&m_mesh, QUADTREE, 256.0f, 32);

        
// position view at origin
        m_x_pos = m_y_pos = m_z_pos = 0.0f;

        
// setup sky box
        m_sky_box.create();
        m_sky_box.set_default_state();

        
for(short i = 0; i < 6; i++)
            m_sky_box.load_texture(i, "..\\data\\stars.bmp", 0, D3DFMT_UNKNOWN);

        
// initialize the sound system to play with
        m_sound.init(g_hwnd, 22050, 1, 16, DSSCL_PRIORITY);
        m_sound_data.load_wav("..\\data\\cricket.wav");

        
for(short i = 0; i < 3; i++)
            m_sound_channel[i].create(&m_sound, 22050, 1, 16);

        
return TRUE;
    }

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

        
// play a random cricket sound
        for(short i = 0; i< 3; i++)
        {
            
if(!m_sound_channel[i].is_playing() && rand()%256 < 16)
                m_sound_channel[i].play(&m_sound_data, 10, 1);
        }

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

        
// read keyboard and mouse data        
        m_keyboard.read();
        m_mouse.read();

        
// process input and update everything, ESC quits program.

        
if(m_keyboard.get_key_state(KEY_ESC))
            
return FALSE;

        
float x_move, z_move;

        
// process movement
        x_move = z_move = 0.0f;

        
if(m_keyboard.get_key_state(KEY_UP) || m_keyboard.get_key_state(KEY_W))
        {
            x_move = (
float) sin(m_camera.get_y_rotation()) * time_elapsed;
            z_move = (
float) cos(m_camera.get_y_rotation()) * time_elapsed;
        }
        
        
if(m_keyboard.get_key_state(KEY_DOWN) || m_keyboard.get_key_state(KEY_S))
        {
            x_move = (
float) -sin(m_camera.get_y_rotation()) * time_elapsed;
            z_move = (
float) -cos(m_camera.get_y_rotation()) * time_elapsed;
        }

        
if(m_keyboard.get_key_state(KEY_LEFT) || m_keyboard.get_key_state(KEY_A))
        {
            x_move = (
float) sin(m_camera.get_y_rotation() - 1.57f) * time_elapsed;
            z_move = (
float) cos(m_camera.get_y_rotation() - 1.57f) * time_elapsed;
        }

        
if(m_keyboard.get_key_state(KEY_RIGHT) || m_keyboard.get_key_state(KEY_D))
        {
            x_move = (
float) sin(m_camera.get_y_rotation() + 1.57f) * time_elapsed;
            z_move = (
float) cos(m_camera.get_y_rotation() + 1.57f) * time_elapsed;
        }

        
// check for height changes (can step up to 64 units)
        float height = m_node_tree_mesh.closest_height_below_object(m_x_pos, m_y_pos + m_above_floor, m_z_pos);

        
if(m_y_pos > height)
        {
            
// dropping
            if((m_y_pos -= (float)time_elapsed) < height)
                m_y_pos = height;
            
else
                x_move = z_move = 0.0f;
        }
        
else
        {
            
// climbing
            m_y_pos = height;
        }

        
float dist;

        
// check for movement collision - can not walk past anything blocking path.
        if(m_node_tree_mesh.is_ray_intersect_mesh(m_x_pos, m_y_pos + m_above_floor, m_z_pos,
                                                 m_x_pos + x_move, m_y_pos + m_above_floor, m_z_pos + z_move,
                                                 &dist))
        {
            
// adjust coordinates to be exactly 2.5 units away from target

            
float diff = dist - 2.5f;

            D3DXVECTOR2 dir;
            D3DXVec2Normalize(&dir, &D3DXVECTOR2(x_move, z_move));

            dir *= diff;

            x_move = dir.x;
            z_move = dir.y;
        }

        
// update view coordinats
        m_x_pos += x_move;
        m_z_pos += z_move;

        
// position camera and rotate based on mouse position

        m_camera.move(m_x_pos, m_y_pos + 50.0f, m_z_pos);

        
// m_mouse.get_y_delta():
        //      get mouse's relative x movement coordinate.
        //
        // m_mouse.get_x_delta():
        //      get mouse's relative y movement coordinate.
        m_camera.rotate_rel((float) m_mouse.get_y_delta() / 200.0f, (float) m_mouse.get_x_delta() / 200.0f, 0.0f);

        
// position
        m_light.move(m_x_pos, m_y_pos + 60.0f, m_z_pos);
        g_d3d_device->SetLight(0, m_light.get_d3d_light());        

        FRUSTUM frustum;

        
// set camera and calculate frustum    
        g_d3d_device->SetTransform(D3DTS_VIEW, m_camera.get_view_matrix());        
        frustum.create(0.0f);
        
        
// render everything
        clear_display_zbuffer(1.0f);               

        
//clear_display(0, 1.0f);               

        // begin render now
        if(SUCCEEDED(g_d3d_device->BeginScene()))        
        {
            g_d3d_device->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
            g_d3d_device->SetRenderState(D3DRS_LIGHTING, FALSE);            
            m_sky_box.render(&m_camera, FALSE);

            g_d3d_device->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
            g_d3d_device->SetRenderState(D3DRS_LIGHTING, TRUE);            
            m_node_tree_mesh.render(&frustum, 0.0f);

            g_d3d_device->EndScene();            
        }

        present_display();

        
return TRUE;
    }

    BOOL shutdown()
    {
        
return TRUE;
    }

private:  
    CAMERA          m_camera;
    LIGHT           m_light;

    SOUND           m_sound;
    SOUND_DATA      m_sound_data;
    SOUND_CHANNEL   m_sound_channel[3];

    SKY_BOX         m_sky_box;

    INPUT           m_input;
    INPUT_DEVICE    m_keyboard;
    INPUT_DEVICE    m_mouse;    

    MESH            m_mesh;
    NODE_TREE_MESH  m_node_tree_mesh;

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

const float APP::m_above_floor = 64.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;

    
if(! build_window(inst, "node_tree_mesh_class", "node tree mesh test", 
                      WS_BORDER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU,
                      x_pos, y_pos, client_width, client_height))
    {
        
return -1;
    }

    APP app;
    app.run();

    
return 0;
}
 

posted on 2007-10-25 15:07 lovedday 閱讀(372) 評論(0)  編輯 收藏 引用


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


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(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电影| 亚洲欧洲精品一区二区三区不卡 | 欧美亚洲尤物久久| 亚洲一区精品电影| 国产精品午夜电影| 久久精品视频网| 亚洲高清免费在线| 日韩视频在线一区二区| 欧美特黄一级| 欧美在线精品免播放器视频| 欧美3dxxxxhd| 亚洲色图综合久久| 国产欧美精品| 麻豆精品91| 一本一本大道香蕉久在线精品| 久久aⅴ乱码一区二区三区| 国内精品免费在线观看| 欧美精品黄色| 欧美亚洲视频| 亚洲精品一区二区三区蜜桃久| 午夜精品美女自拍福到在线| 激情综合色丁香一区二区| 欧美高清视频在线播放| 亚洲综合色激情五月| 免费在线亚洲| 午夜精品影院| 亚洲黄色免费网站| 国产精品中文字幕欧美| 免费在线观看精品| 亚洲男人的天堂在线| 欧美成人亚洲成人日韩成人| 亚洲欧美日韩视频二区| 亚洲国产va精品久久久不卡综合| 国产精品久久久久久久7电影 | 亚洲每日在线| 国产一区久久| 国产精品久久9| 欧美阿v一级看视频| 欧美一区二区视频在线| 亚洲精品国产视频| 麻豆av一区二区三区久久| 亚洲自拍偷拍福利| 亚洲美女少妇无套啪啪呻吟| 国产一区二区三区久久 | 欧美日韩国产三区| 久久久久久日产精品| 亚洲女人小视频在线观看| 亚洲日本成人| 欧美黄色免费网站| 久久久青草婷婷精品综合日韩| 亚洲午夜精品久久久久久app| 亚洲大胆在线| 在线看无码的免费网站| 亚洲少妇最新在线视频| 韩日精品在线| 国产精品自在在线| 欧美精品久久一区二区| 老司机一区二区三区| 欧美在线一二三四区| 亚洲综合首页| 国产精品99久久久久久久久久久久 | 极品尤物久久久av免费看| 欧美视频在线视频| 欧美日韩高清在线观看| 欧美精品色一区二区三区| 久久综合激情| 欧美一区二区免费| 欧美一区二区视频网站| 销魂美女一区二区三区视频在线| 亚洲视频在线一区观看| 亚洲一区二区精品| 亚洲一区二区综合| 亚洲欧美日韩爽爽影院| 亚洲在线中文字幕| 亚洲免费在线观看视频| 午夜精品久久久久久久久久久久| 亚洲一区二区三区在线视频| 亚洲在线网站| 欧美在线三区| 久久久综合香蕉尹人综合网| 麻豆国产精品va在线观看不卡| 免费成人在线观看视频| 欧美激情女人20p| 欧美日韩国产一中文字不卡| 欧美视频中文一区二区三区在线观看| 国产精品第十页| 国产欧美精品久久| 国产一区视频观看| 在线不卡a资源高清| 亚洲国产精品999| 一本一道久久综合狠狠老精东影业 | 欧美中文字幕在线播放| 久久精品青青大伊人av| 免费黄网站欧美| 欧美日韩国产综合新一区| 欧美午夜精品伦理| 国产精品自拍小视频| 一色屋精品视频在线看| 亚洲人成久久| 亚洲欧美国产va在线影院| 久久久久九九九九| 亚洲国产精品第一区二区 | 一本色道久久综合一区| 欧美一区二区精品久久911| 免费欧美日韩| 国产精品福利网| 伊人婷婷久久| 亚洲一区二区在线视频| 久久久久久久激情视频| 亚洲精品乱码久久久久久久久| 亚洲一区欧美| 欧美国产日韩二区| 国产欧美在线观看| 亚洲美女诱惑| 久久精品中文字幕免费mv| 亚洲人成人一区二区在线观看| 亚洲图片在区色| 久久青草欧美一区二区三区| 亚洲日本电影在线| 久久国产精品99精品国产| 欧美日韩国产综合视频在线观看 | 亚洲免费福利视频| 久久精品99国产精品酒店日本| 欧美激情精品久久久久久大尺度| 在线亚洲欧美视频| 欧美成人激情视频| 国产一级一区二区| 亚洲女同在线| 亚洲黄色免费电影| 久久激情中文| 国产精品一二一区| 一本一本久久a久久精品综合麻豆| 久久色在线播放| 亚洲视频综合在线| 欧美精品一区二区在线播放| 国产一区视频网站| 午夜老司机精品| 日韩视频在线观看| 欧美freesex8一10精品| 亚洲在线观看免费| 欧美激情亚洲激情| 亚洲国产一区二区三区高清| 久久精品国产精品亚洲| 中国女人久久久| 欧美日韩精品福利| 亚洲精品乱码久久久久久蜜桃91| 久久一区二区三区四区五区| 亚洲淫性视频| 国产精品美女久久久久久免费| 一区二区三区精品视频| 亚洲激情午夜| 欧美精品日韩一本| 亚洲日本视频| 欧美激情亚洲一区| 麻豆久久婷婷| 亚洲电影免费观看高清完整版在线| 久久久久在线观看| 欧美一级网站| 国内一区二区三区在线视频| 久久精品天堂| 欧美专区福利在线| 好看的日韩av电影| 久久久久久网址| 久久精品欧美| 激情五月婷婷综合| 免费不卡亚洲欧美| 久久综合给合久久狠狠狠97色69| 一区二区三区在线观看欧美 | 亚洲在线播放| 国产精品综合久久久| 欧美一区午夜精品| 亚洲欧美精品中文字幕在线| 国产乱肥老妇国产一区二 | 国产日韩精品电影| 久久gogo国模啪啪人体图| 午夜在线一区二区| 国模精品一区二区三区| 久久一综合视频| 免费黄网站欧美| 一本一本a久久| 亚洲欧美成aⅴ人在线观看| 国产欧美一区二区精品性| 久久免费黄色| 免费在线观看成人av| 一区二区高清视频| 亚洲欧美日韩一区二区| 国内精品一区二区| 亚洲黄色av一区| 国产精品国色综合久久| 久久精品91| 免费中文日韩| 亚洲欧美在线一区| 久久美女性网| 一本久道久久综合狠狠爱| 亚洲免费人成在线视频观看| 黄色一区二区在线观看| 亚洲欧洲在线视频| 国产九区一区在线| 亚洲国产日韩欧美在线动漫| 国产精品国产三级国产专播品爱网|