[Visual C + +] 게임 프로 그래 밍 학습 노트 의 6: 다 중 배경 순환 애니메이션

본 시 리 즈 는 @ 2 품 몽상 가 장정 쓴 것 은 전재 할 때 출처 를 밝 혀 주 십시오.
이 글 링크:http://blog.csdn.net/terence1212/article/details/44264153
저자: ZeeCoder 웨 이 보 링크:http://weibo.com/zc463717263
내 메 일 박스:[email protected]   여러분 이 저 와 프로 그래 밍 소감 을 교류 하기 위해 메 일 을 보 내주 신 것 을 환영 합 니 다.
you are what you read!여러분 과 함께 격려 합 시다!
분할 선: ZeeCoder -------------------------------------------------------------
순환 배경 애니메이션
순환 배경 애니메이션 은 배경 그림 의 재단 과 연결 을 계속 한 다음 에 창 에 나타 나 는 배경 순환 스크롤 효 과 를 보 여 줍 니 다.이런 효 과 를 얻 으 려 면 접합 후 이음매 가 보이 지 않 는 배경 그림 이 필요 하 다.그 원 리 는 다음 과 같다.
【Visual C++】游戏编程学习笔记之六:多背景循环动画_第1张图片
위의 그림 에서 보 듯 이 재단 과 접합 과정: 먼저 왼쪽 그림 의 검은색 부분 을 재단 하여 오른쪽 그림 의 검은색 부분 에 붙 인 다음 에 왼쪽 그림 의 흰색 부분 을 재단 하여 오른쪽 그림 의 흰색 부분 에 붙인다.상기 절 차 를 반복 하면 순환 배경 애니메이션 을 완성 할 수 있 습 니 다.
2. 다 중 배경 순환 애니메이션
다 중 배경 순환 애니메이션 의 원 리 는 순환 배경 애니메이션 의 원리 와 같다. 그러면 다 중 배경 순환 애니메이션 에서 원근 차원 과 실제 시각 이동 효 과 를 얻 기 위해 배경 스티커 의 선후 순서 와 스크롤 순 서 를 결정 해 야 한다.
【Visual C++】游戏编程学习笔记之六:多背景循环动画_第2张图片
        위의 그림 은 최종 효과 그림 이다. 그림 에서 볼 수 있 듯 이 전체 애니메이션 은 네 가지 차원 으로 나 뉘 는데 그 다음은 하늘, 잔디, 섬, 인물 이다. 그 중에서 섬 과 인물 의 수요 이다.
투명 스티커 완성.배경의 굴 러 가 는 속 도 는 하늘 < 섬 > 잔디 순 이 었 다.인물 은 제자리 에서 뛰 어 다 니 면 앞으로 달 리 는 효 과 를 볼 수 있다.
3. 구체 적 실현
#include "stdafx.h"
#include "MulitBg.h"

#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst;								// current instance
TCHAR szTitle[MAX_LOADSTRING];					// The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];			// the main window class name
HDC hdc,mdc,bufdc;
HWND hWnd;
HBITMAP g_bg , g_island , g_walker;
DWORD g_tNow , g_tPre;
int g_x0 = 0 , g_x1 = 0 , g_x2 = 0 , g_x4 = 0 , g_num;
// Forward declarations of functions included in this code module:
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
void				MyPaint(HDC hdc);
//***************************   **********************************
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

 	// TODO: Place code here.
	MSG msg;

	// Initialize global strings
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_MULITBG, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// Perform application initialization:
	if (!InitInstance (hInstance, nCmdShow))
	{
		return FALSE;
	}

	// Main message loop:
	GetMessage(&msg , NULL , NULL , NULL);
	while (msg.message != WM_QUIT)
	{
		if ( PeekMessage( &msg , NULL ,0 ,0 ,PM_REMOVE))//PM_REMOVE        
		{	
			TranslateMessage( &msg);
			DispatchMessage(&msg);
		}
		else
		{
			g_tNow = GetTickCount();
			if (g_tNow - g_tPre >= 120)
			{
				MyPaint(hdc);
			}
		}
	}
	return (int) msg.wParam;
}

//***************************     **********************************
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MULITBG));
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_MULITBG);
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&wcex);
}
//***************************     **********************************
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HBITMAP bmp;
   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(_T("MulitBg"), _T("       "), WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   MoveWindow(hWnd , 10 , 10 , 800 ,600 ,true);
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   hdc = GetDC(hWnd);
   mdc = CreateCompatibleDC(hdc);
   bufdc = CreateCompatibleDC(hdc);

   bmp = CreateCompatibleBitmap(hdc , 800 , 600);
   SelectObject(mdc , bmp);

   g_bg  = (HBITMAP)LoadImage(NULL , _T("bg0.bmp") , IMAGE_BITMAP , 800 , 600 , LR_LOADFROMFILE);//  
   g_island = (HBITMAP)LoadImage(NULL , _T("bg.bmp") , IMAGE_BITMAP , 800 , 1200 , LR_LOADFROMFILE);//  

   g_walker = (HBITMAP)LoadImage(NULL , _T("1.bmp") , IMAGE_BITMAP , 968 , 258 , LR_LOADFROMFILE);//    

   MyPaint(hdc);
   return TRUE;
}

//***************************      **********************************
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;

	switch (message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// Parse the menu selections:
		switch (wmId)
		{
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_DESTROY:
		DeleteDC(mdc);
		DeleteObject(g_bg);
		DeleteObject(g_island);
		DeleteObject(g_walker);
		ReleaseDC(hWnd , hdc);
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
//***************************       *********************************

void MyPaint(HDC hdc)
{
	//     
	SelectObject(bufdc , g_bg);
	BitBlt(mdc , 0  , 0 , g_x0 , 370, bufdc , 800 - g_x0 , 0 , SRCCOPY);
	BitBlt(mdc , g_x0 , 0 , 800 - g_x0 , 370 , bufdc , 0 , 0 , SRCCOPY);

	//     
	BitBlt(mdc , 0 , 370 , g_x1 , 230 , bufdc , 800 - g_x1 ,370 , SRCCOPY);
	BitBlt(mdc , g_x1 , 370 , 800 - g_x1 , 230 , bufdc , 0 , 370 , SRCCOPY);

	//        
	SelectObject(bufdc , g_island);
	BitBlt(mdc , 0 , 0 , g_x2 , 600 ,bufdc , 800 - g_x2 , 600 , SRCAND);
	BitBlt(mdc , g_x2 , 0 , 800 - g_x2 , 600 , bufdc , 0 , 600 , SRCAND);
	BitBlt(mdc , 0 , 0 , g_x2 , 600 ,bufdc , 800 - g_x2 , 0 , SRCPAINT);
	BitBlt(mdc , g_x2 , 0 , 800- g_x2 , 600 ,bufdc , 0 , 0 , SRCPAINT);


	//        
	SelectObject(bufdc , g_walker);
	BitBlt(mdc , 250, 350 ,121 , 129 ,bufdc , g_num*121 , 129 , SRCAND);
	BitBlt(mdc ,250	,  350 , 121, 129 , bufdc , g_num*121 , 0 , SRCPAINT);

	//            
	BitBlt(hdc , 0 , 0 , 800 , 600 , mdc , 0 , 0 ,SRCCOPY);

	g_tPre = GetTickCount();//        

	g_x0 += 5 ; //          
	if ( g_x0 >= 800)
	{
		g_x0 = 0 ;
	}

	g_x1 += 20;//          
	if ( g_x1 >= 800)
	{
		g_x1 = 0 ;
	}

	g_x2 += 10 ;//          
	if (g_x2 == 800)
	{
		g_x2 = 0;
	}

	g_x4 += 5;
	if (g_x4 >= 800)
	{
		g_x4 = 0 ;
	}
	g_num ++;//        
	if (g_num == 8)
	{
		g_num = 0 ;
	}

}

필기 6 은 여기까지 쓰 겠 습 니 다.bitblt 를 이용 하여 애니메이션 디자인 을 하 는 기 교 는 이 노트 까지 끝났다.
가끔 책 을 뒤 져 보고 directX SDK 를 이용 하여 3D 게임 애니메이션 디자인 을 하지만 무엇 을 배 워 도 서 두 르 지 못 할 것 같 습 니 다. 마치 처음에 bitblt 라 고 생각 했 던 것 같 습 니 다.
수 는 매우 간단 하지만 정 작 코드 를 쓸 때 많은 문제 가 발생 할 수 있다 는 것 을 알 게 되 었 기 때문에 앞으로 의 학습 과정 에서 어떠한 간단 한 프로그램 도 소홀히 해 서 는 안 된다.
마지막 으로 그 몇 마디 입 니 다. 여러분 이 메 일 로 저 와 게임 프로 그래 밍 경험 을 교류 하 는 것 을 환영 합 니 다. 그리고 황소 들 이 아낌없이 가르쳐 주 셨 으 면 좋 겠 습 니 다.
---end
이 노트 코드 는 이미 업로드 되 었 습 니 다. 다운로드 환영: [Visual C + +] 게임 프로 그래 밍 학습 노트 의 6: 다 중 배경 순환 애니메이션 - 부대 코드

좋은 웹페이지 즐겨찾기