개발/게임

SDL3(4) - CPP 버전1

슈케르 2025. 4. 28. 15:38
728x90

기존에 만들었던 C 버전의 테트리스를 CPP 버전으로 바꿔보자.

파일명은 기존에도 tetirs.cpp 였으니 파일명은 그대로 쓰고 내용물만 살짝쿵 바꾼다.

 

score 랑 remiainig blocks  표시 부분을 숫자와 문자로 표현해야하는데....

SDL3-ttf 를 따로 설치하지 않으면 text rendering이 안되는걸로 파악된다. 그래서

 

그냥 이렇게 픽셀로 숫자를 찍도록 구현하는걸로

void Tetris::draw_digit(int digit, int x, int y) {
    static const int font[10][5] = {
        {0b111, 0b101, 0b101, 0b101, 0b111}, // 0
        {0b010, 0b110, 0b010, 0b010, 0b111}, // 1
        {0b111, 0b001, 0b111, 0b100, 0b111}, // 2
        {0b111, 0b001, 0b111, 0b001, 0b111}, // 3
        {0b101, 0b101, 0b111, 0b001, 0b001}, // 4
        {0b111, 0b100, 0b111, 0b001, 0b111}, // 5
        {0b111, 0b100, 0b111, 0b101, 0b111}, // 6
        {0b111, 0b001, 0b001, 0b001, 0b001}, // 7
        {0b111, 0b101, 0b111, 0b101, 0b111}, // 8
        {0b111, 0b101, 0b111, 0b001, 0b111}  // 9
    };

    for (int dy = 0; dy < 5; dy++) {
        for (int dx = 0; dx < 3; dx++) {
            if (font[digit][dy] & (1 << (2 - dx))) {
                SDL_FRect pixel = { x + dx * 4, y + dy * 4, 3, 3 };
                SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
                SDL_RenderFillRect(renderer, &pixel);
            }
        }
    }
}

 

 

음.. 다 좋다.. 그런데, 버그가 있다.   음.. 귀찮다.

up key를 2번 누르면 뻑큐에서  ㄴ 으로 바뀐다. 

 

찾아보자... 

..

..

..

10분정도 걸렸다... 나이먹었나보다.

 

rotation 값이 이상하다.. -2가 나올 수 없지.. index는 0 ~ 3까지 4개여야된다. 

current, preview 의 block  초기화시 rotation을 0으로 초기화 해주면 될 것 같다.

 

 

 

Tetris::Tetris() {
    SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
    window = SDL_CreateWindow("Tetris C++", SCREEN_WIDTH, SCREEN_HEIGHT, 0);
    renderer = SDL_CreateRenderer(window, nullptr);

    srand(static_cast<unsigned>(time(nullptr)));
    current = { rand() % 7, 0, 3, 0 };
    next = { rand() % 7, 0, 3, 0 };

audio_manager.init();
audio_manager.play();
}

 

current, next 생성부분을 손좀 봐주자...

 

current.shape = rand() % 7 + 1;    
current.rotation = 0;
current.x = 3;
current.y = 0;

next.shape = rand() % 7 + 1;
next.rotation = 0;
next.x = 3;
next.y = 0;

 

요런식으로... 

rand() % 7 + 1  로 작성한 이유는 board 배열을 살펴보면된다.

배경(빈 공간)과 index 0번 도형(I) 가 같은 넘버를 사용하기때문에 일자 도형의 경우 정상 처리 되지 않는 버그가 또

있었다...

 

앞에 글을 안읽은 사람이 있을 수 있으니 다시 얘기하자면 이거는 C 로 작성한 원시 소스 코드는 chatGPT가 작성한거다.

이쉐끼가 이렇게 허접하게 짤 줄은 몰랐다~

 

암튼 여기까지 수정한 commit 은 아래를 보시라.....

 

오늘은 끝

 

https://github.com/kchhero/suker_vs_project/tree/master/tetris_cpp

728x90