벽돌 그리기벽돌은 DrawBoard() 함수에서 보드와 함께 그려준다.
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));
// 현재 벽돌 그림
for(tempY=0;tempY<4;tempY++)
{
for( tempX=0;
tempX<4;
tempX++)
{
if
(0 != g_NowBlockInfo[m_iNowBlockShape][m_iNowBlockDir][tempY][tempX])
{
DrawOneBlock( m_iNowBlockY+tempY, m_iNowBlockX+tempX,m_iOneBlockSize,&pDC,RGB(250,050,250));
}
}
}
// 보드 그림
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); //
기존의 상태로 복구
}
벽돌 한칸씩 내리기OnTimer() 함수에서 벽돌을 한칸씩 내리면 된다.
void CWATOneTetris::OnTimer()
{
m_iNowBlockY
+=1;
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
CWATTetrisView
*pView
= (CWATTetrisView *)pFrame->GetActiveView();
DrawBoard();
pView->Invalidate(TRUE);
}
벽돌 제어하기키보드로 각 게임을 제어해야 한다. 그러기 위해서는 각각의 키값이 결정되어야 한다.
키값에 관련된 변수를 선언하고, 셋팅 함수를 만든다.
void CWATOneTetris::SetDefineKey(int left, int right,
int ro,
int down)
{
m_iDefineLeftKey = left;
m_iDefineRightKey = right;
m_iDefineRotateKey = ro;
// 회전
m_iDefineDownKey = down;
}
키값을 셋팅한다.
m_oneTetris[0].SetDefineKey('A','D','W','S');
m_oneTetris[1].SetDefineKey('G','J','Y','H');
m_oneTetris[2].SetDefineKey(VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN);
void CWATOneTetris::OnKey(int iKeyValue)
{
if( m_iDefineLeftKey
== iKeyValue){
m_iNowBlockX --;
}else if( m_iDefineRightKey == iKeyValue){
m_iNowBlockX ++;
}else if( m_iDefineRotateKey == iKeyValue){
m_iNowBlockShape ++;
}else if( m_iDefineDownKey == iKeyValue){
m_iNowBlockY ++;
}
}
각각의 클래스에서 키값을 보냄
m_oneTetris[0].OnKey(pMsg->wParam);
m_oneTetris[1].OnKey(pMsg->wParam);
m_oneTetris[2].OnKey(pMsg->wParam);
void CWATOneTetris::OnKey(int iKeyValue)를 자세히 코딩해야 한다.
BOOL CWATOneTetris::CanMove(int iDir, int iCheckY, int iCheckX)
{
for (int iTempBlockY = 0;iTempBlockY<4;iTempBlockY++)
{
for (int iTempBlockX = 0;iTempBlockX<4;iTempBlockX++)
{
if(0
!= m_BoardInfo[iCheckY+iTempBlockY][iCheckX+iTempBlockX] && 0 != g_NowBlockInfo[m_iNowBlockShape][iDir][iTempBlockY][iTempBlockX]){
return
FALSE;
}
}
}
return TRUE;
}
BOOL CWATOneTetris::MoveLeft()
{
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
CWATTetrisView
*pView
= (CWATTetrisView *)pFrame->GetActiveView();
if(CanMove(m_iNowBlockDir,m_iNowBlockY,m_iNowBlockX-1)){
m_iNowBlockX -= 1;
DrawBoard();
pView->Invalidate(TRUE);
}
return TRUE;
}
BOOL CWATOneTetris::MoveRight()
{
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
CWATTetrisView
*pView
= (CWATTetrisView *)pFrame->GetActiveView();
if(CanMove(m_iNowBlockDir,m_iNowBlockY,m_iNowBlockX+1)){
m_iNowBlockX += 1;
DrawBoard();
pView->Invalidate(TRUE);
}
return TRUE;
}
BOOL CWATOneTetris::Rotate()
{
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
CWATTetrisView
*pView
= (CWATTetrisView *)pFrame->GetActiveView();
if(CanMove((m_iNowBlockDir+1)%4,m_iNowBlockY,m_iNowBlockX)){
m_iNowBlockDir = (++m_iNowBlockDir)%4;
DrawBoard();
pView->Invalidate(TRUE);
}
return TRUE;
}
BOOL CWATOneTetris::MoveDown()
{
CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
CWATTetrisView
*pView
= (CWATTetrisView *)pFrame->GetActiveView();
if(CanMove(m_iNowBlockDir,m_iNowBlockY+1,m_iNowBlockX)){
m_iNowBlockY +=1;
DrawBoard();
pView->Invalidate(TRUE);
}
return TRUE;
}
void CWATOneTetris::OnKey(int iKeyValue)
{
if( m_iDefineLeftKey
== iKeyValue){
MoveLeft();
}else if( m_iDefineRightKey == iKeyValue){
MoveRight();
}else if( m_iDefineRotateKey == iKeyValue){
Rotate();
}else if( m_iDefineDownKey == iKeyValue){
MoveDown();
}
}
마지막으로 한줄이 완성되면 삭제하는 ChecknRemove()함수를 추가하면 된다.
(기존 함수 복사하여 사용하면 된다.)

소스 : WATTetris_20071025_1.zip