===== 준비물 =====
- 우리는 플래피 버드 게임을 [[raylib:flappybird:다국어_지원하기|다국어 지원]]까지 해 보았다. 이 정도면 게임을 만들 수 있을 것이다.
- 이제 기존 플래피 버드 게임에서 메뉴와 세팅화면은 그대로 둔 채, 게임 클래스를 고쳐서 테트리스를 만들어 보자.
- 시작할 프로젝트 파일은 {{ :raylib:tetris:tetris.zip |테트리스 스타팅파일}}이다((로고 화면을 애미메이션으로 바꾸었다. [[https://github.com/raysan5/raylib/blob/master/examples/shapes/shapes_logo_raylib_anim.c|Raylib의 예제 중 로고 애니메이션]]을 그대로 베낀 것에 불과하다. ))
- 그 전에 [[raylib:정적_라이브러리_만들기|C / C++ 에서 정적라이브러리 만들기]]를 읽어보자. 여기에서 사용한 예제 파일을 기반으로 프로젝트를 시작할 것이다. 즉, 테트리스는 gui와 buttonActionMap을 a파일로 만든 후에 시작하는 것이다.
===== 그리드 만들기 =====
==== 1. 기초 개념 ====
테트리스는 가로 20열, 세로 40행 혹은 어느 임의의 수든 간에 그 정도의 배열을 가지고 그 안에 블록들이 어떻게 있는지를 판단한 후, 블록들이 한 줄에 있으면 그 한 줄을 지우는 게임이다.
여기서 그리드라는 개념이 등장한다. 각 배열의 원소에 대응하는 그림을 그리게 되는 것이다.
이렇게 2차원 배열로 그리드를 만들고 그 그리드에 대응하는 그림을 그리면 우리가 알고 있는 대부분의 타일 베이스 게임이 될 것이다.
따라서 그리드를 응용하면 2D 게임을 바로 만들 수 있다.
==== 2. 멤버 변수 선언하기 ====
game.h에 다음과 같이 멤버변수를 선언하자.
grid에 사용될 행의 갯수와 열의 갯수, 그리고 셀의 사이즈를 정하는 것이다.
그리고 컬러 값도 배열로 만들어서 숫자를 통하여 컬러 값을 정할 것이다.
private:
void Draw();
void Update();
void DrawBackground();
// 게임 패드
int gamepad = 0; // 제일 처음에 꽂은 게임패드만 사용하도록 하자. 제일 처음이므로 0이다.
// 테트리스 설정
int numCols; // 컬럼 갯수
int numRows; // 행의 갯수
int paddingX; // 화면 x 패딩
int paddingY; // 화면 y 패딩
int cellSize; // 셀의 크기
int backGrid[20][10]; // 그리드의 크기 20행 10열
// Color Pallette
Color colors[5] = {BLACK, RAYWHITE, DARKGREEN, YELLOW, RED};
가로 20 세로 10의 그리드 행렬에는 숫자값(int)을 저장한다. 이 숫자에 따라 해당 셀의 색상이 바뀌는 것이다.
0은 블랙, 1은 흰색, 2는 어두운녹색, 3은 노랑, 4는 빨강색으로 그려준다.
==== 3. game.cpp에 그리드 그려보기 ====
먼저 game 클래스가 생성될 때 각 값들을 초기화해야 한다.
=== 가. Game::Game() 메서드 ===
Game::Game()
{
numCols = 10;
numRows = 20;
paddingX = 100;
paddingY = 100;
cellSize = 30;
for (int i = 0; i < 20; i++)
{
for (int j =0; j < 10; j++)
{
backGrid[i][j] = 0;
}
}
backGrid[18][2] = 3;
backGrid[18][3] = 3;
backGrid[19][3] = 3;
}
그리드 전체를 0으로 하여 검은색으로 덮되, 맨 아래쪽 몇개는 노랑색이 나오게 해보았다.
=== 나. Draw메서드 ===
따로 DrawBackground()함수를 호출하게 한 후에, 그 DrawBackground()함수를 다음과 같이 만들었다.
void Game::DrawBackground()
{
ClearBackground(DARKBLUE);
for (int row = 0; row < numRows; row++)
{
for (int column = 0; column < numCols; column++)
{
int cellValue = backGrid[row][column];
DrawRectangle(paddingX + column * cellSize, paddingY + row*cellSize, cellSize - 5 , cellSize - 5 , colors[cellValue]);
}
}
}