- C/C++, WinAPI를 활용한 테트리스 게임
- OS: Windows 10
- IDE: Visual Studio 2017
- 개발기간: 2018.03.14 ~ 2018.03.16
- Enter키로 게임 시작
- ← → 방향키: 좌우 이동
- ↑ 방향키: 블럭 회전
- ↓ 방향키: 빠르게 이동
- 테트리스의 block과 block을 이루는 piece들은 GameObject를 상속받음, Tag로 구분
- 싱글톤 패턴으로 구현된 GameObjectManager는 게임 오브젝트들을 std::vector로 관리
- GameObjectManager는 게임 오브젝트를 등록할 때 게임 오브젝트 별로 id를 지정해줌 (id는 오브젝트 삭제 시 사용)
- WinAPI의 펜과 브러시를 편리하게 사용하기 위해 람다식과 functor를 사용
functor(function object) 추가 설명
- WinAPI에서 펜과 브러시를 사용하기 위해서는 핸들을 얻어야 하며,
- 메모리 누수를 막기 위해 반드시 핸들을 반환해야 한다.
- 이 과정은 실수를 유발할 수 있으므로, 핸들을 얻고 반환하는 과정을 하나의 함수로 묶는다.
- 하지만 핸들을 사용하는 작업은 그때그때 다르므로
- 함수의 인자로 행동(함수)을 넘겨주기 위해 functor를 사용했다.
<renderer.h>
struct PenWithBrush
{
PenWithBrush(int size, COLORREF penColor, COLORREF brushColor)
: size(size)
, penColor(penColor)
, brushColor(brushColor)
{}
void operator()(HDC hdc, function<void()> functor)
{
HPEN myPen, oldPen;
HBRUSH myBrush, oldBrush;
myPen = CreatePen(PS_SOLID, size, penColor);
oldPen = (HPEN)SelectObject(hdc, myPen);
myBrush = CreateSolidBrush(brushColor);
oldBrush = (HBRUSH)SelectObject(hdc, myBrush);
functor();
SelectObject(hdc, oldPen);
SelectObject(hdc, oldBrush);
DeleteObject(myPen);
DeleteObject(myBrush);
}
HDC hdc;
int size;
COLORREF penColor;
COLORREF brushColor;
};
<piece.cpp>
void Piece::render(HDC hdc)
{
PenWithBrush(1, RGB(255, 255, 255), _color)(hdc, [hdc, this]()
{
drawRect(hdc, (_x * RATIO) + GAP, (_y * RATIO) + GAP, RATIO - GAP, RATIO - GAP);
});
}
Game background image designed by Freepik