본문 바로가기
C & C++/MFC Media

배경 이미지 연속적으로 돌리기

by izen8 2011. 4. 28.
반응형

배경 연속적으로 돌리기

한 비트맵의 이미지로 마치 배경이 움직이는 듯한 스크롤을 구현..

간단한 슈팅게임을 만들때 배경이 연속적으로 움직이면서 좀더 멋진 화면이 나타날수 있다...  (비트맵이 좀 괜찮다면....)

그대신 스크롤 될때 좀 이어지는 비트맵이어야 이쁘게 나온다...  간단한 게임상에서는 뒤에 파란배경을 출력하고 구름 이미지를 연속적으로 돌려도 괜찮은 화면이 나온다.

 

배경이미지가 640 x 480 사이즈의 back.bmp 라고 한다면...

 

 

LRESULT CALLBACK WndProc( HWND hWnd, UINT message,
                                        WPARAM wParam, LPARAM lParam )
{
     static HDC hdc, MemDC, hBackDC;
     HBITMAP hbitmap, oldbitmap, hbackbitmap, oldbackbitmap;
     PAINTSTRUCT ps;
     RECT rt;
     static bx = 0;
 
     switch( message )
     {
     case WM_CREATE:
          hdc = GetDC(hWnd);
   
          MemDC = CreateCompatibleDC(hdc);
          hbitmap  = (HBITMAP)LoadImage(NULL, ".\\back.bmp", IMAGE_BITMAP,
                                                    NULL, NULL, LR_DEFAULTSIZE | LR_LOADFROMFILE);
          oldbitmap = (HBITMAP)SelectObject(MemDC, hbitmap);


          hBackDC = CreateCompatibleDC(hdc);
          hbackbitmap = CreateCompatibleBitmap(hdc, 640, 480);
          oldbackbitmap = (HBITMAP)SelectObject(hBackDC, hbackbitmap);

  

          ReleaseDC(hWnd, hdc);
          return 0 ;
     case WM_PAINT:
          hdc = BeginPaint(hWnd, &ps);
          Rectangle(hBackDC, 0, 0, 640, 480);
          // 같은 이미지 두개를 이어서 출력하는 원리이다. 이 두개가 스크롤되면서 자연스럽게 뒤에 붙게된다..
          SetRect(&rt, bx, 0, 640, 480);
          BitBlt(hBackDC, 0, 0, rt.right, rt.bottom, MemDC, rt.left, 0, SRCCOPY);
  
          SetRect(&rt, 0, 0, bx, 600);
          BitBlt(hBackDC, 640 - bx, rt.top, rt.right, rt.bottom, MemDC, 0, 0, SRCCOPY);


          if(bx >= 640)   bx = 0;
          else              bx += 5;

 

          BitBlt(hdc, 0, 0, 640, 480, hBackDC, 0, 0, SRCCOPY);
          EndPaint(hWnd, &ps);
          Sleep(20);
          InvalidateRect(hWnd, NULL, FALSE);
          return 0;

     .........................

     }

     return 0 ;

}

 

bx 값을 이용하여 배경을 연속적으로 돌릴수 있다.

 

반응형

댓글