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

tbwshc

tbw

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

常用鏈接

留言簿(4)

我參與的團(tuán)隊(duì)

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

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

    
    <4>注釋點(diǎn)4:if條件式中,“tPre”記錄前次繪圖的時(shí)間,而“tNow-tRre”則是計(jì)算上次繪圖到這次循環(huán)運(yùn)行之間相差多少時(shí)間。這里設(shè)置為若相差40個(gè)單位時(shí)間以上則再次進(jìn)行繪圖的操作,通過這個(gè)數(shù)值的控制可以調(diào)整游戲運(yùn)行的速度。這里設(shè)定40個(gè)單位時(shí)間(微秒)的原因是,因?yàn)槊扛?0個(gè)單位進(jìn)行一次繪圖的操作,那么1秒鐘大約重繪窗口1000/40=25次剛好可以達(dá)到期望值。
   
    由于循環(huán)的運(yùn)行速度遠(yuǎn)比定時(shí)器發(fā)出時(shí)間信號來得快,因此使用游戲循環(huán)可以更精準(zhǔn)地控制程序運(yùn)行速度并提高每秒鐘畫面重繪的次數(shù)。
   
    了解了游戲循環(huán)使用的基本概念之后,接下來的范例將以游戲循環(huán)的方法進(jìn)行窗口的連續(xù)貼圖,更精確地制作游戲動(dòng)畫效果。
   
    #include “stdafx.h”
   
    #include <stdio.h>
   
    //全局變量聲明
   
    HINSTANCE hInst;
   
    HBITMAP man[7];
   
    HDC  hdc,mdc;
   
    HWND    hWnd;
   
    DWORD   tPre,tNow,tCheck;                 //聲明三個(gè)函數(shù)來記錄時(shí)間,tPre記錄上一次繪圖的時(shí)間,tNow記錄此次準(zhǔn)備繪圖的時(shí)間,tCheck記錄每秒開始的時(shí)間
   
    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ù),程序入口點(diǎn)函數(shù)**************************************
   
    int APIENTRY WinMain(HINSTANCE hInstance,
   
    HINSTANCE hPrevInstance,
   
    LPSTR     lpCmdLine,
   
    int       nCmdShow)
   
    {
   
    MSG msg;
   
    MyRegisterClass(hInstance);
   
    //運(yùn)行初始化函數(shù)
   
    if (!InitInstance (hInstance, nCmdShow))
   
    {
   
    return FALSE;
   
    }
   
    GetMessage(&msg,NULL,NULL,NULL);   //感謝xiaoxiangp的提醒,需要在進(jìn)入消息循環(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)        //當(dāng)此次循環(huán)運(yùn)行與上次繪圖時(shí)間相差0.1秒時(shí)再進(jìn)行重繪操作
   
    MyPaint(hdc);
   
    }
   
    }
   
    return msg.wParam;
   
    }
   
    //****設(shè)計(jì)一個(gè)窗口類,類似填空題,使用窗口結(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”, “動(dòng)畫演示” ,
   
    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);
   
    //載入各個(gè)人物位圖
   
    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.計(jì)算與顯示每秒畫面更新次數(shù)
   
    // 2.按照圖號順序進(jìn)行窗口貼圖
   
    void MyPaint(HDC hdc)
   
    {
   
    char str[40] = “”;
   
    if(num == 7)
   
    num = 0;
   
    frame++;            //畫面更新次數(shù)加1
   
    if(tNow - tCheck >= 1000)               //tbw判斷此次繪圖時(shí)間由前一秒算起是否已經(jīng)達(dá)到1秒鐘的時(shí)間間隔。若是,則將目前的‘frame’值賦給“fps”,表示這一秒內(nèi)所更新的畫面次數(shù),然后將“frame”值回0,并重設(shè)下次計(jì)算每秒畫面數(shù)的起始時(shí)間“iCheck”.
   
    {
   
    fps = frame;
   
    frame = 0;
   
    tCheck = tNow;
   
    }
   
    SelectObject(mdc,man[num]);         //選用要更新的圖案到mdc中,再輸出顯示每秒畫面更新次數(shù)的字符串到mdc上,最后將mdc的內(nèi)容貼到窗口中。
   
    sprintf(str,“每秒顯示 %d個(gè)畫面”,fps);
   
    TextOut(mdc,0,0,str,strlen(str));
   
    BitBlt(hdc,0,0,600,450,mdc,0,0,SRCCOPY);
   
    tPre = GetTickCount();     //記錄此次繪圖時(shí)間,供下次游戲循環(huán)中判斷是否已經(jīng)達(dá)到畫面更新操作設(shè)定的時(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;
   
    }
   
    程序的運(yùn)行結(jié)果如下圖:
posted on 2012-09-16 14:07 tbwshc 閱讀(120) 評論(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>
            久久精品免费| 国产精品久久久久久久久免费 | 国产精品影音先锋| 欧美日韩亚洲三区| 欧美日韩一区二区三区在线| 欧美日韩色婷婷| 国产精品久久久久久久久免费樱桃 | 亚洲欧美日韩精品久久奇米色影视| 亚洲性感激情| 欧美一区高清| 欧美成人亚洲成人| 亚洲美女少妇无套啪啪呻吟| 一区二区高清视频在线观看| 亚洲免费人成在线视频观看| 久久精品免费看| 欧美精品激情blacked18| 国产精品久久国产精麻豆99网站| 国产视频久久久久| 亚洲作爱视频| 久久九九免费视频| 亚洲三级视频在线观看| 一个人看的www久久| 亚洲女人小视频在线观看| 久久婷婷久久| 国产精品理论片在线观看| 亚洲成色777777在线观看影院| 亚洲婷婷综合久久一本伊一区| 久久精品日韩欧美| 亚洲精品视频免费观看| 久久九九精品99国产精品| 欧美午夜免费| 亚洲精品美女久久7777777| 欧美激情综合五月色丁香| 国产精品人人做人人爽| 亚洲黄色在线| 久久激情综合| 一区二区三区四区国产| 久久三级福利| 国产一区二区日韩精品欧美精品| 夜夜夜久久久| 欧美福利一区二区三区| 亚洲欧美视频在线观看视频| 欧美激情综合五月色丁香| 激情综合自拍| 久久成人久久爱| av成人免费在线观看| 欧美顶级少妇做爰| 一区二区亚洲精品| 久久精品99无色码中文字幕| 中文av一区二区| 欧美日韩另类丝袜其他| 日韩天堂在线观看| 91久久视频| 欧美激情综合五月色丁香| 91久久综合亚洲鲁鲁五月天| 老司机精品视频一区二区三区| 午夜视频在线观看一区二区| 国产精品亚洲综合天堂夜夜| 亚洲制服av| 一区二区三欧美| 国产精品hd| 亚洲欧美日韩国产中文 | 一区二区三区波多野结衣在线观看| 美国十次了思思久久精品导航| 狠狠综合久久av一区二区小说| 久久精品国产久精国产爱| 先锋亚洲精品| 国语对白精品一区二区| 久久女同精品一区二区| 久久久精品五月天| 亚洲国产成人久久综合一区| 欧美激情精品久久久久| 欧美金8天国| 亚洲免费一级电影| 欧美一级理论性理论a| 激情另类综合| 亚洲高清资源综合久久精品| 欧美精品电影| 香蕉久久夜色| 久久伊人一区二区| 日韩一级裸体免费视频| 一区二区三区精品视频在线观看 | 久久综合国产精品| 亚洲欧洲视频在线| 亚洲深夜福利网站| 韩国一区二区在线观看| 欧美激情第9页| 国产精品激情| 欧美aaa级| 国产精品久久久久9999高清| 国产一区二区三区高清播放| 欧美成人综合| 国产精品伦子伦免费视频| 久久久成人网| 欧美精品综合| 久久精品视频免费| 欧美激情va永久在线播放| 亚洲欧美日韩高清| 久热精品视频在线观看一区| 亚洲天堂成人在线观看| 久久国产免费看| 一区二区免费在线播放| 久久av红桃一区二区小说| 99精品视频免费| 久久精品国产第一区二区三区| 日韩一二三区视频| 久久野战av| 久久精品人人做人人爽| 欧美性生交xxxxx久久久| 欧美成人亚洲成人| 国产一区二区三区久久悠悠色av| 亚洲欧洲精品一区| 狠狠综合久久| 午夜激情一区| 亚洲一区免费在线观看| 欧美电影电视剧在线观看| 久久久7777| 国产精品视频不卡| 亚洲精品免费一二三区| 在线不卡亚洲| 欧美专区福利在线| 午夜一区二区三区不卡视频| 欧美福利网址| 亚洲第一区色| 亚洲二区免费| 久久久人成影片一区二区三区观看 | 久久久久免费视频| 欧美一区二区在线免费播放| 欧美视频在线免费看| 亚洲国产日韩精品| 亚洲国产成人精品女人久久久| 欧美在线不卡视频| 欧美在线视频观看免费网站| 国产精品一区二区女厕厕| 中文在线一区| 亚洲免费视频在线观看| 欧美日韩亚洲激情| 99pao成人国产永久免费视频| 艳妇臀荡乳欲伦亚洲一区| 欧美激情一区二区三区全黄| 亚洲激情视频在线播放| 日韩亚洲不卡在线| 欧美日韩国产黄| 一区二区三区高清在线观看| 亚洲永久在线观看| 国产精一区二区三区| 午夜在线一区| 麻豆久久久9性大片| 亚洲高清电影| 欧美啪啪一区| 亚洲一区不卡| 久久一区二区三区国产精品 | 国产精品推荐精品| 午夜精品视频在线| 韩国av一区二区三区四区| 久久久久久一区二区| 欧美大片免费观看在线观看网站推荐| 亚洲国产精品嫩草影院| 欧美日韩一区二区在线播放| 亚洲在线视频一区| 狼狼综合久久久久综合网 | 久久精品观看| 精品二区久久| 欧美精品v日韩精品v国产精品 | 久久精品2019中文字幕| 欧美刺激午夜性久久久久久久| 日韩视频免费看| 国产精品日韩在线一区| 久久久久99| 99热在线精品观看| 久久精品伊人| 亚洲欧洲一区二区天堂久久 | 99精品热6080yy久久| 欧美一区二区在线视频| 亚洲高清自拍| 国产精品xnxxcom| 久久久美女艺术照精彩视频福利播放| 最新国产精品拍自在线播放| 欧美一区二区视频在线观看2020| 亚洲国产电影| 国产精品自在欧美一区| 欧美成人影音| 久久xxxx精品视频| 亚洲老司机av| 免费一级欧美片在线播放| 亚洲综合色丁香婷婷六月图片| 在线精品国精品国产尤物884a| 欧美日韩人人澡狠狠躁视频| 久久人人97超碰国产公开结果| 亚洲免费电影在线| 男女精品视频| 久久九九电影| 性久久久久久久久久久久| 亚洲精品免费在线播放| 激情欧美日韩一区| 国产精品视频yy9099| 欧美日韩国产影院| 欧美成人精精品一区二区频| 久久电影一区| 欧美制服第一页|