• <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
            <2010年6月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

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

            常用鏈接

            留言簿(21)

            隨筆分類

            隨筆檔案

            SDL相關網站

            我的個人網頁

            我的小游戲

            資源下載

            搜索

            •  

            積分與排名

            • 積分 - 494276
            • 排名 - 39

            最新評論

            閱讀排行榜

            評論排行榜

            作者:龍飛

            2.1:設計框架與基類的接口

                    有了更加完善的SurfaceClass的支持,我們可以進行按鈕的設計了。接著上一節的話題,按鈕除了要給我們表現出來是否被按下的視覺效果,還要起到實際上的作用。一種最簡單的思路,既是鼠標在按鈕上一旦按下,程序就馬上響應。這種思路很樸素,也很實用。大名鼎鼎的QuakeIII的菜單按鈕就是這么設計的,這樣我們幾乎是可以直接使用SDL的事件響應,即:事件不為空——鼠標事件的左鍵按下——響應處理。
                    但是也許我們已經習慣更加人性話的GUI按鈕了。比如,如果是不小心點錯了,馬上響應意味著沒有機會改正操作失誤。事實上,我們仔細分析當今GUI上的按鈕,可以發現按鈕的實際效果,是在按下鼠標,并且又松開的時候產生的響應。其實這樣說也并不完全準確,更加準確的描述,應該是鼠標既要在按鈕上按下,又要在按鈕上松開——其實這還是不完整,我想說的是,為了描述這個復雜的狀態,我們不得不在ButtonClass中引入幾個bool量,以判斷按鈕是否真正起作用。
                    按鈕的構成與視覺效果,根據我們之前的知識,大概具有這幾類:完全由PictureSurface組成,這又分為兩類,兩張Picture(out和over)或者三張Picture(再加張down);由TextSurface組成;由一張精靈圖的PictureSurafce切分出來。他們的接口幾乎是一樣的:設置位置和按下時的偏移(setup),扣色(colorkey),添加文字(addText),顯示(blit),鼠標事件判斷(mouse out, over, down, up 甚至是 up outside)和有效點擊(effectiveClick)。所以,我們有理由用基類來規定這些接口。或者說,用ABC(抽象基類)的純虛函數硬性規定這些接口。

            2.2:鼠標事件判斷與有效點擊

            移動:SDL_MOUSEMOTION
            觸發的開關是鼠標發生了移動。我們需要判斷鼠標是否移動到了按鈕上,或者移動到了不是按鈕區域的地方;
            點擊:SDL_MOUSEBUTTONDOWN
            觸發條件是鼠標按下了,我們需要進一步判斷是不是左鍵按下了(gameEvent.button.button == SDL_BUTTON_LEFT ),然后判斷是不是在按鈕區域內按下的。
            松開:SDL_MOUSEBUTTONUP
            觸發條件是鼠標松開了,我們需要進一步判斷是不是左鍵松開了(gameEvent.button.button == SDL_BUTTON_LEFT ),然后判斷是不是在按鈕區域內松開的。
            按鈕外松開:SDL_MOUSEBUTTONUP
            觸發條件是鼠標松開了,我們需要進一步判斷是不是左鍵松開了(gameEvent.button.button == SDL_BUTTON_LEFT ),然后判斷是不是在按鈕區域內松開的。
                    我們之所以需要做這些判斷,是為了構建我們剛才設想中的按鈕效果,即有效點擊(effectiveClick)。因為有效點擊不是通過一次事件的判斷完成的,我們通過三個bool量在整個按鈕的生命周期類描述按鈕所接收到的鼠標事件:inBox鼠標在按鈕區域內;clickDown鼠標在按鈕區域類被按下過(并且沒有在外面松開);clickUp鼠標在按鈕區域內松開。我們來看看這段代碼吧……我承認,if得很混亂,但是居然能正常工作,呵呵。
            bool BaseButton::effectiveClick(const SDL_Event& game_event)
            {
                inBox 
            = this->mouseOver(game_event);
                
            if ( this->mouseDown(game_event) == true ){
                    clickDown 
            = true;
                    inBox 
            = true;
                }
                
            if ( this->mouseUp(game_event) == true ){
                    
            if ( clickDown == true )
                        clickUp 
            = true;
                    inBox 
            = true;
                }
                
            if ( this->mouseUpOutside(game_event) == true )
                    clickDown 
            = false;

                
            if ( inBox == true && clickDown == false ){
                    
            this->blitOver();
                    
            return false;
                }
                
            else if ( inBox == true && clickDown == true ){
                    
            if ( clickUp == true ){
                        clickUp 
            = false;
                        clickDown 
            = false;
                        
            this->blitOver();
                        
            return true;
                    } 
            else {
                        
            this->blitDown();
                        
            return false;
                    }
                }
                
            else {
                    
            this->blitOut();
                    
            return false;
                }
            }
                    最有意思的是,我們可以把這個函數構建在基類中——即使blitxxx()這類的函數都是純虛函數——但是他們已經代表了算法。在用不同的派生類調用基類的這個方法的時候,blitxxx()會被替換成相應派生類的版本,從而減少了重復寫代碼的工作。

            2.3:ButtonClass的源代碼
            http://www.shnenglu.com/lf426/archive/2008/04/15/47156.html
            posted on 2008-04-19 12:18 lf426 閱讀(3572) 評論(0)  編輯 收藏 引用 所屬分類: SDL入門教程
            国内精品伊人久久久久影院对白| 浪潮AV色综合久久天堂| 国产成人无码精品久久久免费 | 亚洲精品国产综合久久一线| 无码人妻久久一区二区三区蜜桃 | 男女久久久国产一区二区三区| 亚洲AV日韩AV永久无码久久| 亚洲国产成人久久综合碰碰动漫3d | 精品国产99久久久久久麻豆| 久久综合综合久久97色| 久久精品国产免费观看三人同眠| 久久午夜电影网| 日韩久久久久久中文人妻 | 伊人色综合久久天天| 亚洲午夜久久久影院伊人| 国产福利电影一区二区三区久久久久成人精品综合 | 精品久久久久久久久久久久久久久| 国产精品99久久久久久宅男小说| 久久中文娱乐网| 亚洲国产精品无码久久SM| 亚洲伊人久久综合影院| 久久香蕉一级毛片| 久久精品视频免费| jizzjizz国产精品久久| 久久人爽人人爽人人片AV| 久久国产欧美日韩精品免费| 国产精品欧美久久久久无广告 | 精品国产一区二区三区久久蜜臀| 国产精品久久久久久福利69堂| 奇米影视7777久久精品| 久久人人爽人人爽人人片AV不 | 国产精品99精品久久免费| 久久精品国产亚洲αv忘忧草 | 狠狠人妻久久久久久综合蜜桃| 精品久久久久久国产| 久久国产精品久久精品国产| 欧美日韩中文字幕久久伊人| 国产精品久久久久久福利69堂| 久久er热视频在这里精品| 久久电影网2021| 久久久久亚洲AV无码专区桃色|