본문 바로가기
코스웨어

20140922 월요일 업무일지 출석번호10번 김화린

by 알 수 없는 사용자 2014. 9. 23.
728x90
반응형

<Windows API>

Game

1) 벽 뚫 막기!

case WM_KEYDOWN:

caMap[iY][iX] = ' ';

switch(wParam)

{

case VK_UP:

BM_Jola = BM_Jola_TYPE[BACK];

 

if(caMap[iY - 1][iX] != ' ')

{ break; }

--iY;

break;

 

case VK_DOWN:

BM_Jola = BM_Jola_TYPE[FRONT];

if(caMap[iY + 1][iX] != ' ')

{ break; }

++iY;

break;

 

case VK_RIGHT:

BM_Jola = BM_Jola_TYPE[RIGHT];

if(caMap[iY][iX +1] != ' ')

{ break; }

++iX;

break;

 

case VK_LEFT:

BM_Jola = BM_Jola_TYPE[LEFT];

if(caMap[iY][iX -1] != ' ')

{ break; }

--iX;

break;

}

caMap[iY][iX] = '@';

InvalidateRect(hWnd,NULL,TRUE); // reFresh

return 0;

... 이 상황에서;

if(caMap[iY][iX -1] != ' ') 이거나 if(caMap[iY][iX 1] == '*')

 

이거나 상관없음! 근데 나중에 박스 옮겨야 하는걸 생각해보면..

 

박스 생성

 

1- 변수 선언, 2- Wm_Create (로드로 적재) 3- wm_Destroy에서 파..

그림입니다.

원본 그림의 이름: CLP000006e00004.bmp

원본 그림의 크기: 가로 166pixel, 세로 20pixel

 그림입니다.

원본 그림의 이름: CLP000006e00002.bmp

원본 그림의 크기: 가로 458pixel, 세로 21pixel

그림입니다.

원본 그림의 이름: CLP000006e00003.bmp

원본 그림의 크기: 가로 575pixel, 세로 94pixel

 

 2) 특정 위치에 박스를 놓아야한다.

spot 생성

@, 가 이동하면서 ‘ ’ 을 생성하기 때문에 해당 자리가 지워진다.

1- 골뱅이 이동 할 경우에 원맵에서 #의 자리가 있으면 그걸 계속 새로 그려주는거

(이동할 때마다 복원)

2- 움직이는 애는 박스와 캐릭터 뿐이다.

그리거나 참고할때는 Stage를 쓰고 이동할때는 caMap 만 사용한다.

(현재 위치를 Stage에서 참조)

 

spot 이냐 아니냐에 따라서 확인해서 spot 의 위치는 Stage를 참조하고,

박스와 캐릭터는 caMap을 참조한다

3) 스테이지 생성

그림입니다.

원본 그림의 이름: CLP000006e00007.bmp

원본 그림의 크기: 가로 541pixel, 세로 188pixel

그림입니다.

원본 그림의 이름: CLP000006e00008.bmp

원본 그림의 크기: 가로 154pixel, 세로 17pixel <-- 요렇게

case WM_PAINT:

hdc = BeginPaint(hWnd,&ps);

MemDC = CreateCompatibleDC(hdc);

OldBitmap = (HBITMAP)SelectObject(MemDC, BM_Wall);

 

for(yCnt = 0; yCnt < 10 ;++yCnt)

{

for(xCnt = 0; xCnt < 13 ;++xCnt)

{

if( caStage[uiStage][yCnt][xCnt] == '*')

{

BitBlt(hdc,(X_SIZE * xCnt),(Y_SIZE * yCnt),X_SIZE,Y_SIZE,MemDC,0,0,SRCCOPY);

}

 

else if( caMap[yCnt][xCnt] == '@')

{

iX = xCnt;

iY = yCnt;

SelectObject(MemDC,BM_Jola);

BitBlt(hdc,(X_SIZE * xCnt),(Y_SIZE * yCnt),X_SIZE,Y_SIZE,MemDC,0,0,SRCCOPY);

SelectObject(MemDC,BM_Wall);

}

 

else if( caMap[yCnt][xCnt] == '+')

{

SelectObject(MemDC,BM_Box);

BitBlt(hdc,(X_SIZE * xCnt),(Y_SIZE * yCnt),X_SIZE,Y_SIZE,MemDC,0,0,SRCCOPY);

SelectObject(MemDC,BM_Wall);

}

 

else if( caStage[uiStage][yCnt][xCnt] == '#')

{

SelectObject(MemDC,BM_Spot);

BitBlt(hdc,(X_SIZE * xCnt),(Y_SIZE * yCnt),X_SIZE,Y_SIZE,MemDC,0,0,SRCCOPY);

SelectObject(MemDC,BM_Wall);

}

}

}

또한 PageUp/Down 키로 스테이지의 변화

case VK_PRIOR: //pageup

if(uiStage > 0)

{

--uiStage;

}

memcpy(caMap,caStage[uiStage],sizeof(caMap) );

InvalidateRect(hWnd,NULL,TRUE);

return 0;

 

case VK_NEXT: //pageDown

if(uiStage < STAGE_NUM -1)

{

++uiStage;

}

memcpy(caMap,caStage[uiStage],sizeof(caMap) );

InvalidateRect(hWnd,NULL,TRUE);

return 0;

}

 

4) 이제 중요한 스토리를 생각해보자.

- 게임은 경쟁인데, 박스를 저기에 가따놓는건 누구라도 한다. 그럼,

위의 게임에서의 스토리는 뭘까.

스테이지가 시작될 때 0, Spot에 박스가 도달했을 경우 까지 ++ 된다.

(마치 골프처럼)

 

1판은 스팟이 3

2판은 스팟이 4~~ 라는 식으로 난이도를 올리고

 

스팟과 박스의 위치가 다 일치하는지 스캔하는 함수를 만들어서 스테이지의

클리어를 체크! 하는 것이 최종적인 포인트이다.

 횟수, 클리어 조건 등등

 

횟수는

그림입니다.

원본 그림의 이름: CLP000006e0000b.bmp

원본 그림의 크기: 가로 421pixel, 세로 52pixel

클리어 조건에 대해서 생각해보자.

그림입니다.

원본 그림의 이름: CLP000006e0000d.bmp

원본 그림의 크기: 가로 124pixel, 세로 11pixel

그림입니다.

원본 그림의 이름: CLP000006e0000e.bmp

원본 그림의 크기: 가로 575pixel, 세로 156pixel

그림입니다.

원본 그림의 이름: CLP000006e0000f.bmp

원본 그림의 크기: 가로 635pixel, 세로 216pixel

단 하나라도 # + 가 일치하지 않는 경우에는 End_Game 변수는

False 가 된다. 모두 일치하여, true 가 된다고 가정하면,

해당 스테이지의 종료 절차를 시행한다.

 

728x90