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;
}


0 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ページ

Featured Posts