[英]C++ : Using background colors with clrscr()
我目前正在制作一个简单的游戏。 初始屏幕是欢迎屏幕,其中包含以下颜色:
system("color f3")//background:white , text:aqua
然后当我从main()
函数调用以下内容时
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;
}
没有声明system("color f3");
在我的display()
,背景为黑色,文本以白色突出显示,文本颜色为浅绿色。
我想知道为什么会发生上述情况。
问题:
用语句system("color f3");
调用clrscr()
,屏幕将变黑几毫秒,然后变成白色和浅绿色。
那么,如何在几毫秒内防止屏幕变黑?
感谢你的帮助:)
调用system()
,将在另一个进程中启动命令处理器,从而更改屏幕设置。
以后调用clrscr()
库清除将使用其在启动时存储的自己的颜色来清除屏幕。 这就是您遇到问题的原因。
您可以改为直接使用Windows控制台API ,例如函数SetConsoleTextAttribute()
:
#include <windows.h>
...
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
BACKGROUND_INTENSITY|FOREGROUND_BLUE);
注意:颜色和强度可以根据需要与|
组合|
。 在您的情况下,您可以简单地编写0xf3
顺便说一句, 这个SO问题显示了其他有趣的本机Windows控制台API函数。
由于您正在制作游戏,因此您想在游戏中编写自己的函数,而不必调用SYSTEM( )
。 它真的没有那么困难,这里是一个示例代码。
#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_);
}
调用system()函数可强制终端启动外部进程。 system()调用可能不是您想要的。 在Windows上的conio.h库或linux中的ncurses包中尝试一些功能。 它们具有更好的功能来更改文本和颜色。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.