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

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 閱讀(124) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            亚洲美女中文字幕| 欧美在线看片a免费观看| 麻豆精品网站| 亚洲欧洲精品一区二区| 牛牛国产精品| 美女主播视频一区| 99pao成人国产永久免费视频| 亚洲国产精品久久久久婷婷老年| 另类av导航| 亚洲乱码国产乱码精品精98午夜| 亚洲开发第一视频在线播放| 欧美日韩精品在线| 欧美一区国产二区| 久久免费99精品久久久久久| 91久久久久久| 亚洲色诱最新| 国产视频一区二区在线观看| 美女精品视频一区| 欧美日韩国产在线看| 午夜日本精品| 免费成人av资源网| 亚洲一区国产视频| 久久久久久久999精品视频| 日韩视频―中文字幕| 亚洲深夜激情| 亚洲电影在线| 亚洲一区二区三区四区在线观看| 国产字幕视频一区二区| 亚洲国产岛国毛片在线| 国产精品亚洲不卡a| 鲁大师成人一区二区三区| 欧美另类视频在线| 久久婷婷久久一区二区三区| 欧美精品尤物在线| 久久躁日日躁aaaaxxxx| 欧美伦理在线观看| 裸体一区二区三区| 欧美三级网页| 亚洲高清在线精品| 国产一区二区福利| 一本不卡影院| 亚洲激情一区| 久久精品国产免费看久久精品| 亚洲美洲欧洲综合国产一区| 久久成人精品| 欧美一区二区观看视频| 欧美精品一卡二卡| 欧美成熟视频| 黄色成人在线网站| 午夜精品久久久久久久99热浪潮| 亚洲精选在线观看| 久久这里只有精品视频首页| 久久爱www久久做| 欧美亚州韩日在线看免费版国语版| 免费黄网站欧美| 国产在线成人| 午夜一区在线| 欧美一区网站| 国产精品美女www爽爽爽| 亚洲精品国产精品国产自| 玉米视频成人免费看| 欧美在线播放一区二区| 欧美一级二区| 国产伦精品一区二区三区免费迷| 国产精品99久久不卡二区| 夜夜夜久久久| 欧美日韩国产经典色站一区二区三区| 欧美二区在线播放| 91久久国产综合久久蜜月精品 | 欧美成人黑人xx视频免费观看| 国产欧美在线| 午夜亚洲性色福利视频| 久久精品国产99国产精品| 国产精品一二| 欧美伊人久久大香线蕉综合69| 久久黄色级2电影| 国产伦理精品不卡| 久久riav二区三区| 美女图片一区二区| 亚洲欧洲日本专区| 欧美精品在线观看一区二区| 亚洲精品欧美日韩专区| 亚洲性av在线| 国产啪精品视频| 久久九九国产| 欧美激情国产精品| 一区二区欧美在线观看| 欧美性感一类影片在线播放 | 亚洲第一视频网站| 99re热精品| 国产精品红桃| 久久久视频精品| 亚洲国产专区| 欧美一区二区视频在线观看2020 | 欧美午夜片欧美片在线观看| 亚洲一区二区在| 裸体丰满少妇做受久久99精品| 亚洲黄色毛片| 国产精品乱人伦中文| 久久久久久黄| av不卡在线| 久久一区免费| 一区二区三欧美| 韩国亚洲精品| 欧美四级剧情无删版影片| 欧美一区午夜精品| 亚洲精品国产精品国产自| 欧美一区二视频| 日韩视频在线观看国产| 国产日本欧美在线观看| 欧美成人中文| 久久超碰97中文字幕| 日韩视频精品| 欧美刺激性大交免费视频| 亚洲一区在线观看视频 | 国产精品亚洲网站| 男同欧美伦乱| 欧美中文字幕精品| 一区二区三区四区五区视频| 欧美+亚洲+精品+三区| 午夜亚洲一区| 一区二区三区四区国产| 亚洲成人在线免费| 国产日韩在线不卡| 欧美亚州韩日在线看免费版国语版| 久久综合导航| 久久色在线观看| 欧美一区二区视频网站| 一区二区三区视频观看| 亚洲清纯自拍| 亚洲国产欧美日韩| 欧美激情 亚洲a∨综合| 久久久欧美精品| 欧美在线网址| 午夜精品福利在线观看| 宅男精品导航| 一本色道久久| 一个色综合av| 日韩视频亚洲视频| 亚洲毛片在线观看| 亚洲欧洲一区二区三区久久| 精品1区2区3区4区| 精品69视频一区二区三区| 国产亚洲激情视频在线| 国产欧美日韩亚洲| 国产精品在线看| 国产伪娘ts一区| 国产一区二区三区奇米久涩| 国产日本欧美一区二区三区在线 | 国产精品久久久一区麻豆最新章节 | 亚洲在线一区二区| 六月丁香综合| 日韩天堂av| 国产欧美日韩一级| 久久久午夜视频| 久久亚洲春色中文字幕| 久久影视精品| 欧美精品18| 欧美日韩精品欧美日韩精品一| 欧美日韩国产成人在线| 欧美久久综合| 国产精品v欧美精品v日韩 | 一本色道久久综合精品竹菊| aa亚洲婷婷| 欧美亚洲免费| 久久在线精品| 欧美日韩黄色大片| 国产精品另类一区| 狠狠色丁香婷婷综合影院| 在线播放亚洲一区| av成人免费在线观看| 亚洲女人天堂成人av在线| 久久成人免费| 欧美激情免费在线| 一区二区高清视频在线观看| 亚洲欧美日韩人成在线播放| 久久国产高清| 欧美日韩国产在线| 国产亚洲精品美女| 亚洲欧洲精品成人久久奇米网| 亚洲图片欧洲图片av| 久久天天躁夜夜躁狠狠躁2022| 欧美激情精品久久久久久蜜臀| 艳妇臀荡乳欲伦亚洲一区| 羞羞答答国产精品www一本| 欧美二区视频| 国产女人精品视频| 亚洲欧洲日产国产综合网| 欧美亚洲视频| 亚洲黄色三级| 欧美在线高清视频| 欧美日韩一区在线| 亚洲成人在线视频网站| 亚洲综合不卡| 亚洲黄色在线观看| 欧美在线观看一区二区三区| 欧美日韩天天操| 1000部国产精品成人观看| 欧美一区二区免费观在线| 亚洲丶国产丶欧美一区二区三区|