상하좌우 키를 이용하여 벽돌을 움직여 보자.
KEY와 관련된 함수는 OnKeyDown OnKeyUp PreTranslateMessage(MSG* pMsg)등 여러개가 있다.
여기서는 PreTranslateMessage(MSG* pMsg)을 사용할 것이다.
PreTranslateMessage(MSG* pMsg) 함수는
키보드 뿐 아니라 모든 메세지를 처리하는 함수이다.
앞에서 Classwizard를 이용하여 OnPaint() 함수를 생성한 것처럼 PreTranslateMessage()함수를 만든다.
KEY 관련 함수에서는 인자(파라미터)가 중요하다.
인자에는 눌러진키값, 반복되었는지 등에 대한 상태가 있기 때문이다.
일단 UP, DOWN, LEFT, RIGHT를 눌렀을 때, 각각의 메세지 박스를 나타내보자.
이제 벽돌을 움직여야 하는데, 벽돌의 위치를 나타내는 좌표가 필요할 것이다.
벽돌의 X 좌표를 m_iNowBlockX
벽돌의 Y 좌표를 m_iNowBlockY
라고 하겠다.
두 변수를 선언한후,
벽돌좌표를 변수로 바꾸어 나타내보자.
void CWATTetrisView::OnPaint() { CPaintDC dc(this); // device context for painting
CClientDC pDC(this); // 현재 화면의 정보를 얻음 CPen penLine; // 사용할 pen 의 셋팅 CPen *OldPen; // 기존에 사용하던 설정으로 복구할 변수 penLine.CreatePen(0,3,RGB(0,0,0)); OldPen = pDC.SelectObject((&penLine));
////////////////////////////////////////////////////////////////////////// // 실제 출력될 내용 // pDC.TextOut(10,10,"화면에 글씨 출력"); // pDC.Rectangle(100,100,150,150); // pDC.FillSolidRect(200,100,50,50,RGB(255,0,0)); m_iNowBlockX = 5; m_iNowBlockY = 4;
pDC.FillSolidRect(m_iNowBlockX*50, m_iNowBlockY*50, 50,50, RGB(250,250,250));
//////////////////////////////////////////////////////////////////////////
pDC.SelectObject(OldPen); // 기존의 상태로 복구 } |
하지만 좌표를 OnPaint()에 설정하면 항상 같은 좌표에 출력이 될것이다.
OnPaint()함수는 화면에 뿌려질때마다 실행되기 때문에 수시로(?)실행되는 함수로 생각하면 된다.
x,y 좌표를 초기화 할 때 250과 100 으로 한번만 셋팅하자.
변수를 직접 코딩하여 초기화 한다.
다시 원점으로 와서,
LEFT KEY 를 누르면 x좌표 감소
RIGHT KEY 를 누르면 x좌표 증가
UP KEY 를 누르면 y표 감소
DOWN KEY 를 누르면 y좌표 증가
PreTranslateMessage()를 수정하자.
OnPaint()안의 벽돌그리는 함수에서 벽돌의 크기를 변수로 바꾼다.
pDC.FillSolidRect(m_iNowBlockX*m_iOneBlockSize, m_iNowBlockY*m_iOneBlockSize, m_iOneBlockSize, m_iOneBlockSize, RGB(250,250,250)); |
?
키의 눌림 상태에 따라 흰색 벽돌이 움직이는 것을 볼수 있습니다.
예외 처리를 하지 않아서 벽돌이 윈도우 범위를 벗어날수도 있습니다.