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

tbwshc

tbw

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  95 Posts :: 8 Stories :: 3 Comments :: 0 Trackbacks

常用鏈接

留言簿(4)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

這里我們提出一種游戲循環(huán)的概念,游戲循環(huán)是將原先程序中的消息循環(huán)加以修改,方法是判斷其中的內(nèi)容目前是否有要處理的消息,如果有則進行處理,否則按照設(shè)定的時間間隔來重繪畫面。下面是接下來一段游戲循環(huán)的程序代碼:
   
    //游戲循環(huán)
   
    while( msg.message!=WM_QUIT )               //注釋點1(詳細內(nèi)容見下)
   
    {
   
    if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) )       //注釋點2(詳細內(nèi)容見下)
   
    {
   
    TranslateMessage( &msg );
   
    DispatchMessage( &msg );
   
    }
   
    else
   
    {
   
    tNow = GetTickCount();                        //注釋點3
   
    if(tNow-tPre >= 100)                   //注釋點4
   
    MyPaint(hdc);
   
    }
   
    }
   
    我們來講解一下游戲循環(huán)片段中的幾個重點。
   
    <1>注釋點1:當收到的msg.message不是窗口結(jié)束消息WM_QUIT,則繼續(xù)運行循環(huán),其中msg是一個MSG的消息結(jié)構(gòu),其結(jié)構(gòu)成員message則是一個消息類型的代號。
   
    <2>注釋點2:使用PeekMessage()函數(shù)來檢測目前是否有需要處理的消息,若檢測到消息(包含WM_QUIT消息)則會返回一個非“0”值,否則返回“0”.因此在游戲循環(huán)中,若檢測到消息便進行消息的處理,否則運行else敘述之后的程序代碼。這里我們要注意的是,PeekMessage()函數(shù)不能用原先消息循環(huán)的條件GetMessage()取代,因為GetMessage()函數(shù)只有在取得WM_QUIT消息時才會返回“0”,其他時候則是返回非“0”值或“-1”(發(fā)生錯誤時)
   
    <3>注釋點3:GetTickCount()函數(shù)會取得系統(tǒng)開始運行到目前所經(jīng)過的時間,單位是毫秒(milliseconds)。  之前我理解錯了,在這里感謝worldy的指出我的錯誤。
   
    DWORD GetTickCount()    //取得系統(tǒng)開始到目前經(jīng)過的時間
   
    這里取得時間的目的主要是可以搭配接下來的判斷式,用來調(diào)整游戲運行的速度,使得游戲不會因為運行計算機速度的不同而跑得太快或者太慢。

    
    <4>注釋點4:if條件式中,“tPre”記錄前次繪圖的時間,而“tNow-tRre”則是計算上次繪圖到這次循環(huán)運行之間相差多少時間。這里設(shè)置為若相差40個單位時間以上則再次進行繪圖的操作,通過這個數(shù)值的控制可以調(diào)整游戲運行的速度。這里設(shè)定40個單位時間(微秒)的原因是,因為每隔40個單位進行一次繪圖的操作,那么1秒鐘大約重繪窗口1000/40=25次剛好可以達到期望值。
   
    由于循環(huán)的運行速度遠比定時器發(fā)出時間信號來得快,因此使用游戲循環(huán)可以更精準地控制程序運行速度并提高每秒鐘畫面重繪的次數(shù)。
   
    了解了游戲循環(huán)使用的基本概念之后,接下來的范例將以游戲循環(huán)的方法進行窗口的連續(xù)貼圖,更精確地制作游戲動畫效果。
   
    #include “stdafx.h”
   
    #include <stdio.h>
   
    //全局變量聲明
   
    HINSTANCE hInst;
   
    HBITMAP man[7];
   
    HDC  hdc,mdc;
   
    HWND    hWnd;
   
    DWORD   tPre,tNow,tCheck;                 //聲明三個函數(shù)來記錄時間,tPre記錄上一次繪圖的時間,tNow記錄此次準備繪圖的時間,tCheck記錄每秒開始的時間
   
    int  num,frame,fps;                    //num用來記錄圖號,frame用來累加每次畫面更新的次數(shù),fps(frame per second)用來記錄每秒畫面更新的次數(shù)
   
    //全局函數(shù)的聲明
   
    ATOM     MyRegisterClass
   
    (HINSTANCE hInstance);
   
    BOOL     InitInstance
   
    (HINSTANCE, int);
   
    LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM,
   
    LPARAM);
   
    void     MyPaint(HDC hdc);
   
    //***WinMain函數(shù),程序入口點函數(shù)**************************************
   
    int APIENTRY WinMain(HINSTANCE hInstance,
   
    HINSTANCE hPrevInstance,
   
    LPSTR     lpCmdLine,
   
    int       nCmdShow)
   
    {
   
    MSG msg;
   
    MyRegisterClass(hInstance);
   
    //運行初始化函數(shù)
   
    if (!InitInstance (hInstance, nCmdShow))
   
    {
   
    return FALSE;
   
    }
   
    GetMessage(&msg,NULL,NULL,NULL);   //感謝xiaoxiangp的提醒,需要在進入消息循環(huán)之前初始化msg,避免了死循環(huán)發(fā)生的可能性。
   
    //游戲循環(huán)
   
    while( msg.message!=WM_QUIT )
   
    {
   
    if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) )
   
    {
   
    TranslateMessage( &msg );
   
    DispatchMessage( &msg );
   
    }
   
    else
   
    {
   
    tNow = GetTickCount();
   
    if(tNow-tPre >= 100)        //當此次循環(huán)運行與上次繪圖時間相差0.1秒時再進行重繪操作
   
    MyPaint(hdc);
   
    }
   
    }
   
    return msg.wParam;
   
    }
   
    //****設(shè)計一個窗口類,類似填空題,使用窗口結(jié)構(gòu)體*************************
   
    ATOM MyRegisterClass(HINSTANCE hInstance)
   
    {
   
    WNDCLASSEX wcex;
   
    wcex.cbSize = sizeof(WNDCLASSEX);
   
    wcex.style   = CS_HREDRAW |
   
    CS_VREDRAW;
   
    wcex.lpfnWndProc    = (WNDPROC)WndProc;
   
    wcex.cbClsExtra  = 0;
   
    wcex.cbWndExtra  = 0;
   
    wcex.hInstance   = hInstance;
   
    wcex.hIcon   = NULL;
   
    wcex.hCursor     = NULL;
   
    wcex.hCursor     = LoadCursor(NULL,
   
    IDC_ARROW);
   
    wcex.hbrBackground  = (HBRUSH)
   
    (COLOR_WINDOW+1);
   
    wcex.lpszMenuName   = NULL;
   
    wcex.lpszClassName  = “canvas”;
   
    wcex.hIconSm     = NULL;
   
    return RegisterClassEx(&wcex);
   
    }
   
    //****初始化函數(shù)*************************************
   
    // 從文件加載位圖
   
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
   
    {
   
    char filename[20] = “”;
   
    int i;
   
    hInst = hInstance;
   
    hWnd = CreateWindow(“canvas”, “動畫演示” ,
   
    WS_OVERLAPPEDWINDOW,
   
    CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
   
    NULL, NULL, hInstance, NULL);
   
    if (!hWnd)
   
    {
   
    return FALSE;
   
    }
   
    MoveWindow(hWnd,10,10,600,450,true);
   
    ShowWindow(hWnd, nCmdShow);
   
    UpdateWindow(hWnd);
   
    hdc = GetDC(hWnd);
   
    mdc = CreateCompatibleDC(hdc);
   
    //載入各個人物位圖
   
    for(i=0;i<7;i++)
   
    {
   
    sprintf(filename,“man%d.bmp”,i);
   
    man[i] = (HBITMAP)LoadImage
   
    (NULL,filename,IMAGE_BITMAP,640,480,LR_LOADFROMFILE);
   
    }
   
    num = 0;
   
    frame = 0;
   
    MyPaint(hdc);
   
    return TRUE;
   
    }
   
    //****自定義繪圖函數(shù)*********************************
   
    // 1.計算與顯示每秒畫面更新次數(shù)
   
    // 2.按照圖號順序進行窗口貼圖
   
    void MyPaint(HDC hdc)
   
    {
   
    char str[40] = “”;
   
    if(num == 7)
   
    num = 0;
   
    frame++;            //畫面更新次數(shù)加1
   
    if(tNow - tCheck >= 1000)               //tbw判斷此次繪圖時間由前一秒算起是否已經(jīng)達到1秒鐘的時間間隔。若是,則將目前的‘frame’值賦給“fps”,表示這一秒內(nèi)所更新的畫面次數(shù),然后將“frame”值回0,并重設(shè)下次計算每秒畫面數(shù)的起始時間“iCheck”.
   
    {
   
    fps = frame;
   
    frame = 0;
   
    tCheck = tNow;
   
    }
   
    SelectObject(mdc,man[num]);         //選用要更新的圖案到mdc中,再輸出顯示每秒畫面更新次數(shù)的字符串到mdc上,最后將mdc的內(nèi)容貼到窗口中。
   
    sprintf(str,“每秒顯示 %d個畫面”,fps);
   
    TextOut(mdc,0,0,str,strlen(str));
   
    BitBlt(hdc,0,0,600,450,mdc,0,0,SRCCOPY);
   
    tPre = GetTickCount();     //記錄此次繪圖時間,供下次游戲循環(huán)中判斷是否已經(jīng)達到畫面更新操作設(shè)定的時間間隔。
   
    num++;
   
    }
   
    //******消息處理函數(shù)*********************************
   
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
   
    WPARAM wParam, LPARAM lParam)
   
    {
   
    int i;
   
    switch (message)
   
    {
   
    case WM_DESTROY:     //窗口結(jié)束消息
   
    DeleteDC(mdc);
   
    for(i=0;i<7;i++)
   
    DeleteObject(man[i]);
   
    ReleaseDC(hWnd,hdc);
   
    PostQuitMessage(0);
   
    break;
   
    default:     //其他消息
   
    return DefWindowProc(hWnd,
   
    message, wParam, lParam);
   
    }
   
    return 0;
   
    }
   
    程序的運行結(jié)果如下圖:
posted on 2012-09-16 14:07 tbwshc 閱讀(124) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩卡一卡二| 国外成人在线视频| 亚洲视频在线一区| 一区二区三区国产盗摄| 国产精品xxx在线观看www| 午夜伦欧美伦电影理论片| 日韩一二三在线视频播| 亚洲精品人人| 国产欧美精品日韩| 久久久九九九九| 美女视频一区免费观看| 亚洲美女91| 亚洲一区二区三区在线视频| 国产精品天天看| 亚洲美女啪啪| 亚洲在线不卡| 最新精品在线| 亚洲一区二区三区高清不卡| 激情丁香综合| 一本久久a久久精品亚洲| 国产日韩欧美一区二区| 欧美福利视频在线| 国产精品免费小视频| 久久尤物电影视频在线观看| 欧美了一区在线观看| 欧美怡红院视频一区二区三区| 久久女同精品一区二区| 中日韩视频在线观看| 久久精品国语| 亚洲综合视频1区| 久久午夜精品| 久久国产一区二区| 欧美精品免费在线| 麻豆国产精品777777在线| 欧美日韩色综合| 美女露胸一区二区三区| 国产精品欧美风情| 欧美激情亚洲另类| 国产亚洲欧美一区二区三区| 亚洲黄一区二区| 激情综合久久| 亚洲欧美美女| 亚洲一卡久久| 欧美日本在线播放| 欧美成人免费播放| 国产女主播视频一区二区| 亚洲免费久久| 亚洲精品一区二| 亚洲欧洲精品一区二区三区不卡| 国产精品综合网站| 99亚洲视频| 一区二区高清视频| 欧美国产日韩在线| 亚洲高清在线播放| 亚洲激情在线播放| 米奇777超碰欧美日韩亚洲| 久久久天天操| 韩曰欧美视频免费观看| 欧美一区二区精品久久911| 亚洲尤物在线视频观看| 欧美日韩亚洲系列| 日韩一级在线观看| 亚洲手机成人高清视频| 欧美区一区二| 亚洲精品女人| 亚洲人久久久| 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲国产精品热久久| 亚洲电影网站| 欧美h视频在线| 亚洲精品1区2区| 制服丝袜激情欧洲亚洲| 欧美三级乱人伦电影| 一区二区三区免费看| 亚洲欧美日韩国产中文| 国产精品视频最多的网站| 亚洲欧美国产精品va在线观看| 欧美在线视频在线播放完整版免费观看| 国产精品视频九色porn| 欧美亚洲一区二区在线| 免费成人在线观看视频| 亚洲精品国产精品乱码不99按摩| 欧美激情片在线观看| 日韩视频免费观看高清完整版| 亚洲视屏在线播放| 国产日韩精品久久久| 久久青青草综合| 亚洲美女中文字幕| 久久av一区二区三区漫画| 黄色亚洲在线| 欧美激情1区2区3区| 中文日韩电影网站| 久久中文字幕一区| aa亚洲婷婷| 国产亚洲在线| 欧美日韩高清区| 欧美一区二区三区日韩视频| 欧美成年人在线观看| 中日韩美女免费视频网址在线观看 | 另类av一区二区| 99视频精品全国免费| 国产伦精品一区二区| 免费精品99久久国产综合精品| 99re6这里只有精品| 久久影视精品| 午夜精品久久久久久久男人的天堂| 国户精品久久久久久久久久久不卡| 欧美大成色www永久网站婷| 亚洲欧美经典视频| 91久久夜色精品国产九色| 久久九九热免费视频| 一区二区欧美日韩视频| 影音先锋一区| 国产日韩在线一区二区三区| 欧美区一区二区三区| 久久久久久亚洲精品中文字幕| 一本一本大道香蕉久在线精品| 母乳一区在线观看| 欧美综合77777色婷婷| 一区二区三区日韩欧美精品| 在线观看91精品国产麻豆| 国产精品视频观看| 欧美日韩黄视频| 欧美电影在线观看完整版| 久久成人免费电影| 午夜亚洲精品| 亚洲一区二区在线免费观看视频 | 亚洲精品美女在线观看播放| 久久国产免费| 欧美一区二区视频观看视频| 在线视频一区二区| 99在线|亚洲一区二区| 亚洲国产精品热久久| 欧美成人69av| 久久色在线观看| 久久人人爽人人| 久久精品亚洲| 久久久久国产一区二区三区四区| 亚洲欧美日韩爽爽影院| 亚洲欧美日韩国产| 亚洲欧美成人综合| 午夜精品久久久久久久白皮肤| 亚洲午夜精品在线| 亚洲一区在线观看视频| 亚洲一区尤物| 午夜精品影院| 欧美一区在线看| 久久久999精品| 久久久精品欧美丰满| 久久这里有精品视频 | 亚洲伦理网站| 亚洲精品黄网在线观看| 亚洲每日更新| 亚洲午夜视频| 欧美一区2区视频在线观看| 欧美一区观看| 米奇777在线欧美播放| 欧美大片免费久久精品三p| 欧美精品福利在线| 国产精品第十页| 国产三级精品在线不卡| 一区在线播放视频| 亚洲美女黄网| 翔田千里一区二区| 美乳少妇欧美精品| 亚洲精品视频在线观看免费| 在线一区二区三区四区| 欧美在线一级视频| 欧美成人一区二区在线| 国产精品国产a| 一区二区在线视频| 夜夜嗨av一区二区三区网站四季av| 亚洲午夜国产一区99re久久| 欧美在线视频免费| 欧美国产欧美亚洲国产日韩mv天天看完整 | 久久国产精品免费一区| 欧美激情成人在线| 亚洲性视频网址| 久久综合九色99| 国产精品豆花视频| 亚洲国产精品久久久久| 亚洲免费视频中文字幕| 免费欧美在线视频| 在线亚洲+欧美+日本专区| 久久精品免费观看| 欧美视频1区| 在线免费观看日韩欧美| 亚洲尤物在线视频观看| 欧美肥婆在线| 午夜精品久久久久久久99水蜜桃 | 欧美在线观看一二区| 欧美日韩mp4| 伊人一区二区三区久久精品| 亚洲网站在线观看| 欧美激情国产日韩精品一区18| 亚洲欧美日韩网| 欧美色网一区二区| 亚洲美女诱惑| 免费日韩视频| 久久精品在线|