У меня проблема с мигающим экраном, и я знаю, что мне нужно использовать двойную буферизацию, чтобы исправить это, но я не знаю, как и где добавить это в мою игру. Если по какой-то причине я не могу его использовать, есть ли другой способ уменьшить мигание, потому что с большими картами становится хуже. Вот часть кода:
`const char HEIGHT=11, WIDTH=54;
unsigned char maze[HEIGHT][WIDTH]={
"##############################",
"# !# # ### ## #",
"# ### ### # !! ### ####### # GAME OF THRANS",
"# # ##### ## # !! # #",
"######## # ## # #### # # R-restart Q-quit",
"# ! # # # # # # # M-menu",
"### ## # ### # #! #### ######",
"# !# # ## # #### # # !! # W",
"# #### ## ## # # # #### # Controls: A-S-D",
"# ## # # #",
"##############################",
};
enemy1.x=14;
enemy1.y=7;
enemy2.x=22;
enemy2.y=9;
enemy3.x=10;
enemy3.y=3;srand(time (NULL));
while(on){
maze[ppy][ppx]=playerSprite;
maze[gpy][gpx]=goal;
maze[enemy1.y][enemy1.x]=enemy1.sprite;
maze[enemy2.y][enemy2.x]=enemy2.sprite;
maze[enemy3.y][enemy3.x]=enemy3.sprite;
for(int y=0; y<HEIGHT;y++){
cout<<endl;
for(int x=0;x<WIDTH;x++){
cout<<maze[y][x];
}
}
for(;;){
randNum=rand()%randNumMax+1;
cout<<endl;movement=getch();
switch (movement){
case'w':
if (maze[ppy-1][ppx]!='#' &&(maze[ppy-1][ppx]==' '||(maze[ppy-1][ppx]=='G','N','M','Y','!'))){
maze[ppy][ppx]=' ';
ppy--;
moves++;
if (maze[ppy][ppx]=='!'){
Beep(400,150);
points++;
}`
Вы не можете сделать «двойную буферизацию» в обычном смысле со стандартной консолью C ++ io. С графикой двойная буферизация традиционно означает выполнение всего вашего рендеринга в заэкранный задний буфер, а затем переключение его с передним буфером во время v-пробела, чтобы избежать мерцания. Нет ничего прямо эквивалентного этому для вывода на консоль в стандартном C ++.
Вы можете попробовать что-то «в духе» двойной буферизации. Создайте свою последнюю строку, используя stringstream
вместо вывода непосредственно в cout
а затем отобразить всю строку за один раз, используя одну запись в cout
, Это может уменьшить ваше мерцание.
Как примечание, вы, вероятно, хотите избежать использования endl
после каждой строки вашего вывода, поскольку он очищает выходной поток, что не то, что вы хотите. использование '\n'
вместо этого и использовать только endl
когда вы действительно хотите сбросить в конце своего «кадра».