이제 WATTetrisView.cpp 에서는 테스리스 게임에 관련된 정보가 필요 없기때문에
실제로 일을 할 CWATOneTetris 로 벽돌의 구조체를 이동
extern int g_NowBlockInfo[7][4][4][4]; // WATOneTetris.cpp에 선언
각각의 테스리스게임마다 보드 정보가 필요하기 때문에 벽돌정보의 변수를 CWATOneTetris로 복사
int m_BoardInfo[BOARD_Y_SIZE+1][BOARD_X_SIZE+2];
블럭 사이즈 결정함수를 추가하고,
void CWATOneTetris::SetBlockSize(int iData)
{
m_iOneBlockSize
= iData;
}
벽돌 그리기
벽돌을 하나 그리는 함수를 추가한다.
앞(WATTetrisView.cpp)의 함수를 다른 것을 알수 있다.
[여기에는 벽돌을 하나 그리더라도 보드의 x,y좌표가 따라 다닌다]
void CWATOneTetris::DrawOneBlock(int y, int x,
int iSize,
CClientDC *pDC, COLORREF crRGB)
{
pDC->FillSolidRect(m_iBoardX+(x)*iSize, m_iBoardY+(y)*iSize, iSize,
iSize,
crRGB);
pDC->Draw3dRect(m_iBoardX+(x)*iSize, m_iBoardY+(y)*iSize, iSize,
iSize,
RGB(255,255,255), RGB(255,255,255));
}
보드 그리기
보드를 그려보자.
벽돌 하나 그리는 함수가 변경되었으니, 당연히 보드 그리는 함수가 변경되었음을 알수 있다.
void CWATOneTetris::DrawBoard()
{
int tempX,tempY;
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
CWATTetrisView
*pView
= (CWATTetrisView *)pFrame->GetActiveView();
CClientDC pDC(pView);
// view 의 정보를 얻음
CPen penLine; // 사용할 pen 의 셋팅
CPen *OldPen; // 기존에 사용하던 설정으로 복구할 변수
penLine.CreatePen(0,3,RGB(0,0,0));
OldPen = pDC.SelectObject((&penLine));
CString strTemp;
strTemp.Format("ID = %d ",m_iGameID);
for(tempY
= 0;tempY<BOARD_Y_SIZE+1;tempY++){
for(tempX=0;
tempX<BOARD_X_SIZE+2; tempX++)
{
if(0
!= m_BoardInfo[tempY][tempX]){
DrawOneBlock((tempY),tempX,m_iOneBlockSize,&pDC,RGB(200,200,200));
}
}
}
pDC.SelectObject(OldPen); //
기존의 상태로 복구
}
view 클래스(WATTetrisView.cpp 파일)에서 작업한 것을 변경해 보자.
타이머
여러개의 테스리스 게임의 타이머를 어떻게 제어할 것인가?
모두 똑같은 타이머를 사용하면 간단하지만 게임이 경과된 후에도 게임의 속도가 모두 똑같아지기 때문에,
각각의 타이머를 사용해야 한다.
타이머는 View클래스의 타이머를 이용해야 한다.
0번 게임은 타이머 10번 사용
1번 게임은 타이머 11번 사용
5번 게임은 타이머 15번 사용
아래 그림처럼 시간이 지날수록 벽돌의 크기가 커짐을 알수 있다.
이제 각각의 테스리스마다 다른 타이머를 사용할수 있게 되었다.
이제 이 타이머를 이용하여 벽돌을 떨구면 될 것이다.
소스 : WATTetris_20071025.zip