ダブルバッファリングと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を定義する必要があるそうです。。。。