• <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ù)  更多評論
              

            久久精品日日躁夜夜躁欧美| 久久精品国产亚洲AV无码娇色 | 久久久WWW成人免费毛片| 国产99久久九九精品无码| 久久精品国产清自在天天线| 久久免费视频1| 久久精品国产久精国产| 少妇无套内谢久久久久| 久久久久久免费一区二区三区 | 91亚洲国产成人久久精品网址| 久久成人18免费网站| 亚洲综合熟女久久久30p| 国产成人综合久久久久久| 亚洲国产精品无码久久久蜜芽| 国产精品免费久久久久影院 | 草草久久久无码国产专区| 一本色道久久HEZYO无码| 久久福利片| 久久综合久久综合久久| 色狠狠久久AV五月综合| 中文字幕久久精品| 久久国产免费观看精品3| 久久精品人妻一区二区三区| 色88久久久久高潮综合影院| 日韩美女18网站久久精品| 色噜噜狠狠先锋影音久久| 久久丫精品国产亚洲av| 久久午夜福利无码1000合集| 思思久久99热免费精品6| 99久久99久久精品国产| 久久综合丝袜日本网| 久久A级毛片免费观看| 男女久久久国产一区二区三区| 日本五月天婷久久网站| 久久亚洲精品国产精品婷婷| 久久亚洲AV无码西西人体| 狠狠色伊人久久精品综合网| 伊人久久免费视频| 99久久免费只有精品国产| 99久久精品这里只有精品| 中文字幕久久欲求不满|