• <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)而不息

            創(chuàng)建游戲內(nèi)核(6)【接口與實(shí)現(xiàn)分離版】

             

            本篇是創(chuàng)建游戲內(nèi)核(5)【接口與實(shí)現(xiàn)分離版】的續(xù)篇,關(guān)于該內(nèi)核的細(xì)節(jié)說明請(qǐng)參考創(chuàng)建游戲內(nèi)核(6),這個(gè)版本主要是按照功能劃分模塊的思想,并嚴(yán)格按照接口與實(shí)現(xiàn)相分離的原則來寫的,沒有用面向?qū)ο蟮乃枷雭韺懀瑳]有繼承沒有多態(tài)。大家可以對(duì)比兩個(gè)版本,比較優(yōu)劣。

            接口:

            /*************************************************************************
            PURPOSE:
                Interface for D3D camera.
            *************************************************************************/


            #ifndef _CORE_CAMERA_H_
            #define _CORE_CAMERA_H_

            #include "core_common.h"

            typedef 
            void* CAMERA;

            CAMERA camera_create();

            void camera_move(CAMERA camera, float x_pos, float y_pos, float z_pos);
            void camera_rotate(CAMERA camera, float x_rot, float y_rot, float z_rot);

            void camera_point(CAMERA camera, 
                              
            float x_eye, float y_eye, float z_eye, 
                              
            float x_at, float y_at, float z_at);

            void camera_set_start_track(CAMERA camera);
            void camera_set_end_track(CAMERA camera);

            void camera_track(CAMERA camera, float time_ratio, float time_length);
            void camera_update(CAMERA camera);

            D3DXMATRIX* camera_get_matrix(CAMERA camera);

            float camera_get_x_pos(CAMERA camera);
            float camera_get_y_pos(CAMERA camera);
            float camera_get_z_pos(CAMERA camera);

            float camera_get_x_rot(CAMERA camera);
            float camera_get_y_rot(CAMERA camera);
            float camera_get_z_rot(CAMERA camera);

            #endif
             

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


            #include "core_common.h"
            #include "core_camera.h"

            typedef 
            struct _CAMERA
            {
                
            float x_pos, y_pos, z_pos;      // camera current position
                float x_rot, y_rot, z_rot;      // camera current rotation

                
            float start_x_pos, start_y_pos, start_z_pos;    // start tracking position
                float start_x_rot, start_y_rot, start_z_rot;    // start tracking rotation

                
            float end_x_pos, end_y_pos, end_z_pos;          // end tracking position
                float end_x_rot, end_y_rot, end_z_rot;          // end tracking rotation

                D3DXMATRIX mat_world;           
            // world transform matrix
                D3DXMATRIX mat_translation;     // translation matrix
                D3DXMATRIX mat_rotation;        // rotation matrix
            } *_CAMERA_PTR;

            //----------------------------------------------------------------------------------------
            // Create camera.
            //----------------------------------------------------------------------------------------
            CAMERA camera_create()
            {
                _CAMERA_PTR _camera = (_CAMERA_PTR) malloc(
            sizeof(_CAMERA));

                memset(_camera, 0, 
            sizeof(_CAMERA));

                
            return (CAMERA) _camera;
            }

            //----------------------------------------------------------------------------------------
            // move camera to new position.
            //----------------------------------------------------------------------------------------
            void camera_move(CAMERA camera, float x_pos, float y_pos, float z_pos)
            {
                _CAMERA_PTR _camera = (_CAMERA_PTR) camera;

                _camera->x_pos = x_pos;
                _camera->y_pos = y_pos;
                _camera->z_pos = z_pos;

                D3DXMatrixTranslation(&_camera->mat_translation, -x_pos, -y_pos, -z_pos);
            }

            //-------------------------------------------------------------------------
            // rotate camera.
            //-------------------------------------------------------------------------
            void camera_rotate(CAMERA camera, float x_rot, float y_rot, float z_rot)
            {
                D3DXMATRIX _mat_x_rot, _mat_y_rot, _mat_z_rot;

                _CAMERA_PTR _camera = (_CAMERA_PTR) camera;

                _camera->x_rot = x_rot;
                _camera->y_rot = y_rot;
                _camera->z_rot = z_rot;

                _camera->mat_rotation = _mat_z_rot;

                D3DXMatrixMultiply(&_camera->mat_rotation, &_camera->mat_rotation, &_mat_y_rot);
                D3DXMatrixMultiply(&_camera->mat_rotation, &_camera->mat_rotation, &_mat_x_rot);
            }

            //-------------------------------------------------------------------------
            // move camera to new position and look at new target position.
            //-------------------------------------------------------------------------
            void camera_point(CAMERA camera, 
                              
            float x_eye, float y_eye, float z_eye, 
                              
            float x_at, float y_at, float z_at)
            {
                
            // calculate angles between points

                
            float _x_diff = x_at - x_eye;
                
            float _y_diff = y_at - y_eye;
                
            float _z_diff = z_at - z_eye;

                
            float _x_rot = (float) atan2(-_y_diff, sqrt(_x_diff * _x_diff + _z_diff * _z_diff));
                
            float _y_rot = (float) atan2(_x_diff, _z_diff);

                
            // move camera to new position and look at new target
                camera_move(camera, x_eye, y_eye, z_eye);
                camera_rotate(camera, _x_rot, _y_rot, 0.0);
            }

            //-------------------------------------------------------------------------
            // set camera's start tracking position and rotation.
            //-------------------------------------------------------------------------
            void camera_set_start_track(CAMERA camera)
            {
                _CAMERA_PTR _camera = (_CAMERA_PTR) camera;

                _camera->start_x_pos = _camera->x_pos;
                _camera->start_y_pos = _camera->y_pos;
                _camera->start_z_pos = _camera->z_pos;

                _camera->start_x_rot = _camera->x_rot;
                _camera->start_y_rot = _camera->y_rot;
                _camera->start_z_rot = _camera->z_rot;
            }

            //-------------------------------------------------------------------------
            // set camera's end tracking position and rotation.
            //-------------------------------------------------------------------------
            void camera_set_end_track(CAMERA camera)
            {
                _CAMERA_PTR _camera = (_CAMERA_PTR) camera;

                _camera->end_x_pos = _camera->x_pos;
                _camera->end_y_pos = _camera->y_pos;
                _camera->end_z_pos = _camera->z_pos;

                _camera->end_x_rot = _camera->x_rot;
                _camera->end_y_rot = _camera->y_rot;
                _camera->end_z_rot = _camera->z_rot;
            }

            //-------------------------------------------------------------------------
            // move camera to new position and ratation by giving time, 
            // 0 <= time_ratio <= 1.
            //-------------------------------------------------------------------------
            void camera_track(CAMERA camera, float time_ratio, float time_length)
            {
                _CAMERA_PTR _camera = (_CAMERA_PTR) camera;

                
            float _time_offset = time_length * time_ratio;

                
            float _x = (_camera->end_x_pos - _camera->start_x_pos) / time_length * _time_offset;
                
            float _y = (_camera->end_y_pos - _camera->start_y_pos) / time_length * _time_offset;
                
            float _z = (_camera->end_z_pos - _camera->start_z_pos) / time_length * _time_offset;

                camera_move(camera, _camera->start_x_pos + _x, _camera->start_y_pos + _y, _camera->start_z_pos + _z);

                _x = (_camera->end_x_rot - _camera->start_x_rot) / time_length * _time_offset;
                _y = (_camera->end_y_rot - _camera->start_y_rot) / time_length * _time_offset;
                _z = (_camera->end_z_rot - _camera->start_z_rot) / time_length * _time_offset;

                camera_rotate(camera, _camera->start_x_rot + _x, _camera->start_y_rot + _y, _camera->start_z_rot + _z);
            }

            //-------------------------------------------------------------------------
            // update new camera world transform matrix.
            //-------------------------------------------------------------------------
            void camera_update(CAMERA camera)
            {
                _CAMERA_PTR _camera = (_CAMERA_PTR) camera;

                D3DXMatrixMultiply(&_camera->mat_world, &_camera->mat_translation, &_camera->mat_rotation);
            }

            //-------------------------------------------------------------------------
            // Get camera world transform matrix.
            //-------------------------------------------------------------------------
            D3DXMATRIX* camera_get_matrix(CAMERA camera)
            {
                camera_update(camera);

                
            return & ((_CAMERA_PTR) camera)->mat_world;
            }

            //-------------------------------------------------------------------------
            // Get camera current position (x coordinate).
            //-------------------------------------------------------------------------
            float camera_get_x_pos(CAMERA camera)
            {
                
            return ((_CAMERA_PTR) camera)->x_pos;
            }

            //-------------------------------------------------------------------------
            // Get camera current position (y coordinate).
            //-------------------------------------------------------------------------
            float camera_get_y_pos(CAMERA camera)
            {
                
            return ((_CAMERA_PTR) camera)->y_pos;
            }

            //-------------------------------------------------------------------------
            // Get camera current position (z coordinate).
            //-------------------------------------------------------------------------
            float camera_get_z_pos(CAMERA camera)
            {
                
            return ((_CAMERA_PTR) camera)->z_pos;
            }

            //-------------------------------------------------------------------------
            // Get camera current rotation (x coordinate).
            //-------------------------------------------------------------------------
            float camera_get_x_rot(CAMERA camera)
            {
                
            return ((_CAMERA_PTR) camera)->x_rot;
            }

            //-------------------------------------------------------------------------
            // Get camera current rotation (y coordinate).
            //-------------------------------------------------------------------------
            float camera_get_y_rot(CAMERA camera)
            {
                
            return ((_CAMERA_PTR) camera)->y_rot;
            }

            //-------------------------------------------------------------------------
            // Get camera current rotation (z coordinate).
            //-------------------------------------------------------------------------
            float camera_get_z_rot(CAMERA camera)
            {
                
            return ((_CAMERA_PTR) camera)->z_rot;
            }

             

            posted on 2007-10-02 23:52 lovedday 閱讀(188) 評(píng)論(0)  編輯 收藏 引用


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


            公告

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類(178)

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

            搜索

            最新評(píng)論

            久久综合亚洲色HEZYO社区| 久久久女人与动物群交毛片| 亚洲一区中文字幕久久| 91久久精品电影| 久久噜噜久久久精品66| 伊人久久久AV老熟妇色| 国产成人久久精品区一区二区| 成人国内精品久久久久影院VR| 久久久久亚洲精品男人的天堂| 精品综合久久久久久97| 久久久青草久久久青草| 久久久久亚洲AV片无码下载蜜桃| 69国产成人综合久久精品| 久久99精品久久久久久野外| 97精品伊人久久久大香线蕉| 久久久精品波多野结衣| 无码人妻久久一区二区三区免费丨 | 国产精品熟女福利久久AV| 伊人久久综合无码成人网| 精品一久久香蕉国产线看播放| 伊人久久精品无码av一区| 无码8090精品久久一区| 一级做a爰片久久毛片16| 伊人久久大香线蕉亚洲五月天| 美女久久久久久| 久久久久国产成人精品亚洲午夜| 久久91精品国产91久久户| 亚洲精品无码专区久久久| 久久久久久午夜精品| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 国产叼嘿久久精品久久| 久久99国产精品二区不卡| 国内精品久久久久影院一蜜桃| 国产亚洲精久久久久久无码77777| 亚洲日韩欧美一区久久久久我 | 亚洲国产精品久久久天堂 | 久久93精品国产91久久综合| 国产一区二区精品久久| 91久久婷婷国产综合精品青草| 久久国产精品99精品国产| 99999久久久久久亚洲|