Здесь вам нужно использовать другой подход, и я предлагаю сделать что-то похожее на то, как 3D-графика выполняет этот тип операций.
Поскольку вы не хотите, чтобы ящик двигался, и вы не хотите, чтобы это сползало вниз, вы не должны писать в разные позиции каждый раз. Он скользит по экрану (и оставляет мусор на своем пути) из-за AxisX+x
. Вместо прокрутки, где идет выход, вам нужно прокрутить сам вывод.
Я сделал пример, который делает это. Во-первых, он записывает изображение в буфер того же размера, но смещается вдоль оси AxisX (для ясности я переименовал ее в AxisOffset). Это сделает прокрутку изображения, но сохранит вывод в том же месте.
Во-вторых, дополнительный цикл вокруг данных условно заполняет ячейки выходного буфера непрямыми ячейками второго изображения кадра. Это гарантирует, что кадр будет нарисован поверх изображения.
Помимо моего консольного курсора, раздражающе подпрыгивающего вокруг, что, по моему мнению, является ошибкой моего эмулятора консоли, это работает по вашему желанию.
#include <iostream>
#include <windows.h>
using namespace std;
int yMax = 6;
int xMax = 55;
char picture[6][55] = {
" ",
" .-. .-. .--. ",
" | OO| | OO| /_.-' .-. .-. .-. ",
" | | | | \\ `-. '-' '-' '-' ",
" '^^^' '^^^' `--' ",
" "
};
char frame[6][55] = {
"======================================================",
"x x",
"x x",
"x x",
"x x",
"======================================================"
};
char buffer[6][55];
void text(int, int, int);
int main()
{
int AxisOffset = 30;
while(true)
{
// Fill the buffer with scrolling image
for (int x = 0; x <= (xMax - AxisOffset - 1); x++)
{
for (int y = 0; y < xMax; y++)
{
buffer[y][x + AxisOffset] = picture[y][x];
}
}
for (int x = (xMax - AxisOffset); x < xMax; x++)
{
for (int y = 0; y < xMax; y++)
{
buffer[y][x - (xMax - AxisOffset)] = picture[y][x];
}
}
// Conditionally overlay the frame on top
for (int y = 0; y < yMax; y++)
{
for (int x = 0; x < xMax; x++)
{
if(frame[y][x] != ' ')
buffer[y][x] = frame[y][x];
}
}
// Flip buffer, essentially
for (int y = 0; y < yMax; y++)
{
for (int x = 0; x < xMax; x++)
{
text(x, 5 + y, 15);
cout << buffer[y][x];
}
}
AxisOffset++;
Sleep(50);
if(AxisOffset == xMax)
{
AxisOffset = 0;
}
}
}
void text(int x, int y, int color)
{
COORD cPos;
cPos.X = x;
cPos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cPos);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}
Спасибо, все работает отлично. Блестящая идея кода FYI! – Bryan
Да :) остается вторым вопросом об установке конверта –