#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPSTR lpszClass="Heart";
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=(WNDPROC)WndProc;
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
112,84,800,600,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while(GetMessage(&Message,0,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
HBITMAP HBIBI;
BOOL JUMP;
int Gravity;
int move(int x)
{
x = x / 3;
return x;
}
void DrawBitmap(HDC hdc, int x, int y, HBITMAP hBit)
{
HDC MemDC;
HBITMAP OldBitmap;
int bx,by;
BITMAP bit;
MemDC=CreateCompatibleDC(hdc);
OldBitmap=(HBITMAP)SelectObject(MemDC, hBit);
GetObject(hBit,sizeof(BITMAP),&bit);
bx=bit.bmWidth;
by=bit.bmHeight;
BitBlt(hdc,x,y,bx,by,MemDC,0,0,SRCCOPY);
SelectObject(MemDC,OldBitmap);
DeleteDC(MemDC);
}
void DrawMan(HWND hWnd, HDC hdc, int x, int y, int k, HBITMAP hBit)
{
int bx;
int by;
HDC MemDC;
HBITMAP OldBitmap;
BITMAP bit;
MemDC=CreateCompatibleDC(hdc);
OldBitmap=(HBITMAP)SelectObject(MemDC, hBit);
GetObject(hBit,sizeof(BITMAP),&bit);
bx=bit.bmWidth;
by=bit.bmHeight;
bx = bx/3;
TransparentBlt(hdc,x,y,bx,by,MemDC,0+k,0, bx, by, RGB(255,0,0));
SelectObject(MemDC,OldBitmap);
DeleteDC(MemDC);
}
void OnKeyDown(WPARAM wParam, int yStart)
{
if(GetAsyncKeyState(VK_UP))
{
if(JUMP==FALSE)
{
JUMP=TRUE;
Gravity=300;
}
else if(JUMP==TRUE)
{
yStart-=(Gravity/20);
Gravity-=20;
if(Gravity<-300)
{
JUMP=FALSE;
}
}
}
}
void OnTimer(HWND hWnd, int xStart, int yStart, int ImageCH, HBITMAP MyMan, WPARAM wParam)
{
HDC hdc, hMemDC;
HBITMAP OldBit;
hdc=GetDC(hWnd);
if(HBIBI==NULL){
HBIBI=CreateCompatibleBitmap(hdc,30,60);
}
hMemDC=CreateCompatibleDC(hdc);
OldBit=(HBITMAP)SelectObject(hMemDC,HBIBI);
OnKeyDown(wParam, yStart);
DrawMan(hWnd, hdc, xStart, yStart, ImageCH, MyMan);
SelectObject(hMemDC,OldBit);
DeleteDC(hMemDC);
ReleaseDC(hWnd,hdc);
InvalidateRect(hWnd,NULL,FALSE);
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static HBITMAP MyBit, MyMan;
static int xStart=20;
static int yStart=480;
static int ImageCH=0;
RECT cr;
GetClientRect(hWnd, &cr);
switch(iMessage) {
case WM_CREATE:
MyBit=LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_BITMAP1));
MyMan=LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_BITMAP2));
SetTimer(hWnd,1,25,NULL);
return 0;
case WM_KEYDOWN:
switch (wParam){
case VK_LEFT:
if(xStart >= cr.left){
xStart = xStart - 10;
}
ImageCH = ImageCH + 50;
if(ImageCH>100)
{
ImageCH = 0;
}
break;
case VK_RIGHT:
if(xStart <= cr.right-50){
xStart = xStart + 10;
}
ImageCH = ImageCH + 50;
if(ImageCH>100)
{
ImageCH = 0;
}
break;
} return 0;
case WM_TIMER:
OnTimer(hWnd, xStart, yStart, ImageCH, MyMan, wParam);
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
DrawBitmap(hdc,0,0,MyBit);
DrawMan(hWnd, hdc, xStart, yStart, ImageCH, MyMan);
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
DeleteObject(MyBit);
DeleteObject(MyMan);
KillTimer(hWnd,1);
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
*** OnKeyDown을 OnTimer에 넣어놓구 VK_UP를 입력받으면 좌표를 변하게 해놓았습니다.
OnTimer가 타이머 함수라서 빠르게 계속 도는거 맞죠?
그런데 왜 점프 애니메이션이 구현이 안되나요? 좀 찾아주세요. 벌써 몇날몇일째 헤메고 있네요. ㅠㅠ