0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ダブルバッファリングでテトリスの画面のちらつきを抑える

Posted at

ダブルバッファリングとsystem("cls")の違いについて

少し理解ができた気がするので忘備録として書いておこうと思います。

system(cls)はコンソール画面上でクリアするのに対し、ダブルバッファリングでは見えないところで今まで保存されていた値をクリアするという違いがあると分かりました
なので画面のちらつきは最小限に抑えられるという理由もわかります。

コードブロック

tetris.c

void DrawScreen() {
    // バックバッファをクリア
    memset(backBuffer, 0, sizeof backBuffer);

    // 枠の描画
    for (int y = 0; y < FIELD_HIGHT + 2; y++) {
        backBuffer[y][0] = 1;                     // 左枠
        backBuffer[y][FIELD_WIDTH + 1] = 1;       // 右枠
    }
    for (int x = 0; x < FIELD_WIDTH + 2; x++) {
        backBuffer[FIELD_HIGHT + 1][x] = 1;       // 下枠
    }

    // フィールドの描画
    for (int y = 0; y < FIELD_HIGHT; y++) {
        for (int x = 0; x < FIELD_WIDTH; x++) {
            if (field[y][x]==1) {
                backBuffer[y + 1][x + 1] = 1;
            }
        }
    }

    // テトリミノの描画
    for (int y = 0; y < mino.shape.hight; y++) {
        for (int x = 0; x < mino.shape.width; x++) {
            if (mino.shape.patterm[y][x]==1) {
                backBuffer[mino.y + y + 1][mino.x + x + 1] = 1;
            }
        }
    }

    // バックバッファの内容をコンソールに出力
    for (int y = 0; y < FIELD_HIGHT + 2; y++) {
        for (int x = 0; x < FIELD_WIDTH + 2; x++) {
            if (backBuffer[y][x]==1)
                printf("■");
            else printf(" ");
        }
        printf("\n");
    }
}


memset(backBuffer, 0, sizeof backBuffer);ここが一番大事
この部分が冒頭でも言ったように見えないところで内容をクリアしていることに当たります。

あと配列には全角文字の■は入らないので条件分岐で出力することもポイントです。

field配列は20×10、これをすっぽり入れるために(枠線を考慮して)backBufferは22×12を定義する必要があるそうです。。。。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?