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; } |
'스터디 > MFC 테트리스' 카테고리의 다른 글
[01]윈도우 프로그램 껍데기 만들기 (0) | 2011.01.05 |
---|---|
VC6.0 테트리스 만들기 – 보드(게임판 구성) (0) | 2011.01.01 |
VC6.0 테트리스 만들기 – 벽돌(Shape) 모양 (0) | 2010.12.31 |
VC6.0 테트리스 만들기 - OneBlock 구조 (0) | 2010.12.28 |
VC6.0 테트리스 만들기 - 구조 (0) | 2010.12.28 |