Shape 벽돌의 기본 형태 만들기
Shape 는 벽돌의 기본 구조만 가지고 있고, 모양은 Shape를 상속해서 벽돌모양을 지정해야 합니다.
먼저 속성과 메소드를 알아보겠습니다.
| 
 속 성  | 
 형태  | 
 설 명  | 
| 
 m_ptOffsetDisplay  | 
 CPoint  | 
 화면에서의 벽돌의 출력 위치에 대한 옵셋(시작위치)  | 
| 
 m_ptPosition  | 
 CPoint  | 
 보드 내에서의 벽돌 위치  | 
| 
 m_iRotate  | 
 int  | 
 벽돌의 회전 값(0 ~ 3)  | 
| 
 m_iBlockSize  | 
 int  | 
 벽돌 한 칸의 가로 세로 사이즈  | 
| 
 m_rgbBlock  | 
 COLORREF  | 
 벽돌의 색상  | 
| 
 m_iOneBlock[4][4]  | 
 COneBlock  | 
 벽돌의 모양  | 
| 
 *m_pDC  | 
 CClientDC  | 
 출력디바이스  | 
| 
 메소드  | 
 리턴값  | 
 설 명  | 
| 
 DrawOneBlock(int y,int x,int iSize,CClientDC *pDC, COLORREF crRGB, COLORREF crLine=RGB(255,255,255));  | 
 void  | 
 Y,X좌표, 벽돌사이즈, 출력디바이스, 벽돌색상, 벽돌 테투리 색상으로 벽돌 한 칸을 출력하는 함수  | 
| 
 DrawBlock(CClientDC *pDC);  | 
 void  | 
 출력디바이스로 벽돌 출력  | 
| 
 DrawBlock();  | 
 void  | 
 벽돌 출력  | 
| 
 SetPDC(CClientDC *dc);  | 
 void  | 
 출력디바이스 설정  | 
| 
 SetOneBlocks(…)  | 
 void  | 
 벽돌의 모양 설정  | 
| 
 SetOffsetDisplay( CPoint _pt);  | 
 void  | 
 출력 offset 설정  | 
| 
 EarseBlock();  | 
 void  | 
 현재 벽돌 출력내용 지우기  | 
| 
 GetOneBlock(int s, int n)  | 
 COneBlock  | 
 벽돌 한 칸의 정보 얻기  | 
| 
 GetRotate();  | 
 int  | 
 현재 벽돌의 회전상태 얻어오기  | 
| 
 Copy(CShape *_s)  | 
 void  | 
 Shape 클래스 복사 함수  | 
| 
 ChangeRotate();  | 
 int  | 
 벽돌 회전상태 변경  | 
| 
 New();  | 
 void  | 
 벽돌 속성 초기화(벽돌 새로 생성)  | 
| 
 *GetY(int a[]);  | 
 int  | 
 벽돌의 Y 좌표 중 속해 있는 Y 좌표 얻기 -1 일 경우에는 무시  | 
| 
 MoveDown();  | 
 void  | 
 벽돌을 아래로 이동하기  | 
| 
 MoveLeft();  | 
 void  | 
 벽돌을 좌측으로 이동하기  | 
| 
 MoveRight();  | 
 void  | 
 벽돌을 우측으로 이동하기  | 
| 
 RotateCCW();  | 
 void  | 
 벽돌을 회전하기  | 
Shape 의 실제 구현
| 
 Shape.h  | 
| 
 
 #include "OneBlock.h" 
 class CShape { public: void RotateCCW(); void MoveRight(); void MoveLeft(); void MoveDown(); int *GetY(int a[]); void New(); int ChangeRotate(); void Copy(CShape *_s); int GetRotate(); COneBlock GetOneBlock(int s, int n); void EarseBlock(); void SetOffsetDisplay(CPoint _pt); void SetOneBlocks(int _iShape,COneBlock b[4]); void SetOneBlocks(int _iShape, COneBlock _a, COneBlock _b, COneBlock _c, COneBlock _d); 
 void SetPDC(CClientDC *dc); void DrawBlock(); void DrawBlock(CClientDC *pDC); void DrawOneBlock(int y,int x,int iSize,CClientDC *pDC, COLORREF crRGB, COLORREF crLine=RGB(255,255,255)) ; 
 CShape(); virtual ~CShape(); 
 protected: CPoint m_ptOffsetDisplay; // 화면에서의 벽돌의 출력 옵셋 CPoint m_ptPosition; // 보드 내에서의 위치 int m_iRotate; int m_iBlockSize; COLORREF m_rgbBlock; COneBlock m_iOneBlock[4][4]; CClientDC *m_pDC; 
 };  | 
| 
 Shape.cpp  | 
| 
 
 
 CShape::CShape() { m_ptOffsetDisplay = CPoint(0,0); this->New(); } 
 CShape::~CShape() { 
 } 
 void CShape::DrawBlock() { if(NULL ==m_pDC) return; DrawBlock(m_pDC); } 
 void CShape::DrawBlock(CClientDC *pDC) { for(int i=0;i<4;i++) { int y = m_iOneBlock[m_iRotate][i].iPosY + m_ptPosition.y + m_ptOffsetDisplay.y; int x = m_iOneBlock[m_iRotate][i].iPosX + m_ptPosition.x + m_ptOffsetDisplay.x; DrawOneBlock(y,x,m_iBlockSize,m_pDC,m_rgbBlock); 
 } } 
 void CShape::DrawOneBlock(int y,int x,int iSize,CClientDC *pDC, COLORREF crRGB, COLORREF crLine) { pDC->FillSolidRect((x)*iSize, (y)*iSize, iSize, iSize, crRGB); pDC->Draw3dRect((x)*iSize, (y)*iSize, iSize, iSize, crLine,crLine); } 
 void CShape::MoveDown() { EarseBlock(); m_ptPosition.y++; DrawBlock(); } 
 void CShape::MoveLeft() { EarseBlock(); m_ptPosition.x--; DrawBlock(); } 
 void CShape::MoveRight() { EarseBlock(); m_ptPosition.x++; DrawBlock(); 
 } 
 void CShape::RotateCCW() { EarseBlock(); this->m_iRotate = (++this->m_iRotate) % 4; DrawBlock(); } 
 void CShape::SetPDC(CClientDC *dc) { m_pDC = dc; 
 } 
 void CShape::SetOneBlocks(int _iShape, COneBlock b[]) { m_iOneBlock[_iShape][0] = b[0]; m_iOneBlock[_iShape][1] = b[1]; m_iOneBlock[_iShape][2] = b[2]; m_iOneBlock[_iShape][3] = b[3]; } 
 void CShape::SetOneBlocks(int _iShape, COneBlock _a, COneBlock _b, COneBlock _c, COneBlock _d) { m_iOneBlock[_iShape][0] = _a; m_iOneBlock[_iShape][1] = _b; m_iOneBlock[_iShape][2] = _c; m_iOneBlock[_iShape][3] = _d; } 
 void CShape::SetOffsetDisplay(CPoint _pt) { this->m_ptOffsetDisplay = _pt; } 
 void CShape::EarseBlock() { if(NULL ==m_pDC) return; 
 for(int i=0;i<4;i++) { int y = m_iOneBlock[m_iRotate][i].iPosY + m_ptPosition.y + m_ptOffsetDisplay.y; int x = m_iOneBlock[m_iRotate][i].iPosX + m_ptPosition.x + m_ptOffsetDisplay.x; DrawOneBlock(y,x,m_iBlockSize,m_pDC,RGB(0xC0,0xC0,0xC0),RGB(0xC0,0xC0,0xC0)); 
 } } 
 COneBlock CShape::GetOneBlock(int s, int n) { return m_iOneBlock[s][n]; } 
 int CShape::GetRotate() { return m_iRotate; } 
 void CShape::Copy(CShape *_s) { this->m_iRotate = _s->m_iRotate; this->m_iBlockSize = _s->m_iBlockSize; this->m_ptPosition = _s->m_ptPosition; memcpy(this->m_iOneBlock,_s->m_iOneBlock,sizeof(_s->m_iOneBlock)); 
 } 
 int CShape::ChangeRotate() { m_iRotate++; m_iRotate %= 4 ; return m_iRotate; } 
 void CShape::New() { m_ptPosition = CPoint(0,0); 
 m_iRotate = 0; m_iBlockSize = ONE_BLOCK_SIZE; m_rgbBlock = RGB(255,0,0); } 
 int *CShape::GetY(int a[]) { a[0]=-1; a[1]=-1; a[2]=-1; a[3]=-1; 
 for(int i=0;i<4;i++) { int y = m_iOneBlock[m_iRotate][i].iPosY + m_ptPosition.y ; 
 for(int i2=0;i2<4;i2++) { if(-1 ==a[i2]) { a[i2]= y; break; } else { if(a[i2] ==y) break; } } } return a; }  | 

	
		

    
    
     
shape.h 와 shape.cpp 를 구현하려면 헤더파일 하나랑 소스파일 하나 이렇게 해서 자기가 직접 선언해서
저걸 복사 붙이기 하면 되는건가요?