• <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>

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              117 Posts :: 2 Stories :: 61 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(8)

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜


                定時(shí)器的使用固然很簡單方便,但是事實(shí)上這樣的方法僅適合用在顯示簡易動畫及小型的游戲程序中。因而一般而言,游戲本身需要顯示順暢的游戲畫面,使玩家感覺不到延遲的狀況,基本上游戲畫面必須在一秒鐘之內(nèi)更新至少25次以上,這一秒鐘內(nèi)程序還必須進(jìn)行消息的處理和大量數(shù)學(xué)運(yùn)算甚至音效的輸出等操作。而使用定時(shí)器的消息來驅(qū)動這些操作,往往達(dá)不到所要求的標(biāo)準(zhǔn),不然就會產(chǎn)生畫面顯示不順暢和游戲響應(yīng)時(shí)間太長的情況。

                這里提出一種“游戲循環(huán)”概念。游戲循環(huán)是將原先程序中的消息循環(huán)加以修改,方法時(shí)判斷其中的內(nèi)容是否有要處理的消息,如果有則進(jìn)行處理,否則按照設(shè)定的時(shí)間間隔來重繪畫面。下面所使用的游戲循環(huán)的程序代碼:

                // 游戲循環(huán)
                
            // 當(dāng)收到的msg.message不是窗口結(jié)束消息WM_QUIT,則繼續(xù)運(yùn)行循環(huán)。
                
            // 其中msg是一個MSG的消息結(jié)構(gòu),其結(jié)構(gòu)成員message則是一個消息類型的代號
                while( msg.message!=WM_QUIT )
                
            {
                    
            // 使用PeekMessage()函數(shù)來檢測目前是否有要處理的消息
                    
            // 若檢測到消息(包含WM_QUIT消息)則會返回一個非“0”的值,否則返回“0”。
                    
            // 因此在游戲循環(huán)中,若檢測到消息便進(jìn)行消息的處理,否則運(yùn)行else敘述之后的程序代碼
                    
            // 注意:PeekMessage()函數(shù)不能用原先消息循環(huán)的條件GetMessage()取代
                    
            // 因?yàn)镚etMessage()函數(shù)只有在取得WM_QUIT消息時(shí)才會返回“0”,其他時(shí)候則是返回非“0”或“-1”(發(fā)生錯誤時(shí))
                    if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) )
                    
            {
                        TranslateMessage( 
            &msg );
                        DispatchMessage( 
            &msg );
                    }

                    
            else
                    
            {
                        
            // GetTickCount()函數(shù)會取得系統(tǒng)開始運(yùn)行到目前所經(jīng)過的時(shí)間,單位是百萬分之一秒
                        
            // DWORD GetTickCount();   //取得系統(tǒng)開始到目前經(jīng)過的時(shí)間
                        
            // 在這里取得時(shí)間的目的主要是可以搭配接下來的判斷式,用來調(diào)整游戲運(yùn)行的速度,
                        
            // 使得游戲不會因?yàn)檫\(yùn)行計(jì)算機(jī)速度的不同而跑的太快或太慢
                        tNow = GetTickCount();
                        
            // “tPre”記錄前次繪圖的時(shí)間,而“tNow-tPre”則是計(jì)算上次繪圖到這次循環(huán)運(yùn)行之間
                        
            // 相差多少時(shí)間。這里設(shè)置為若相差100個單位時(shí)間以上則再次進(jìn)行繪圖的操作,通過這個
                        
            // 數(shù)值的控制可以調(diào)整游戲運(yùn)行的快慢
                        if(tNow-tPre >= 100)
                            MyPaint(hdc);
                    }

                }
                如果把100改為40,即設(shè)定40個單位時(shí)間(1微妙),那樣每隔40個單位進(jìn)行一次繪圖的操作,那么1秒鐘大約重繪窗口1000/40=25此,剛好可以達(dá)到期望值。

                由于循環(huán)的運(yùn)行速度遠(yuǎn)比定時(shí)器發(fā)出時(shí)間信號來得快,因此使用游戲循環(huán)的可以更精準(zhǔn)地控制程序運(yùn)行速度并提高每秒鐘畫面重繪的次數(shù)。


            范例ch3_2:使用游戲循環(huán)產(chǎn)生動畫效果,并在窗口左上角顯示每秒畫面更新次數(shù)。
            下載地址:ch3_2(上傳到windows live空間,可能需要MSN賬號登陸)
            說明:程序源代碼中有相關(guān)的注釋。
            程序運(yùn)行結(jié)果如下圖:


                在這個范例中設(shè)定畫面更新的時(shí)間間隔是0.1秒,所以每秒鐘最多會更新10次畫面,不過如果在范例運(yùn)行的同時(shí),運(yùn)行其他程序,那么CPU必須馬上去處理所開啟的其他程序,因此可能會使得每秒畫面的更新次數(shù)下降。這樣的情形在每秒畫面更新次數(shù)越高的時(shí)候會越顯著。

            PS:如想獲得更多關(guān)于Visual C++游戲開發(fā)的內(nèi)容,可點(diǎn)擊隨筆:《Visual C++游戲編程基礎(chǔ)》學(xué)習(xí)筆記——索引隨筆

            Feedback

            # re: 基礎(chǔ)動畫顯示——游戲循環(huán) 2010-08-16 17:28 sad
            是毫秒
            不是微秒!  回復(fù)  更多評論
              

            美女久久久久久| 国产日韩久久久精品影院首页| 日本国产精品久久| a高清免费毛片久久| 久久福利资源国产精品999| 欧美黑人激情性久久| 久久综合亚洲色一区二区三区| 囯产极品美女高潮无套久久久| 久久久久亚洲AV片无码下载蜜桃| 老司机国内精品久久久久| 久久久久久青草大香综合精品| 久久午夜无码鲁丝片秋霞| 情人伊人久久综合亚洲| 青春久久| 狠狠干狠狠久久| 久久久黄色大片| 国产精品无码久久综合网| 少妇精品久久久一区二区三区 | 久久精品国产免费观看三人同眠| 久久精品一本到99热免费| 久久久久一本毛久久久| 狠狠色丁香久久婷婷综| 无码八A片人妻少妇久久| 国产成人精品综合久久久| 亚洲精品无码久久一线| 欧美粉嫩小泬久久久久久久 | 18岁日韩内射颜射午夜久久成人 | 免费观看久久精彩视频| 人妻无码αv中文字幕久久| 亚洲国产一成久久精品国产成人综合| 国产精品18久久久久久vr| 亚洲va国产va天堂va久久| 国产精品久久久久久久久久影院| 国产免费福利体检区久久| 亚洲国产成人久久综合碰碰动漫3d| 婷婷久久香蕉五月综合加勒比| 久久中文字幕精品| 精品久久久久久国产| 综合网日日天干夜夜久久| 久久精品中文无码资源站| 亚洲中文久久精品无码ww16|