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

隨筆 - 132  文章 - 51  trackbacks - 0
<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(7)

隨筆分類

隨筆檔案

文章分類

文章檔案

cocos2d-x

OGRE

OPenGL

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

1.UI文件保存的設(shè)計(jì)缺陷
   我們生成.UI文件來保存我們生成的控件數(shù)據(jù),下面是UI結(jié)構(gòu)設(shè)計(jì)圖



這樣的設(shè)計(jì)有缺陷:
      以前UI控件最大數(shù)量定CONTROLS_COUNT_MAX= 64,因?yàn)閙_ControlsType為固定數(shù)組,一旦控件數(shù)量超出64,我們就需要將以前的.UI文件轉(zhuǎn)換為現(xiàn)在的UI文件進(jìn)行版本兼容,而我們又不能具體確定好我們的控件上限是多少,每次版本兼容進(jìn)行的轉(zhuǎn)換相當(dāng)麻煩...
 改進(jìn):設(shè)為容器,根據(jù)控件數(shù)量,動(dòng)態(tài)讀取保存到.UI文件中

struct S_UIData
{
    
struct S_UIHead
    
{
        S_UIHead()
        
{
            memset( m_szVer, 
0sizeof(m_szVer) );
            m_nControlsType.resize( CONTROLS_COUNT_MAX );
            memset( 
&m_nControlsType[0], 0sizeof(m_nControlsType) );
            strcpy( m_szVer, UI_VER);
            m_nControlsCount 
= 0;
            m_dwCreatedDate 
= 0;
        }

        
~S_UIHead()
        
{
            m_nControlsType.clear();
        }


        
char        m_szVer[10];
        DWORD        m_dwCreatedDate;
        S_FrameData    m_stFrameData;
        
int            m_nControlsCount;
        
//int            m_nControlsType[CONTROLS_COUNT_MAX];
        vector<int>    m_nControlsType;
    }
;

    S_UIData();
    
~S_UIData();
    
void Release();
    DWORD LoadOldFile( 
const char* pszFileName );
    DWORD LoadFile( 
const char* pszFileName );
    DWORD SaveFile( 
const char* pszFileName );
    
static S_BaseData* NewData( int nType );

    S_UIHead    m_stHead;
    
//S_BaseData    *m_pstControlData[CONTROLS_COUNT_MAX];
    vector< S_BaseData* > m_pstControlData;
}
;


這個(gè)樣子,以后我們即使控件不夠用了,只需要更改一下上限CONTROLS_COUNT_MAX就OK,但是.UI文件我們卻不需要做版本轉(zhuǎn)換,因?yàn)?UI中的數(shù)據(jù)都是根據(jù)控件數(shù)量來讀取保存的 eg.10個(gè)控件,讀取10個(gè)類型和控件數(shù)據(jù)。

DWORD S_UIData::LoadFile( const char* pszFileName )
{
    guard(S_UIData::LoadFile);
    assert( pszFileName );
    assert( pszFileName[
0!= 0 );

    FILE 
*fp = fopen(pszFileName, "rb" );
    
if ( fp )
    
{
        
forint n=0; n<CONTROLS_COUNT_MAX; n++ )
        
{
            
if ( m_pstControlData[n] )
            
{
                delete m_pstControlData[n];
                m_pstControlData[n] 
= NULL;
            }

        }


        fread( 
&m_stHead.m_szVer, sizeof(m_stHead.m_szVer), 1, fp );
        fread( 
&m_stHead.m_dwCreatedDate, sizeof( DWORD ) , 1, fp );
        fread( 
&m_stHead.m_stFrameData, sizeof( S_FrameData ) , 1, fp );
        fread( 
&m_stHead.m_nControlsCount, sizeofint ) , 1, fp );
        fread( 
&m_stHead.m_nControlsType[0],sizeof(int)*m_stHead.m_nControlsCount,1,fp);
        
//fread( &m_stHead, sizeof(m_stHead), 1, fp );

        
if ( strcmp( m_stHead.m_szVer, UI_VER ) != 0 )
        
{
            fclose(fp);
            MessageBox( NULL, 
"讀取的*.UI文件版本不一樣!""失敗", MB_OK );
            
return 0;
        }


        assert( m_stHead.m_nControlsCount 
< CONTROLS_COUNT_MAX );

        
forint n=0; n<m_stHead.m_nControlsCount; n++ )
        
{
            m_pstControlData[n] 
= NewData( m_stHead.m_nControlsType[n] );
            
switch( m_stHead.m_nControlsType[n] )
            
{
            
case Type_Button:
                fread( m_pstControlData[n], 
sizeof(S_ButtonData), 1, fp );
                
break;
            
case Type_CheckBox:
                fread( m_pstControlData[n], 
sizeof(S_CheckBoxData), 1, fp );
                
break;
            
case Type_Edit:
                fread( m_pstControlData[n], 
sizeof(S_EditData), 1, fp );
                
break;
            
case Type_Text:
                fread( m_pstControlData[n], 
sizeof(S_TextData), 1, fp );
                
break;
            
case Type_List:
                fread( m_pstControlData[n], 
sizeof(S_ListData), 1, fp );
                
break;
            
case Type_ListImg:
                fread( m_pstControlData[n], 
sizeof(S_ListImgData), 1, fp );
                
break;
            
case Type_ScrollBar:
                fread( m_pstControlData[n], 
sizeof(S_ScrollBarData), 1, fp );
                
break;
            
case Type_ScrollBarEx:
                fread( m_pstControlData[n], 
sizeof(S_ScrollBarExData), 1, fp );
                
break;
            
case Type_ComboBox:
                fread( m_pstControlData[n], 
sizeof(S_ComboBoxData), 1, fp );
                
break;
            
case Type_Picture:
                fread( m_pstControlData[n], 
sizeof(S_PictureData), 1, fp );
                
break;
            
case Type_Progress:
                fread( m_pstControlData[n], 
sizeof(S_ProgressData), 1, fp );
                
break;
            
case Type_Tab:
                fread( m_pstControlData[n], 
sizeof(S_TabData), 1, fp );
                
break;
            
case Type_ListEx:
                fread( m_pstControlData[n], 
sizeof(S_ListExData), 1, fp );
                
break;
            
default:
                assert( 
false );
                
break;
            }

        }


        fclose(fp);
        
return m_stHead.m_dwCreatedDate;
    }

    
return 0;
    unguard;
}


DWORD S_UIData::SaveFile( 
const char* pszFileName )
{
    
//time_t osBinaryTime;  // C run-time time (defined in <time.h>)
    
//time( &osBinaryTime );
    
//m_stHead.m_dwCreatedDate = (DWORD)osBinaryTime;
    assert( pszFileName );
    
//
    DWORD dwVer = 0;
    
forint n=0; n<m_stHead.m_nControlsCount; n++ )
    
{
        
int nIdLength = strlen(m_pstControlData[n]->m_szID);
        assert( nIdLength 
> 0 );
        
forint i=0; i<nIdLength; i++ )
        
{
            dwVer 
+= m_pstControlData[n]->m_szID[i];
        }

    }

    dwVer 
= dwVer*m_stHead.m_nControlsCount + 1;
    m_stHead.m_dwCreatedDate 
= dwVer;

    FILE 
*fp = fopen( pszFileName, "w+b" );
    
if ( fp )
    
{
        fwrite( &m_stHead.m_szVer, sizeof(m_stHead.m_szVer), 1, fp );
        fwrite( &m_stHead.m_dwCreatedDate, sizeof( m_stHead.m_dwCreatedDate ) , 1, fp );
        fwrite( &m_stHead.m_stFrameData, sizeof( m_stHead.m_stFrameData ) , 1, fp );
        fwrite( &m_stHead.m_nControlsCount, sizeof( m_stHead.m_nControlsCount ) , 1, fp );

        //fwrite( &m_stHead, 
        //    sizeof(m_stHead.m_szVer)+sizeof(m_stHead.m_dwCreatedDate)+sizeof(m_stHead.m_stFrameData)+sizeof(m_stHead.m_nControlsCount),
        //    1, fp );
      
         //按容器中的空間數(shù)量進(jìn)行讀取
        fwrite( &m_stHead.m_nControlsType[0],sizeof(int)*m_stHead.m_nControlsCount, 1, fp );
        

        for( int n=0; n<m_stHead.m_nControlsCount; n++ )
        {
            switch( m_stHead.m_nControlsType[n] )
            {
            case Type_Button:
                SAVE_CONTROL( S_ButtonData );
                break;
            case Type_CheckBox:
                SAVE_CONTROL( S_CheckBoxData );
                break;
            case Type_Edit:
                SAVE_CONTROL( S_EditData );
                break;
            case Type_Text:
                SAVE_CONTROL( S_TextData );
                break;
            case Type_List:
                SAVE_CONTROL( S_ListData );
                break;
            case Type_ListImg:
                SAVE_CONTROL( S_ListImgData );
                break;
            case Type_ScrollBar:
                SAVE_CONTROL( S_ScrollBarData );
                break;
            case Type_ScrollBarEx:
                SAVE_CONTROL( S_ScrollBarExData );
                break;
            case Type_ComboBox:
                SAVE_CONTROL( S_ComboBoxData );
                break;
            case Type_Picture:
                SAVE_CONTROL( S_PictureData );
                break;
            case Type_Progress:
                SAVE_CONTROL( S_ProgressData );
                break;
            case Type_Tab:
                SAVE_CONTROL( S_TabData );
                break;
            case Type_ListEx:
                SAVE_CONTROL( S_ListExData );
                break;
            default:
                assert(false);
                break;
            }
        }
        fclose(fp);
        return dwVer;
    }
    
return 0;
}


最后需要注意的就是 字節(jié)對(duì)齊 問題

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2.UI整體設(shè)計(jì)思路 

 設(shè)計(jì)思路:我們游戲中的UI常劃分為常見UI模塊,如Friend面板,Property面板,Pack面板,Pet面板等等.
 每個(gè)模塊中的單個(gè)UI也處理消息,渲染...
 我們創(chuàng)建一個(gè)UIMgr來管理這些大的UI模塊(即UIFrame),每個(gè)UIFrame來管理大模塊中的單個(gè)小UI控件
 然后在應(yīng)用程序中分別調(diào)用UIMgr來處理
 
 一句話:app管理UIMgr,UIMgr管理UIFrame, UIFrame管理單個(gè)UI控件(UI_Object)
 
 
 我們的應(yīng)用程序擁有主要函數(shù):
 virtual HRESULT FrameMove(); //更新
 virtual HRESULT Render();  //渲染
 virtual LRESULT MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
 
 分別調(diào)用 theUIMgr.FrameMove(), theUIMgr.Render(), theUIMgr().MsgProc(...)
 
 theUIMgr是一個(gè)UIFrame的容器  vector<UIFrame*> vecFrame;
 
 內(nèi)部調(diào)用UIFrame的消息處理
 for( int i = 0; i < vecFrame.size(); i++ )
 vecFrame[i]->FrameMove();
 vecFrame[i]->Render();
 vecFrame[i]->OnMouseMove(...);
 vecFrame[i]->OnLButtonDown(...);
 
 vecFrame[i]->MsgProc(...);
 

 
UIFrame是單個(gè)UI控件的容器 vector<UI_Object*> m_vecChild;
 
 for( int i = 0; i < m_vecChild.size(); i++ )
 m_vecChild[i]->FrameMove();
 ....
 m_vecChild[i]->Render();
 ....
 m_vecChild[i]->OnMouseMove(...);
 

所有的UI消息都能夠處理了,所有處理要依據(jù)先后關(guān)系,如一個(gè)面板消息被一個(gè)UI處理后,那么要返回true,
其他的UI將不會(huì)重復(fù)處理


問題是我們會(huì)將我們的UI做成一個(gè)UI 靜態(tài)庫,那么我們按鈕按下觸發(fā)的功能,無法提前設(shè)置好,
解決方法: 設(shè)置回調(diào)函數(shù)
eg:
 CHR_UI_Frame下的回調(diào)函數(shù)接口
 typedef bool (*funOnClick)( OUT CHR_UI_Object* pSender );
 typedef bool (*funOnRBtnDown)( OUT CHR_UI_Object* pSender );
 typedef bool (*funRun)(void);
 typedef bool (*funRender)(void);
 
 CHR_UI_Edit下的回調(diào)函數(shù)指針
 typedef void (*funOnEnter)( OUT CHR_UI_Object* pSender, OUT const char *szData );
 typedef void (*funOnTab)( OUT CHR_UI_Object* pSender, OUT const char* szData);
 
 CHR_UI_Button下的函數(shù)接口
 typedef bool (*funOnButtonClick)( OUT CHR_UI_Object* pSender );
 
 ...
 
 在WM_LBUTTONUP中調(diào)用觸發(fā)
 if ( m_pFunOnButtonClick )  //函數(shù)指針
 {
  if ( m_pFunOnButtonClick( this ) == false )
  {
   if ( m_pFather && strcmp( m_pstData->m_szID, "ID_BUTTON_CLOSE" ) == 0 )
   {
    m_pFather->SetVisable( false );
   }
  }
 }
 
 m_pID_BUTTON_SelectRole.SetButtonClickFunc( ID_BUTTON_SELECTROLEOnButtonDown );
 
   

posted on 2010-09-03 14:14 風(fēng)輕云淡 閱讀(578) 評(píng)論(0)  編輯 收藏 引用 所屬分類: UI
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久国产精品99久久久久久老狼| 欧美成人精品| 亚洲欧美日韩国产另类专区| 亚洲女女女同性video| 亚洲欧美综合精品久久成人| 亚洲欧美另类久久久精品2019| 久久黄色级2电影| 欧美国产先锋| 亚洲视频中文字幕| 亚洲第一精品久久忘忧草社区| 亚洲福利视频一区| 亚洲在线不卡| 欧美大色视频| 亚洲字幕一区二区| 美女精品视频一区| 国产精品久久久久久一区二区三区| 国产主播精品在线| 亚洲美女淫视频| 欧美一区二区网站| 91久久精品视频| 亚洲嫩草精品久久| 久久精品国产999大香线蕉| 欧美激情综合| 亚洲高清不卡在线| 欧美在线看片| 宅男噜噜噜66一区二区| 欧美激情第4页| 日韩视频在线一区二区| 久久久久综合网| 亚洲一区二区三区免费观看| 美日韩精品视频| 亚洲人午夜精品免费| 久久久www| 国产在线精品一区二区中文 | 亚洲私人影吧| 免费在线观看一区二区| 国产亚洲激情在线| 先锋亚洲精品| 亚洲一区二区三区乱码aⅴ| 欧美精品aa| 亚洲欧洲另类国产综合| 蜜臀久久99精品久久久画质超高清| 午夜精品久久久久久久蜜桃app| 欧美日韩精品国产| 亚洲精品欧美日韩专区| 久久夜色精品一区| 亚洲精品视频二区| 欧美劲爆第一页| 亚洲激情一区二区三区| 国产一区二区三区观看| 亚洲在线免费视频| 一区二区三区久久精品| 国产精品福利久久久| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲毛片av在线| 欧美三级网址| 亚洲欧美日韩综合aⅴ视频| 亚洲无线视频| 国产精品亚洲网站| 欧美一区二区三区在线| 一区二区欧美国产| 国产伦精品一区二区三区免费 | 尤物yw午夜国产精品视频| 久久精品国产欧美亚洲人人爽| 欧美在线免费视屏| 在线观看日韩国产| 亚洲日本无吗高清不卡| 欧美亚州韩日在线看免费版国语版| 销魂美女一区二区三区视频在线| 欧美一级理论片| 精品电影一区| 巨乳诱惑日韩免费av| 欧美ed2k| 亚洲国产女人aaa毛片在线| 蜜臀av性久久久久蜜臀aⅴ| 欧美激情视频在线播放| 午夜精品一区二区三区在线视 | 久久免费视频观看| 欧美综合77777色婷婷| 极品少妇一区二区三区精品视频| 美女脱光内衣内裤视频久久网站| 欧美bbbxxxxx| 国产精品午夜在线观看| 亚洲午夜国产成人av电影男同| 亚洲欧美一级二级三级| 亚洲国产日韩精品| 在线视频亚洲| 亚洲国产精品小视频| 亚洲天堂男人| 亚洲精品日韩一| 欧美一级二区| 亚洲永久视频| 欧美高清视频在线播放| 午夜精品久久久久久久99黑人| 一本色道88久久加勒比精品 | 久久一区亚洲| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 国产专区欧美专区| 黄色精品一区二区| 亚洲麻豆视频| 亚洲日产国产精品| 久久久久国色av免费观看性色| 亚洲专区欧美专区| 免费亚洲电影在线| 久久国产精品一区二区三区| 欧美日韩一区二区三区在线看| 小黄鸭精品aⅴ导航网站入口| 欧美精品一区二区精品网| 久久久在线视频| 国产精品亚发布| 亚洲神马久久| 亚洲综合色自拍一区| 嫩草伊人久久精品少妇av杨幂| 亚洲一区自拍| 欧美日韩中文在线| 日韩视频一区二区三区在线播放免费观看 | 亚洲一区二区三区精品视频| 裸体一区二区| 欧美**人妖| 亚洲第一页中文字幕| 久久资源在线| 欧美黄在线观看| 在线观看日韩av| 噜噜噜躁狠狠躁狠狠精品视频| 欧美顶级少妇做爰| 在线观看欧美亚洲| 久热精品视频在线观看| 欧美va亚洲va日韩∨a综合色| 在线日韩欧美| 欧美成人精品一区二区三区| 欧美激情一区| 在线综合亚洲| 国产精品mm| 欧美一级午夜免费电影| 黄色成人在线观看| 噜噜噜噜噜久久久久久91| 亚洲你懂的在线视频| 国产精品资源| 久久久99国产精品免费| 欧美mv日韩mv亚洲| 国产亚洲观看| 开心色5月久久精品| 91久久精品国产91性色| 亚洲婷婷免费| 国内精品国产成人| 欧美va亚洲va国产综合| 亚洲日本中文字幕| 亚洲影视在线播放| 国产一区二区黄| 欧美成人官网二区| 夜夜躁日日躁狠狠久久88av| 欧美一区二区三区婷婷月色 | 国产一区二区精品久久99| 久久精品夜色噜噜亚洲aⅴ| 亚洲国产精品久久久久婷婷884| 夜夜嗨av一区二区三区网页| 国产精品女同互慰在线看| 久久久天天操| 亚洲一二三区在线| 亚洲成色777777在线观看影院| 在线天堂一区av电影| 国产麻豆精品视频| 亚洲免费伊人电影在线观看av| 久热精品视频在线观看一区| 亚洲剧情一区二区| 国产伦精品一区二区三区高清 | 亚洲国产欧美日韩精品| 影音先锋亚洲视频| 欧美精品大片| 久久激情视频久久| 在线视频日韩精品| 欧美激情日韩| 欧美一区三区三区高中清蜜桃| 亚洲精品免费网站| 国产亚洲人成a一在线v站| 国产精品va在线| 欧美精品一区二区视频| 久久成人av少妇免费| 一区二区欧美激情| 亚洲美女诱惑| 亚洲国产高清自拍| 久久久久久久久蜜桃| 亚洲一区二区三区四区五区黄| 亚洲国产精品成人精品| 国产日韩欧美高清| 国产精品白丝av嫩草影院| 欧美一区二区三区在线观看视频 | 欧美一级大片在线免费观看| 亚洲黄色免费网站| 狠狠色狠狠色综合| 国产欧美一区二区精品性| 欧美日韩精品免费观看| 欧美69视频| 久久色在线播放| 中日韩午夜理伦电影免费| 亚洲精品乱码久久久久久蜜桃91 | 中日韩在线视频| 亚洲精品孕妇| 亚洲精品久久久久久下一站| 亚洲黄色影院|