我正在编码一个游戏控制台,我将游戏地图保存在字符数组中,我需要在CMD
中将它们打印成彩色(具有不同的颜色),因此我编写了print_map
函数在这里,我用printf
打印,SetConsoleTextAttribute
使它们变成彩色螺母,这太慢了。我需要快速打印这些地图字符,所以请帮助我快速,彩色地打印它们。 / p>
void print_mapp(){
clear();//clear screen
int width,height,i,x,y;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
width = map_width;
height = map_height;
SetConsoleTextAttribute(hConsole,background_color);
x=4;
y=2;
for(i=0;i<width*(height+1);i++){
SetPosition(x,y);// set cursor to (x,y)
if(map[i] == ' '){
SetConsoleTextAttribute(hConsole,background_color);
printf("%c",map[i]);
}
else if(map[i] == wall){
SetConsoleTextAttribute(hConsole,wall_color);
printf("%c",map[i]);
}
else if(map[i] == solidblock){
SetConsoleTextAttribute(hConsole,solidblock_color);
printf("%c",map[i]);
}
else if(map[i] == moveblock){
SetConsoleTextAttribute(hConsole,moveblock_color);
printf("%c",map[i]);
}
else if(map[i] == deathblock){
SetConsoleTextAttribute(hConsole,death_blk_color);
printf("%c",map[i]);
}
else if(map[i] == character){
SetConsoleTextAttribute(hConsole,character_color);
printf("%c",map[i]);
}
else if(map[i] == rpoint){
SetConsoleTextAttribute(hConsole,rpoint_color);
printf("%c",map[i]);
}
else if(map[i] == target){
SetConsoleTextAttribute(hConsole,target_color);
printf("%c",map[i]);
}
else if(map[i] == object){
SetConsoleTextAttribute(hConsole,object_color);
printf("%c",map[i]);
}
else if(map[i] == opp){
SetConsoleTextAttribute(hConsole,opp_color);
printf("%c",map[i]);
}
else if(map[i] == bullet){
SetConsoleTextAttribute(hConsole,bullet_color);
printf("%c",map[i]);
}
else if(map[i] == '\n'){
SetConsoleTextAttribute(hConsole,background_color);
printf("%c",map[i]);
x = 3;
y++;
}
else{
SetConsoleTextAttribute(hConsole,wall_color);
printf("%c",map[i]);
}
x++;
}
}```
答案 0 :(得分:0)
我猜想每次对SetPosition()
和SetConsoleTextAttribute()
的调用都会导致stdout
被刷新。这样一来,您每打印char
就会刷新一次。
因此,您应该尝试仅在position或character属性不同于您期望的属性时调用它们。
使用fputc()而不是printf("%c", ..)
可能也会提供理论上的加速,但在实际中还不够重要。但是有些人(包括我在内)认为代码看起来更干净了……
因此,这是一个建议的改进:
void
set_attrib(HANDLE h, WORD attr, WORD *old_attr)
{
if (attr != *old_attr)
{
SetConsoleTextAttribute(h, attr);
*old_attr = attr;
}
}
void print_mapp()
{
clear();//clear screen
int width,height,i,x,y;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
width = map_width;
height = map_height;
WORD old_attr;
SetConsoleTextAttribute(hConsole,background_color);
old_attr = background_color;
x=4;
y=2;
SetPosition(x,y);// set cursor to (x,y)
for(i=0;i<width*(height+1);i++)
{
if(map[i] == ' '){
set_attr(hConsole, background_color, &old_attr);
fputc(map[i], stdout);
}
else if(map[i] == wall){
set_attr(hConsole, wall_color, &old_attr);
fputc(map[i], stdout);
}
....
else if(map[i] == '\n'){
set_attr(hConsole, background_color, &old_attr);
fputc(map[i], stdout);
x = 3;
y++;
SetPosition(x+1,y);// set cursor to (x,y)
}
else{
set_attr(hConsole, wall_color, &old_attr);
fputc(map[i], stdout);
}
x++;
}
}
其他提速建议:
SetConsoleTextAttribute()
print_mmap()
之后更改过的行一些清理建议(对速度没有明显影响)
fputc()
移动到if
和if else
之外map[i]
中有可打印的字符,只是enums
描述了游戏对象,并在单独的查找数组中查找了可打印的字符和属性。