[Visual C + +] 게임 프로 그래 밍 학습 노트 의 6: 다 중 배경 순환 애니메이션
7910 단어 C++애니메이션Visual게임 프로 그래 밍
이 글 링크:http://blog.csdn.net/terence1212/article/details/44264153
저자: ZeeCoder 웨 이 보 링크:http://weibo.com/zc463717263
내 메 일 박스:[email protected] 여러분 이 저 와 프로 그래 밍 소감 을 교류 하기 위해 메 일 을 보 내주 신 것 을 환영 합 니 다.
you are what you read!여러분 과 함께 격려 합 시다!
분할 선: ZeeCoder -------------------------------------------------------------
순환 배경 애니메이션
순환 배경 애니메이션 은 배경 그림 의 재단 과 연결 을 계속 한 다음 에 창 에 나타 나 는 배경 순환 스크롤 효 과 를 보 여 줍 니 다.이런 효 과 를 얻 으 려 면 접합 후 이음매 가 보이 지 않 는 배경 그림 이 필요 하 다.그 원 리 는 다음 과 같다.
위의 그림 에서 보 듯 이 재단 과 접합 과정: 먼저 왼쪽 그림 의 검은색 부분 을 재단 하여 오른쪽 그림 의 검은색 부분 에 붙 인 다음 에 왼쪽 그림 의 흰색 부분 을 재단 하여 오른쪽 그림 의 흰색 부분 에 붙인다.상기 절 차 를 반복 하면 순환 배경 애니메이션 을 완성 할 수 있 습 니 다.
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: 다 중 배경 순환 애니메이션 - 부대 코드
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Visual Studio에서 파일 폴더 구분 (포함 경로 설정)Visual Studio에서 c, cpp, h, hpp 파일을 폴더로 나누고 싶었습니까? 어쩌면 대부분의 사람들이 있다고 생각합니다. 처음에 파일이 만들어지는 장소는 프로젝트 파일 등과 같은 장소에 있기 때문에 파일...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.