/* スプライトの描画速度   2000/ 8/ 2 宍戸 輝光 */ #include #include #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); void Loop(void); LPBYTE lpBackPix,lpBuf,lpChr,lpParts[4],lpMapPix; LPBITMAPINFO lpbiBack,lpbiMap; RGBQUAD RGBs[256]; HDC hdcWin,hdcBack; HWND hwMain; HBITMAP hBack; BYTE byMap[15][15]; DWORD dwTime,dwTime2; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ MSG msg; WNDCLASSEX wndclass ; int i,j,k; wndclass.cbSize = sizeof(wndclass); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = NULL; wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "CWindow"; wndclass.hIconSm = NULL; RegisterClassEx (&wndclass); hwMain=CreateWindow ("CWindow",NULL, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,600,560, NULL,NULL,hInstance,NULL); lpBuf=(LPBYTE)GlobalAlloc(GPTR, (sizeof(BITMAPINFO)+255*sizeof(RGBQUAD))*2+32*32*5+480*480); lpbiBack=(LPBITMAPINFO)lpBuf; lpbiMap=(LPBITMAPINFO)(lpBuf+sizeof(BITMAPINFO)+255*sizeof(RGBQUAD)); lpChr=lpBuf+(sizeof(BITMAPINFO)+255*sizeof(RGBQUAD))*2; for (i=0;i<4;i++) lpParts[i]=lpChr+1024*(i+1); lpMapPix=lpParts[3]+1024; lpbiBack->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); lpbiBack->bmiHeader.biWidth=480; lpbiBack->bmiHeader.biHeight=480; lpbiBack->bmiHeader.biPlanes=1; lpbiBack->bmiHeader.biBitCount=8; lpbiBack->bmiHeader.biCompression=BI_RGB; lpbiMap->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); lpbiMap->bmiHeader.biWidth=480; lpbiMap->bmiHeader.biHeight=480; lpbiMap->bmiHeader.biPlanes=1; lpbiMap->bmiHeader.biBitCount=8; lpbiMap->bmiHeader.biCompression=BI_RGB; for (i=0;i<6;i++) /* カラーテーブル作成 */ for (j=0;j<6;j++) for (k=0;k<6;k++) { RGBs[i*36+j*6+k].rgbRed=i*51; RGBs[i*36+j*6+k].rgbGreen=j*51; RGBs[i*36+j*6+k].rgbBlue=k*51; } /* 作成したカラーテーブルをビットマップのカラーテーブルに設定 */ CopyMemory(lpbiBack->bmiColors,RGBs,256*sizeof(RGBQUAD)); CopyMemory(lpbiMap->bmiColors,RGBs,256*sizeof(RGBQUAD)); /* BITMAPINFOとウインドウのDCからDIBSectionを作成 */ hBack=CreateDIBSection (GetDC(hwMain),lpbiBack,DIB_RGB_COLORS,(void **)&lpBackPix,NULL,0); hdcBack=CreateCompatibleDC(GetDC(hwMain)); /* メモリDC を作成 */ SelectObject(hdcBack,hBack); /* メモリDC にビットマップを選択 */ /* マップパーツ描画 */ FillMemory(lpParts[0],32*32,0); FillMemory(lpParts[1],32*32,29); FillMemory(lpParts[2],32*32,64); FillMemory(lpParts[3],32*32,77); /* キャラクタ描画 */ for (i=0;i<16;i++) { FillMemory(lpChr+i*32+16-i,i*2,207); FillMemory(lpChr+(31-i)*32+16-i,i*2,171); } for (i=0;i<15;i++) for (j=0;j<15;j++) byMap[j][i]=rand() % 4; ShowWindow (hwMain,iCmdShow); /* ウインドウを表示 */ UpdateWindow (hwMain); dwTime=timeGetTime(); while (1) { /* メインループ */ if (PeekMessage (&msg,NULL,0,0,PM_NOREMOVE)) { if (!GetMessage (&msg,NULL,0,0)) /* メッセージ処理 */ return msg.wParam ; TranslateMessage(&msg); DispatchMessage(&msg); } else Loop(); /* 描画処理 */ Sleep(1); } } void Loop(void) { DWORD dwFrate; int i,j,k,x1,y1,x2,y2; BYTE byW; static char str[32]; static RECT rec={0,240,480,280}; /* マップパーツ移動 */ for (i=0;i<16;i++) { x1=rand() % 13+1; y1=rand() % 13+1; x2=x1+(rand() % 3)-1; y2=y1+(rand() % 3)-1; byW=byMap[x1][y1]; byMap[x1][y1]=byMap[x2][y2]; byMap[x2][y2]=byW; } for (i=0;i<15;i++) /* マップ用DIBにマップパーツをコピー */ for (j=0;j<15;j++) for (k=0;k<32;k++) CopyMemory(lpMapPix+j*32+(i*32+k)*480,lpParts[byMap[j][i]]+k*32,32); /* バックバッファにマップを描画 */ StretchDIBits(hdcBack,0,0,480,480,0,0,480,480, lpMapPix,lpbiMap,DIB_RGB_COLORS,SRCCOPY); for (i=0;i<128;i++) { /* キャラクタを描画 */ x1=rand() % 15; y1=rand() % 15; for (j=0;j<32;j++) for (k=0;k<32;k++) if (lpChr[k+j*32]!=0) lpBackPix[x1*32+k+(y1*32+j)*480]=lpChr[k+j*32]; } dwTime2=timeGetTime()-dwTime; dwTime=timeGetTime(); dwFrate=1000/dwTime2; wsprintf(str,"Frame Rate=%dFPS",dwFrate); DrawText(hdcBack,str,-1,&rec,DT_CENTER); InvalidateRgn(hwMain,NULL,FALSE); UpdateWindow (hwMain); // 再描画 } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch (iMsg) { case WM_PAINT: hdc=BeginPaint(hwnd,&ps); /* バックバッファを描画 */ BitBlt(hdc,8,8,480,480,hdcBack,0,0,SRCCOPY); break; case WM_DESTROY : /* 終了処理 */ DeleteDC(hdcBack); DeleteObject(hBack); GlobalFree(lpBuf); PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }