2017年8月5日土曜日
背景色:青 文字色:黄の$が下へ落下していく
E:\goolgedrive\myprg_main\bcc\tetoris\consol_setcolor.cpp
背景色:青 文字色:黄の$が下へ落下していく
//windowsのコマンドプロンプトで、背景色、文字色を変える
//http://vivi.dyndns.org/tech/cpp/setColor.html
//ViVi Home > 技術文書 > さくさく理解できる C/C++ コンソールアプリ入門
//http://www3.nit.ac.jp/~tamura/pdf/tetris.pdf
//テトリスを作ろう
//上サイトのプログラムをwindowsで実現する
//最初に文字色を設定してその後背景色を設定すると、文字の周りだけ黒色になる
//一度の設定しないとダメ
//> 文字表示色指定(Win32)
#include <stdio.h>
#include <iostream>
#include <Windows.h>
using namespace std;
HANDLE hCons;
//関数定義
#define clearScreen() system("cls")
//色定義
#define BLACK 0x00
#define RED 0x0c //01100
#define GREEN 0x0a //01010
#define YELLOW 0x0e //01110
#define BLUE 0x09 //01001
#define MAGENTA 0x0d //01101
#define CYAN 0x0b //01011
#define WHITE 0x0f //01111
#define INTENSITY 0x08 //高輝度マスク 1000
#define RED_MASK 0x04 //赤色ビット 0100
#define GREEN_MASK 0x02 //緑ビット 0010
#define BLUE_MASK 0x01 //青ビット 0001
#define CHAR_DEFAULT 0x0f //01111
#define BACK_DEFAULT 0x00
// COL_INTENSITY からの最後の4つは色名ではなく、色の輝度、RGBを表すマスクビッ
// トだ。色は2進数の RGB の組み合わせで表される。赤は 0x04、緑は 0x02、青は
// 0x01 だ。 これらを組み合わせて8種類の色が作られる。例えば、赤と青を混ぜ
// ると 0x04 | 0x01 = 0x05 で紫となる。※ | はビット毎の OR 演算を表す。2
// 進数、16進数がよくわからない人はここを読んで勉強してね
/*
* http://d.hatena.ne.jp/s-kita/20100924/1285338966
* Win32API コンソールの前景色、背景色を設定する
*
* コンソールの文字色、背景色を変えるには SetConsoleTextAttribute(hCons, attr)
* を使う。
* hConsはコンソールスクリーンバッファのハンドル
* attrは文字色、背景色
*
* attr の値は wincon.h に定義されている以下のフラグの論理和により設定する
* #define FOREGROUND_BLUE 0x0001 // text color contains blue.
* #define FOREGROUND_GREEN 0x0002 // text color contains green.
* #define FOREGROUND_RED 0x0004 // text color contains red.
* #define FOREGROUND_INTENSITY 0x0008 // text color is intensified.
* #define BACKGROUND_BLUE 0x0010 // background color contains blue.
* #define BACKGROUND_GREEN 0x0020 // background color contains green.
* #define BACKGROUND_RED 0x0040 // background color contains red.
* #define BACKGROUND_INTENSITY 0x0080 // background color is intensified.
* #define COMMON_LVB_LEADING_BYTE 0x0100 // Leading Byte of DBCS
* #define COMMON_LVB_TRAILING_BYTE 0x0200 // Trailing Byte of DBCS
* #define COMMON_LVB_GRID_HORIZONTAL 0x0400 // DBCS: Grid attribute: top horizontal.
* #define COMMON_LVB_GRID_LVERTICAL 0x0800 // DBCS: Grid attribute: left vertical.
* #define COMMON_LVB_GRID_RVERTICAL 0x1000 // DBCS: Grid attribute: right vertical.
* #define COMMON_LVB_REVERSE_VIDEO 0x4000 // DBCS: Reverse fore/back ground attribute.
* #define COMMON_LVB_UNDERSCORE 0x8000 // DBCS: Underscore.
*
* #define COMMON_LVB_SBCSDBCS 0x0300 // SBCS or DBCS flag.
*
* 使用例
* 前景色を赤色に、背景色を緑色に設定する。
*
* #include <windows.h>
* #include <stdio.h>
*
* int main()
* {
* SetConsoleTextAttribute(
* GetStdHandle(STD_OUTPUT_HANDLE),
* FOREGROUND_INTENSITY | FOREGROUND_RED | BACKGROUND_GREEN);
* printf("Hello, World!\n");
* return 0;
* }
*/
//http://d.hatena.ne.jp/ono36/20080312/p1
//簡単3分プログラミング「コンソール出力でゲームを作る」
//任意の座標x、yに文字を出力できるよう位置決めする
void setPosition(int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(hCons, coord);
}
//文字色指定
void setCharColor(int col)
{
//APIに渡すアトリビュート
WORD attr = 0;
//高輝度ビットが立っていればアトリビュートを立てる
if(col & INTENSITY)
attr |= FOREGROUND_INTENSITY;
//以下のif文はcolに対して各ビットが立っているか調べその文字色を指定
//する。赤、緑、青以外の色は複数のビットが立つ事になるのだろう。
if(col & RED_MASK)
attr |= FOREGROUND_RED;
if(col & GREEN_MASK)
attr |= FOREGROUND_GREEN;
if(col & BLUE_MASK)
attr |= FOREGROUND_BLUE;
//色指定
SetConsoleTextAttribute(hCons, attr);
}
//、背景色指定
// windowsにとって背景色をxにするということは文字のまわりの四角部分をx色
// にするだけで、ほかの全体の色は黒のまm
// = ビット単位のOR代入演算子 しらんかった。!
void setBackColor(int bg)
{
WORD attr = 0;
if(bg & INTENSITY)
attr |= BACKGROUND_INTENSITY;
if(bg & RED_MASK)
attr |= BACKGROUND_RED;
if(bg & GREEN_MASK)
attr |= BACKGROUND_GREEN;
if(bg & BLUE_MASK)
attr |= BACKGROUND_BLUE;
SetConsoleTextAttribute(hCons, attr);
}
//文字色、背景色指定
// = ビット単位のOR代入演算子 しらんかった。!
void setColor(int fg, int bg)
{
WORD attr = 0;
if(fg & INTENSITY)
attr |= FOREGROUND_INTENSITY;
if(fg & RED_MASK)
attr |= FOREGROUND_RED;
if(fg & GREEN_MASK)
attr |= FOREGROUND_GREEN;
if(fg & BLUE_MASK)
attr |= FOREGROUND_BLUE;
if(bg & INTENSITY)
attr |= BACKGROUND_INTENSITY;
if(bg & RED_MASK)
attr |= BACKGROUND_RED;
if(bg & GREEN_MASK)
attr |= BACKGROUND_GREEN;
if(bg & BLUE_MASK)
attr |= BACKGROUND_BLUE;
SetConsoleTextAttribute(hCons, attr);
}
//背景色:青 文字色:黄の$が下へ落下していく
int main()
{
//コンソールハンドル取得
hCons = GetStdHandle(STD_OUTPUT_HANDLE);
int y;
//いったん全てを青にしてclearScreen()
//を実行すると全てが青になる
//そこで setColor(YELLOW, BLUE) を実行すると
//文字色のみ黄色となる
setColor(BLUE, BLUE);
//clearScreenを行わないと、上のsetColorが有効にならない
clearScreen();
for(y=1; y<23; y++)
{
setPosition(5, y);
//文字色を黄色にする
setColor(YELLOW, BLUE);
printf("$");
Sleep(100);//0.1秒待ち
fflush(stdout);
//setColor(BLUE, BLUE);
clearScreen();
}
setColor(CHAR_DEFAULT, BACK_DEFAULT);
//clearScreenを行わないと、上のsetColorが有効にならない
clearScreen();
getchar();
return 0;
}
int main2()
{
//コンソールハンドル取得
hCons = GetStdHandle(STD_OUTPUT_HANDLE);
setPosition(50, 100);
setCharColor(WHITE);cout << "white\t";
setCharColor(CYAN);cout << "cyan\t";
setCharColor(YELLOW);cout << "yellow\t";
setCharColor(GREEN);cout << "green\t";
setCharColor(RED);cout << "red\t";
setCharColor(BLUE);cout << "blue\t";
cout << "\n";
setColor(WHITE, BLACK);cout << "BG: dark-blue\t";
setColor(WHITE, BLUE);cout << "white\t";
setColor(CYAN, BLUE);cout << "cyan\t";
setColor(GREEN, BLUE);cout << "green\t";
setColor(RED, BLUE);cout << "red\t";
setColor(BLUE, BLUE);cout << "blue\t";
cout << "\n";
getchar();
//いったん全てを青にしてclearScreen()
//を実行すると全てが青になる
//そこで setColor(YELLOW, BLUE) を実行すると
//文字色のみ黄色となる
setColor(BLUE, BLUE);
clearScreen();
setColor(YELLOW, BLUE);
setPosition(5,10);
printf("hello!");
//setCharColor(YELLOW);
getchar();
clearScreen();
setCharColor(GREEN);
setPosition(5,30);
printf("hello!");
//printf直後に明示的にfflushで遅延なしに画面出力ざせている.
//fflush(stdout);
//setBackColor(BACK_DEFAULT);
//setCharColor(CHAR_DEFAULT);
getchar();
return 0;
}
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿