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