2015-05-24 5 views
1

В моей программе я пытаюсь создать прокручивающийся массив символов, у меня есть часть, которая позволяет ее прокручивать, но как я могу ее сделать, когда она уходит с карты, вместо того, чтобы спускаться по прямой , он сбрасывается. Возможно, вам придется попробовать свой код, чтобы понять, что я имею в виду. Кроме того, могу ли я сделать это, когда рамка контура не перемещается? Вот мой код:C++ Scrolling Char Array

#include <iostream> 
#include <windows.h> 
using namespace std; 

char movingPicture[6][55]; 

void text(int, int, int); 

int main() 
{ 
    int AxisX = 0; 
    memcpy (movingPicture, picture, sizeof(picture)); 
    while(true) 
    { 
     for (int y = 0; y < 6; y++) { 
      for (int x = 0; x < 55; x++) { 
       text(AxisX+x, 5+y, 15); cout << movingPicture[y][x]; } 
      } 
      AxisX++; 
      Sleep(50); 
    } 
} 

ответ

1

text(AxisX+x, 5+y, 15); cout << movingPicture[y][x];

Как о попытке

text((AxisX+x) % windowWidth, 5+y, 15); cout << movingPicture[y][x];

где windowWidth является количество символов отображаемая на строке вашего окна? Это должно привести к тому, что изображение будет перемещаться слева направо и так далее ...

+0

Спасибо, все работает отлично. Блестящая идея кода FYI! – Bryan

+0

Да :) остается вторым вопросом об установке конверта –

0

Для этой программы вы используете библиотеку windows.h, которая не полностью рекомендуется, так как код не может быть скомпилирован на машине Linux или Mac , Я не мог попробовать :(

Я мало знаю о текстовых интерфейсах, но я знаю, что такие вещи (движущиеся тексты и прочее) обычно решаются с использованием библиотеки NCurses, которая также является многоплатформенной.

0

Здесь вам нужно использовать другой подход, и я предлагаю сделать что-то похожее на то, как 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); 
} 
+0

Также стоит отметить, что это не сложно обобщить, но это, вероятно, касается того, где вы предпочитаете искать библиотеку, которая делает это. –