VC6.0 테트리스 만들기 – 벽돌(Shape)만들기

 

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;

}

 


Leave a Comment