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; } | 

 
	
		 


 
    
 
    
 
     

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