보드 만들기 전에다른 작업을 하기 전에 벽돌그리는 부분을 함수화 하고 벽돌 모양도 좀더 깔끔하게 하자.
(앞으로 벽돌을 계속 그려야 하는데, 작업량이 많아질것을 대비해서 간단한 함수로 변경하자.)
void CWATTetrisView::DrawOneBlock(int y,int x,int iSize,CClientDC *pDC, COLORREF crRGB) {
pDC->FillSolidRect((x)*iSize, (y)*iSize, iSize, iSize, crRGB);
pDC->Draw3dRect((x)*iSize, (y)*iSize, iSize, iSize, RGB(255,255,255), RGB(255,255,255));
}
for(int tempY=0;tempY<4;tempY++)
{
for(int tempX=0; tempX<4; tempX++)
{
if (1 == g_NowBlockInfo[m_iNowBlockShape][m_iNowBlockDir][tempY][tempX])
{
DrawOneBlock(m_iNowBlockY+tempY,m_iNowBlockX+tempX,m_iOneBlockSize,&pDC,RGB(250,250,250));
}
else
{
// 벽돌이 아닌 곳을 회색으로 표시
DrawOneBlock(m_iNowBlockY+tempY,m_iNowBlockX+tempX,m_iOneBlockSize,&pDC,RGB(200,200,200));
}
}
}
보드 만들기
테트리스 게임을 하기 위해서는 일정한 크기의 보드가 있어야 한다.
보드는 어떤 식으로 정보를 가지고 있어야 하나?
제일 간단한 방법이 배열을 사용하는 것이다.
// 보드의 좌측 벽
for(int i=0;i<BOARD_Y_SIZE;i++){
g_BoardInfo[i][0]=50;
}
// 보드의 우측 벽
for( i=0;i<BOARD_Y_SIZE;i++){
g_BoardInfo[i][BOARD_X_SIZE+1]=50;
}
// 보드의 하단 벽
for( i=0;i<BOARD_X_SIZE+2;i++){
g_BoardInfo[BOARD_Y_SIZE][i]=50;
}
for(tempY = 0;tempY<BOARD_Y_SIZE+1;tempY++){
for(int tempX=0; tempX<BOARD_X_SIZE+2; tempX++)
{
if(0 != g_BoardInfo[tempY][tempX]){
DrawOneBlock((BOARD_Y_POS+tempY),BOARD_X_POS+tempX,m_iOneBlockSize,&pDC,RGB(200,200,200));
}
}
}
이제 뭔가 틀이 잡힌듯 하지만 아직 멀었다^^..

벽돌범위체크
키보드를 누르면 보드의 벽은 아무런 기능을 하지 않는다.
범위를 벗어나지 못하도록 추가하자.
왼쪽벽을 먼저 생각해 보자.
왼쪽 키보드를 눌렀을 때 벽돌이 왼쪽으로 이동하기 전에
왼쪽 벽과 걸리는지 안걸리는지를 체크해야 한다.
만약 벽과 걸린다면 이동하지 말아야하고
벽에 걸리지 않는다면 이동할수 있다.
이동할수 있는지 체크할수 있는 함수를 만들고
BOOL CWATTetrisView::CanMove(int iDir, int iCheckY,int iCheckX)
{
for (int iTempBlockY = 0;iTempBlockY<4;iTempBlockY++)
{
for (int iTempBlockX = 0;iTempBlockX<4;iTempBlockX++)
{
if(0 != g_BoardInfo[iCheckY+iTempBlockY][iCheckX+iTempBlockX] && 0 != g_NowBlockInfo[m_iNowBlockShape][iDir][iTempBlockY][iTempBlockX]){
return FALSE;
}
}
}
return TRUE;
}
BOOL CWATTetrisView::MoveLeft()
{
if(CanMove(m_iNowBlockDir,m_iNowBlockY,m_iNowBlockX-1)){
m_iNowBlockX -= 1;
Invalidate();
}
return TRUE;
}
BOOL CWATTetrisView::MoveRight()
{
if(CanMove(m_iNowBlockDir,m_iNowBlockY,m_iNowBlockX+1)){
m_iNowBlockX += 1;
Invalidate();
}
return TRUE;
}
BOOL CWATTetrisView::MoveUp()
{
if(CanMove((m_iNowBlockDir+1)%4,m_iNowBlockY,m_iNowBlockX)){
m_iNowBlockDir = (++m_iNowBlockDir)%4;
Invalidate();
}
return TRUE;
}

소스 : WATTetris_20071017.zip
.
안녕하세요! 8장되니깐 갑자기 하드코어로 돌변했네요.. 질문글이 없는거 보니깐 저만 그런가요? ㅠ
질문좀 드릴께요~~
1. iSize가 iOneBlockSize 인것 같은데요 초기화는 안해준것 같은데 어디서 해주셨나요?? 그냥 1인가요?
2. pDC->FillSolidRect((x)*iSize, (y)*iSize, iSize, iSize, crRGB); 에서 crRGB란 무슨말인가요?@_@
수고하시구요! 답변 기다리겠습니다 ^^