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

tbwshc

tbw

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

常用鏈接

留言簿(4)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

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

    
    <4>注釋點4:if條件式中,“tPre”記錄前次繪圖的時間,而“tNow-tRre”則是計算上次繪圖到這次循環運行之間相差多少時間。這里設置為若相差40個單位時間以上則再次進行繪圖的操作,通過這個數值的控制可以調整游戲運行的速度。這里設定40個單位時間(微秒)的原因是,因為每隔40個單位進行一次繪圖的操作,那么1秒鐘大約重繪窗口1000/40=25次剛好可以達到期望值。
   
    由于循環的運行速度遠比定時器發出時間信號來得快,因此使用游戲循環可以更精準地控制程序運行速度并提高每秒鐘畫面重繪的次數。
   
    了解了游戲循環使用的基本概念之后,接下來的范例將以游戲循環的方法進行窗口的連續貼圖,更精確地制作游戲動畫效果。
   
    #include “stdafx.h”
   
    #include <stdio.h>
   
    //全局變量聲明
   
    HINSTANCE hInst;
   
    HBITMAP man[7];
   
    HDC  hdc,mdc;
   
    HWND    hWnd;
   
    DWORD   tPre,tNow,tCheck;                 //聲明三個函數來記錄時間,tPre記錄上一次繪圖的時間,tNow記錄此次準備繪圖的時間,tCheck記錄每秒開始的時間
   
    int  num,frame,fps;                    //num用來記錄圖號,frame用來累加每次畫面更新的次數,fps(frame per second)用來記錄每秒畫面更新的次數
   
    //全局函數的聲明
   
    ATOM     MyRegisterClass
   
    (HINSTANCE hInstance);
   
    BOOL     InitInstance
   
    (HINSTANCE, int);
   
    LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM,
   
    LPARAM);
   
    void     MyPaint(HDC hdc);
   
    //***WinMain函數,程序入口點函數**************************************
   
    int APIENTRY WinMain(HINSTANCE hInstance,
   
    HINSTANCE hPrevInstance,
   
    LPSTR     lpCmdLine,
   
    int       nCmdShow)
   
    {
   
    MSG msg;
   
    MyRegisterClass(hInstance);
   
    //運行初始化函數
   
    if (!InitInstance (hInstance, nCmdShow))
   
    {
   
    return FALSE;
   
    }
   
    GetMessage(&msg,NULL,NULL,NULL);   //感謝xiaoxiangp的提醒,需要在進入消息循環之前初始化msg,避免了死循環發生的可能性。
   
    //游戲循環
   
    while( msg.message!=WM_QUIT )
   
    {
   
    if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) )
   
    {
   
    TranslateMessage( &msg );
   
    DispatchMessage( &msg );
   
    }
   
    else
   
    {
   
    tNow = GetTickCount();
   
    if(tNow-tPre >= 100)        //當此次循環運行與上次繪圖時間相差0.1秒時再進行重繪操作
   
    MyPaint(hdc);
   
    }
   
    }
   
    return msg.wParam;
   
    }
   
    //****設計一個窗口類,類似填空題,使用窗口結構體*************************
   
    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);
   
    }
   
    //****初始化函數*************************************
   
    // 從文件加載位圖
   
    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;
   
    }
   
    //****自定義繪圖函數*********************************
   
    // 1.計算與顯示每秒畫面更新次數
   
    // 2.按照圖號順序進行窗口貼圖
   
    void MyPaint(HDC hdc)
   
    {
   
    char str[40] = “”;
   
    if(num == 7)
   
    num = 0;
   
    frame++;            //畫面更新次數加1
   
    if(tNow - tCheck >= 1000)               //tbw判斷此次繪圖時間由前一秒算起是否已經達到1秒鐘的時間間隔。若是,則將目前的‘frame’值賦給“fps”,表示這一秒內所更新的畫面次數,然后將“frame”值回0,并重設下次計算每秒畫面數的起始時間“iCheck”.
   
    {
   
    fps = frame;
   
    frame = 0;
   
    tCheck = tNow;
   
    }
   
    SelectObject(mdc,man[num]);         //選用要更新的圖案到mdc中,再輸出顯示每秒畫面更新次數的字符串到mdc上,最后將mdc的內容貼到窗口中。
   
    sprintf(str,“每秒顯示 %d個畫面”,fps);
   
    TextOut(mdc,0,0,str,strlen(str));
   
    BitBlt(hdc,0,0,600,450,mdc,0,0,SRCCOPY);
   
    tPre = GetTickCount();     //記錄此次繪圖時間,供下次游戲循環中判斷是否已經達到畫面更新操作設定的時間間隔。
   
    num++;
   
    }
   
    //******消息處理函數*********************************
   
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
   
    WPARAM wParam, LPARAM lParam)
   
    {
   
    int i;
   
    switch (message)
   
    {
   
    case WM_DESTROY:     //窗口結束消息
   
    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;
   
    }
   
    程序的運行結果如下圖:
posted on 2012-09-16 14:07 tbwshc 閱讀(120) 評論(0)  編輯 收藏 引用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            模特精品在线| 欧美日韩在线三级| 欧美激情亚洲综合一区| 久久久久久久久蜜桃| 久久久www| 欧美黑人在线观看| 亚洲欧洲精品一区二区三区波多野1战4 | 欧美一区二区精品| 久久aⅴ国产紧身牛仔裤| 久久久www成人免费毛片麻豆| 久久综合久久综合久久| 免费人成网站在线观看欧美高清| 欧美成人免费va影院高清| 欧美伦理91i| 国产精品中文在线| 亚洲国产精品精华液2区45| 一区二区三区日韩欧美| 久久精品女人| 亚洲国内自拍| 亚洲欧美日本另类| 免费日本视频一区| 国产欧美日本一区视频| 亚洲国产美女精品久久久久∴| 夜夜精品视频| 美女精品自拍一二三四| 一本久久a久久免费精品不卡| 久久精品欧美日韩精品| 欧美性开放视频| 亚洲精品日韩一| 久久久国产精品一区二区三区| 亚洲精品久久7777| 久久精品视频在线看| 国产精品久久久久久久午夜片 | 欧美色图五月天| 在线观看日韩av电影| 亚洲尤物在线| 亚洲国产精品www| 亚洲欧美日韩在线不卡| 欧美日韩国产美女| 亚洲国产日韩欧美在线图片| 欧美亚洲综合网| 国产视频在线观看一区二区三区 | 亚洲伦理在线免费看| 久久精品一区二区三区四区| av成人免费在线| 欧美激情精品久久久久久变态| 极品尤物久久久av免费看| 久久精品国产欧美激情| 亚洲在线观看视频| 国产精品久久久久永久免费观看| 亚洲精品你懂的| 欧美成人午夜免费视在线看片| 欧美一级欧美一级在线播放| 欧美性猛交一区二区三区精品| 亚洲国产一区二区三区高清| 久久久久久香蕉网| 久久成人18免费观看| 韩国一区电影| 久久在线观看视频| 久久久久九九九| 一区二区视频欧美| 欧美福利精品| 欧美成人资源| 最近看过的日韩成人| 亚洲国产小视频| 欧美11—12娇小xxxx| 亚洲三级影片| 日韩香蕉视频| 国产精品v亚洲精品v日韩精品| 亚洲性感美女99在线| 一本久道久久综合婷婷鲸鱼| 欧美视频在线一区二区三区| 亚洲欧美成人在线| 亚洲欧美在线一区| 黄色成人在线观看| 欧美韩日一区二区三区| 欧美精品色综合| 亚洲欧美激情四射在线日| 亚洲欧美国产高清| 亚洲国产精品女人久久久| 亚洲激情网站| 国产精品免费视频xxxx| 久久久青草婷婷精品综合日韩| 美女亚洲精品| 夜夜狂射影院欧美极品| 最近中文字幕mv在线一区二区三区四区 | 最近看过的日韩成人| 午夜精品久久久| 午夜精品福利在线观看| 国产一区二区三区日韩| 亚洲激情午夜| 国产欧美一区二区三区国产幕精品 | 欧美精品成人91久久久久久久| 中文精品一区二区三区| 91久久精品日日躁夜夜躁欧美| 欧美国产精品一区| 亚洲午夜久久久久久尤物 | 免费视频一区| 欧美图区在线视频| 麻豆国产精品va在线观看不卡| 欧美日韩精品在线播放| 久久全国免费视频| 欧美特黄a级高清免费大片a级| 久久av一区二区三区| 欧美精品一区二区三区在线播放 | 久久久久久午夜| 欧美成人精品不卡视频在线观看| 欧美激情四色| 国产精品美女999| 亚洲经典视频在线观看| 韩国成人理伦片免费播放| 一本色道婷婷久久欧美| 亚洲黄色免费| 久久国产福利| 欧美一区二区三区在线| 欧美性片在线观看| 亚洲日本视频| 亚洲国产精品久久久久| 欧美制服丝袜第一页| 亚洲主播在线播放| 欧美日韩日日骚| 亚洲二区三区四区| 尤物视频一区二区| 欧美在线观看一区二区| 亚洲欧美日韩中文视频| 欧美欧美天天天天操| 欧美韩日一区二区| 亚洲电影免费在线| 久久综合久久久| 久久成人精品无人区| 国产精品99一区| 亚洲精一区二区三区| 最新国产精品拍自在线播放| 久久9热精品视频| 你懂的国产精品| 亚洲电影专区| 亚洲校园激情| 欧美专区亚洲专区| 欧美视频一区二区三区…| 亚洲精品欧洲精品| 亚洲午夜精品视频| 欧美成人综合网站| 亚洲高清在线视频| 亚洲人成7777| 欧美激情国产日韩| 在线综合亚洲欧美在线视频| 亚洲视频自拍偷拍| 国产精品久久久一区麻豆最新章节| 亚洲精品免费在线播放| 欧美电影美腿模特1979在线看| 亚洲精品少妇30p| 欧美日韩国产精品自在自线| 黄色成人免费观看| 久色成人在线| 亚洲一区欧美激情| 午夜一区在线| 久久久久久成人| 久久免费高清| 亚洲激情另类| 亚洲一区二区三区777| 一级日韩一区在线观看| 欧美激情第8页| 欧美日韩综合在线| 在线播放豆国产99亚洲| 在线性视频日韩欧美| 久久亚洲影院| 亚洲在线视频一区| 欧美日韩不卡| 亚洲国产一区二区精品专区| 欧美一区二区三区久久精品 | 欧美一区二区国产| 久久se精品一区精品二区| 美女在线一区二区| 在线国产亚洲欧美| 亚洲欧美一区二区在线观看| 久久蜜桃精品| 欧美日韩国产经典色站一区二区三区| 亚洲欧美一区二区三区在线| 久久精品国产一区二区三区免费看 | 亚洲国产91| 欧美与黑人午夜性猛交久久久| 日韩午夜电影| 欧美精品不卡| 亚洲美女中文字幕| 亚洲欧美国产不卡| 久久美女性网| 亚洲国产精品视频| 久久精品国产精品 | 国产综合色在线| 美女主播视频一区| 亚洲国产精品视频一区| 欧美午夜精品久久久| 久久精品成人一区二区三区蜜臀 | 欧美亚洲尤物久久| 午夜精品视频在线| 一本色道久久88亚洲综合88| 亚洲国产欧美在线人成| 国产曰批免费观看久久久| 国产精品久久久久久模特 | 玖玖玖国产精品|