벽돌의 모양은 여러가지가 있는데, 그 정보를 어떤 식으로 보관을 하나?
가장 쉬운 방법은 배열로 표현하는 것이다.
벽돌의 정보를 (WATTetrisView.cpp파일에) 배열로 선언하고,
(1은 벽돌이 있는 부분이고, 0은 벽돌이 없는 부분이
int g_NowBlockInfo[4][4]={
{0,1,0,0},
{0,1,0,0},
{0,1,1,0},
{0,1,0,0}
};
이제부터 벽돌은 4x4의 배열이기 때문에 16곳을 '0'인지 '1'인지를 체크하여 화면에 표시해야 한다.
OnPaint함수 변경 - 무지 중요한 부분이다.
(이것만은 확실히 이해를 해야 한다.)
{
for(int tempX=0;
tempX<4;
tempX++)
{
if
(1 == g_NowBlockInfo[tempY][tempX])
{
pDC.FillSolidRect((m_iNowBlockX+tempX)*m_iOneBlockSize, (m_iNowBlockY+tempY)*m_iOneBlockSize,
m_iOneBlockSize, m_iOneBlockSize, RGB(250,250,250));
}else{
// 벽돌이 아닌 곳을 회색으로 표시
pDC.FillSolidRect((m_iNowBlockX+tempX)*m_iOneBlockSize, (m_iNowBlockY+tempY)*m_iOneBlockSize,
m_iOneBlockSize, m_iOneBlockSize, RGB(200,200,200));
}
}
}
이제부터 벽돌 테스트를 해야하는데 계속 벽돌 아래로 내려 가는데, 이제부터 벽돌이 바닥에 닿으면 다시 위에서 나올 것이다.
벽돌 회전
벽돌을 어떻게 회전 시킬까? 간단하다.
벽돌 모양을 가지고 있는 배열의 값을 회전시키면 된다.
(대략!! 아래처럼 회전 될 것이다.)
|
|
|
|
=> |
|
|
|
|
=> |
|
|
|
|
=> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
블럭의 배열이 3차원으로 바뀌었으니,
1. 벽돌 그려주는 함수도 바뀌어야 하고,
2. 벽돌 회전하는 함수도 추가해야 한다. (m_iNowBlockDir를 변수를 사용하겠다. 당연히 여기서 변수를 추가해야 하고 변수값을 초기화 해야 한다.)
벽돌 그리는 함수
for(int tempY=0;tempY<4;tempY++) { for(int tempX=0;
tempX<4;
tempX++) { if
(1 == g_NowBlockInfo[m_iNowBlockDir][tempY][tempX]) { pDC.FillSolidRect((m_iNowBlockX+tempX)*m_iOneBlockSize, (m_iNowBlockY+tempY)*m_iOneBlockSize, m_iOneBlockSize, m_iOneBlockSize, RGB(250,250,250)); }else{ // 벽돌이 아닌 곳을 회색으로 표시 pDC.FillSolidRect((m_iNowBlockX+tempX)*m_iOneBlockSize, (m_iNowBlockY+tempY)*m_iOneBlockSize, m_iOneBlockSize, m_iOneBlockSize, RGB(200,200,200)); } } }
벽돌회전함수 (회전은 UPKEY를 사용한다.)
{ m_iNowBlockDir = (++m_iNowBlockDir)%4; Invalidate(); return TRUE; }
소스 : WATTetris_20071015.zip
..
즉, 벽돌이 바닥(m_iNowBlockY 가 20인 위치)에 오면 다시 맨위(m_iNowBlockY=0)이 되는 위치부터
다시 시작하게 되는 겁니다.~~
조금이라도 이해가 안되시면 다시 글 올려 주세요 ^^.