0

I am currently making a simple game. The initial screen is the welcome screen with the following for color:

system("color f3")//background:white , text:aqua

then when I invoke the following from my main() function

void display()
{

    Sleep(2000);
    clrscr();
    system("color f3");
    cout<<"Levels:\n\n";
    int d;
    cout<<"1.Easy\n";
    cout<<"2.Medium\n";
    cout<<"3.Hard\n";
    cout<<"4.Insane!\n";
    cout<<"Choose your difficulty:";
    cin>>d;
}

without the statement system("color f3"); in my display() the background is black, the text gets highlighted in white and the text color is aqua.

enter image description here

I want to know why the above happens.

Problem:

with the statement system("color f3"); when the clrscr() is invoked, the screen turns black for a few milliseconds and then turns to white and aqua.

So how to prevent the screen to turn black for those few milliseconds?

Thanks for all your help:)

Christophe
  • 68,716
  • 7
  • 72
  • 138
m0bi5
  • 8,900
  • 7
  • 33
  • 44

3 Answers3

3

When you call system(), you lauch a command processor in another process, which changes the screen settings.

When you later call clrscr() your library clears uses its own colors that it stored at startup to clear the screen. THis is why you experience the problem.

You could instead use directly windows console API, for example the function SetConsoleTextAttribute():

#include <windows.h>
...
   SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                        BACKGROUND_INTENSITY|FOREGROUND_BLUE); 

Note: The colors and intensity can be combined as needed with |. In your case you could simply write 0xf3

By the way, this SO question shows other native windows console API functions that could be of interest.

Community
  • 1
  • 1
Christophe
  • 68,716
  • 7
  • 72
  • 138
1

Since you're making a game, you'd want to write your own functions ingame and not have to call SYSTEM( ). its really not that difficult, heres an example code.

enter image description here

#include <windows.h> 
#include <iostream>

using namespace std;


void gotoxy(int x, int y);
void setcolor(WORD color);
void setForeGroundAndBackGroundColor(int ForeGroundColor,int BackGroundColor);
void clrbox(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,unsigned char bkcol);
void putbox(unsigned x,unsigned y,unsigned sx,unsigned sy,unsigned char col, unsigned char col2,unsigned char bkcol,char text_[]);
void box(unsigned x,unsigned y,unsigned sx,unsigned sy,unsigned char col,unsigned char col2,char text_[]);

void clrscr(); 

int main()
{
     setcolor(31);
     clrbox(1,1,79,23,33);
     gotoxy(10,12);

     setForeGroundAndBackGroundColor(2,14);
     cout<<" Hello world ";
     setcolor(7);
     gotoxy(1,23);

  return 0;
}







void gotoxy(int x, int y)
{
    COORD coord;
    coord.X = x; coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
    return;
}

void setcolor(WORD color)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);
    return;
}


//
//     colors:
//     0 = Black
//     1 = Blue
//     2 = Green
//     3 = Cyan
//     4 = Red
//     5 = Magenta
//     6 = Yellow
//     7 = LightGray
//     8 = DarkGray
//     9 = LightBlue
//     10 = LightGreen
//     11 = LightCyan
//     12 = LightRed
//     13 = LightMagenta
//     14 = LightYellow
//     15 = White



void setForeGroundAndBackGroundColor(int ForeGroundColor,int BackGroundColor)
{
   int color=16*BackGroundColor+ForeGroundColor;
   setcolor(color);
}



void clrscr()
{
    COORD coordScreen = { 0, 0 };
    DWORD cCharsWritten;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    DWORD dwConSize;
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    GetConsoleScreenBufferInfo(hConsole, &csbi);
    dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
    FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize, coordScreen, &cCharsWritten);
    GetConsoleScreenBufferInfo(hConsole, &csbi);
    FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten);
    SetConsoleCursorPosition(hConsole, coordScreen);
    return;
}

void clrbox(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,unsigned char bkcol)
{
    int x,y;
    setcolor(bkcol);                       //Set to color bkcol

    for (y=y1;y<y2;y++)                    //Fill Y Region Loop
    {
        for (x=x1;x<x2;x++)               //Fill X region Loop
        {
          gotoxy(x,y);cout<<" ";       //Draw Solid space
        }
    }
}


void box(unsigned x,unsigned y,unsigned sx,unsigned sy,unsigned char col,unsigned char col2,char text_[])
{  unsigned i,j,m;
    {

       m=(sx-x);                       //differential
       j=m/8;                          //adjust
       j=j-1;                          //more adjustment
       gotoxy(x,y);cout<<"É";       //Top left corner of box
       gotoxy(sx,y);cout<<"»";      //Top right corner of box
       gotoxy(x,sy);cout<<"È";      //Bottom left corner of box
       gotoxy(sx,sy);cout<<"¼";     //Bottom right corner of box

       for (i=x+1;i<sx;i++)
       {
          gotoxy(i,y);cout<<"Í";     // Top horizontol line
          gotoxy(i,sy);cout<<"Í";    // Bottom Horizontal line
       }

       for (i=y+1;i<sy;i++)
       {
          gotoxy(x,i);cout<<"º";     //Left Vertical line
          gotoxy(sx,i);cout<<"º";    //Right Vertical Line
       }

          gotoxy(x+j,y);cout<<text_; //put Title
          gotoxy(1,24);
    }
}

void putbox(unsigned x,unsigned y,unsigned sx,unsigned sy,
         unsigned char col, unsigned char col2,unsigned char bkcol,char text_[])
{
    clrbox(x,y,sx,sy,bkcol);
    box(x,y,sx,sy,col,col2,text_);
}
Software_Designer
  • 8,490
  • 3
  • 24
  • 28
0

Calling system() functions forces the terminal to launch an external process. system() calls may not be what you're looking for. Try some functions from the conio.h library on windows or the ncurses package in linux. They have much better functions for changing text and colors.

Mason Watmough
  • 495
  • 6
  • 19