• <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>
            隨筆 - 96  文章 - 255  trackbacks - 0
            <2008年4月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

            E-mail:zbln426@163.com QQ:85132383 長期尋找對戰(zhàn)略游戲感興趣的合作伙伴。

            常用鏈接

            留言簿(21)

            隨筆分類

            隨筆檔案

            SDL相關(guān)網(wǎng)站

            我的個(gè)人網(wǎng)頁

            我的小游戲

            資源下載

            搜索

            •  

            積分與排名

            • 積分 - 492196
            • 排名 - 38

            最新評論

            閱讀排行榜

            評論排行榜

            作者:龍飛

            1.1:為了按鈕做準(zhǔn)備

                    按鈕是鼠標(biāo)事件響應(yīng)的象征,在PC游戲中起著十分重要的作用。這一章節(jié),我們開始通過SDL提供的底層函數(shù),自己來設(shè)計(jì)按鈕。
                    按鈕一般有這么幾種狀態(tài):
            out: 鼠標(biāo)不在按鈕上;
            over: 鼠標(biāo)在按鈕上;
            down: 鼠標(biāo)按下了;
            up: 鼠標(biāo)松開了;
                    其中,down和up又可以細(xì)分為鼠標(biāo)是在按鈕上按下松開的,還是在按鈕外按下松開的。
                    我們先從按鈕的表現(xiàn)形式——圖片來分析這些問題。
                    為了表現(xiàn)不同的狀態(tài),我們需要多張圖片。至少的,out與over和down中的至少一張圖片應(yīng)該是不一樣的,這樣才能給人以“按下了”的視覺效果。也就是說,如果我們構(gòu)建按鈕類,這個(gè)類將會包含我們之前設(shè)計(jì)的SurfaceClass類。這樣,根據(jù)我們之前討論的一些C++細(xì)節(jié)問題,我們必須重新小心的設(shè)計(jì)SurfaceClass類。

            1.2:為SurfaceClass設(shè)計(jì)基類

                    我們之前使用DisplaySurface本身作為TextSurface的基類,這是因?yàn)槲覀兿Mㄟ^基類本身引用派生類,從而不需要為基類和派生類分別寫函數(shù)。同樣的,我們希望在ButtonClass中直接使用基類作為成員數(shù)據(jù),這樣,ButtonClass可以不需要為派生類重新構(gòu)建。在之前的DisplaySurface中,我們可以看到,大部分方法,比如最為重要的blit()方法,所涉及到的成員數(shù)據(jù)僅僅就是SDL_Surface* pSurface,這一點(diǎn),TextSurface類也是一樣的。DisplaySurface類通過圖片創(chuàng)建pSurface,TextSurface類通過字庫創(chuàng)建pSurface,他們的創(chuàng)建條件不盡相同,TextSurface需要打開TTF_Init(),還需要打開字庫TTF_OpenFont(),所以,他們的構(gòu)造函數(shù)與析構(gòu)函數(shù)是不一樣的。一種更加清晰的關(guān)系,是建立起他們的基類,然后把他們的區(qū)別點(diǎn)分開處理,而不是之前采用的if來判斷處理。
                    最清晰的辦法,是把BaseSurface設(shè)計(jì)成為抽象基類(ABC),但是ABC的問題在于,無法創(chuàng)建ABC本身的對象,也就是說,我們需要在ButtonClass中包含的BaseSurface對象無法建立,所以,我們不能把BaseSurface設(shè)計(jì)成為ABC。我想到的辦法,是將BaseSurface的默認(rèn)構(gòu)造函數(shù)僅僅提供給派生類使用,也就是說,因?yàn)锽aseClass的默認(rèn)構(gòu)造函數(shù)本身是不能建立起必要的數(shù)據(jù)的,比如pSurface和pScreen,我們暫時(shí)都用空指針代替。這里的思想其實(shí)還是ABC的,讓基類僅僅提供算法,即使算法所需要的元素還尚不存在。但是,只要這些元素存在了,BaseSurface也就可以完成這些算法,所以,我們把BaseSurface的復(fù)制構(gòu)造函數(shù)設(shè)計(jì)為公共的,這很重要,這樣才為我們通過派生類去初始化基類的構(gòu)造函數(shù)初始化列表提供了可能。
                    我們把基類命名為BaseSurface,之前的DisplaySurface我們用更形象的名稱代替,叫PictureSurface,然后TextSurface不改名。

            1.3:如何深度復(fù)制SDL_Surface ?

                    因?yàn)镻ictureSurface和TextSurface的構(gòu)造函數(shù)都涉及到了堆操作,也就是說,SDL_Surface是建立在堆上的。我們需要通過基類的復(fù)制構(gòu)造函數(shù)復(fù)制SDL_Surface,必須找到合適的工具。具體來說,新對象的pSurface必須指像一個(gè)新建立起來的SDL_Surface對象,而非被復(fù)制的對象本身。
                    我最先想到的是用new...delete組合,但是失敗了。為什么呢?我們研究SDL_Surafce結(jié)構(gòu)本身,發(fā)現(xiàn)在之中包含著一些其它的指針。比如SDL_PixelFormat *format和void *pixels。也就是說,SDL_Surface本身的構(gòu)建也有堆操作,而且,因?yàn)镾DL_Surafce是C風(fēng)格的結(jié)構(gòu)而不是類,它不能提供深度復(fù)制的操作,所以,即使我們用new為SDL_Surface申請了新空間,SDL_Surface本身也不會為format和pixels申請新的副本。當(dāng)被釋放掉原本的時(shí)候,副本將尋找不到原本的format和pixels,從而產(chǎn)生錯(cuò)誤。
                    我們另外能找到的可以深度復(fù)制SDL_Surface的函數(shù),是:
            SDL_Surface *SDL_DisplayFormat(SDL_Surface *surface);
            SDL_Surface *SDL_ConvertSurface(SDL_Surface *src, SDL_PixelFormat *fmt, Uint32 flags);
                    這兩個(gè)函數(shù)貌似都是可行的。實(shí)際上,基本上也都是可行的。但是涉及到文字的時(shí)候,SDL_DisplayFormat將不能正確的轉(zhuǎn)換Blended和Shaded的文字,所以,最后只能使用SDL_ConvertSurafce()。
             新構(gòu)建的SurfaceClass源代碼見:
            http://www.shnenglu.com/lf426/archive/2008/04/14/47038.html
            posted on 2008-04-17 12:37 lf426 閱讀(2267) 評論(0)  編輯 收藏 引用 所屬分類: SDL入門教程
            久久成人永久免费播放| 久久精品卫校国产小美女| 青青国产成人久久91网 | 久久99热这里只频精品6| 色狠狠久久综合网| 99久久人妻无码精品系列| 久久精品免费网站网| 亚洲中文字幕无码久久2020| 亚洲综合婷婷久久| 一本久久免费视频| 国产精品久久久久久搜索| 日本国产精品久久| 青青青国产精品国产精品久久久久 | 国产成人无码精品久久久久免费| 三级片免费观看久久| 久久人人爽人人爽人人AV| 久久AAAA片一区二区| 久久久噜噜噜久久中文福利| 亚洲婷婷国产精品电影人久久| 精品久久久无码人妻中文字幕豆芽 | 久久久久久免费视频| 久久精品成人免费网站| 久久AV无码精品人妻糸列| 99久久精品国产综合一区| 久久久久亚洲AV成人片| 性欧美大战久久久久久久| 色综合久久中文综合网| 久久国产精品成人片免费| 久久综合亚洲鲁鲁五月天| 国产精品成人99久久久久91gav| 波多野结衣中文字幕久久| 一本色道久久综合亚洲精品| 久久夜色精品国产噜噜亚洲a| 国内精品久久久久国产盗摄| 国内精品久久久久影院免费| 久久久久人妻一区精品色| 亚洲人成精品久久久久| AV无码久久久久不卡蜜桃| 久久热这里只有精品在线观看| 免费一级欧美大片久久网| 久久久久久毛片免费看|