Почему моя анимация ASCII продолжает прокручивать вниз вместо того, чтобы обновляться на консоли Windows (C ++)?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему моя анимация ASCII продолжает прокручивать вниз вместо того, чтобы обновляться на консоли Windows (C ++)?

Сообщение Anonymous »

Я пытаюсь создать простую анимацию ASCII 3D Spinning Cube Cube в консоли Windows, используя C ++. < /p>
Рендеринг работает нормально, но есть одна важная проблема:
Каждый кадр напечатает ниже предыдущего, поэтому терминал поддерживает скромный, вместо того, чтобы обновляться на месте, как нормальная анимация.#include
#include
#include
#include
#include
using namespace std;

const int WIDTH = 80;
const int HEIGHT = 40;
const float cubeWidth = 20;

float A = 0, B = 0, C = 0;
float distanceFromCamera = 100;
float K1 = 40;

char buffer[WIDTH * HEIGHT];
float zBuffer[WIDTH * HEIGHT];

float cosA, sinA, cosB, sinB, cosC, sinC; // biến lượng giác dùng chung

void gotoxy(HANDLE hConsole, int x, int y) {
COORD pos{(SHORT)x, (SHORT)y};
SetConsoleCursorPosition(hConsole, pos);
}

void rotate(float i, float j, float k, float &x, float &y, float &z) {
// rotation quanh 3 trục
float x1 = i;
float y1 = j * cosA - k * sinA;
float z1 = j * sinA + k * cosA;

float x2 = x1 * cosB + z1 * sinB;
float y2 = y1;
float z2 = -x1 * sinB + z1 * cosB;

x = x2 * cosC - y2 * sinC;
y = x2 * sinC + y2 * cosC;
z = z2;
}

void calculatePoint(float i, float j, float k, char ch) {
float x, y, z;
rotate(i, j, k, x, y, z);
z += distanceFromCamera;

float ooz = 1 / z;
int xp = int(WIDTH / 2 + K1 * ooz * x * 2);
int yp = int(HEIGHT / 2 - K1 * ooz * y);

int idx = xp + yp * WIDTH;
if (idx >= 0 && idx < WIDTH * HEIGHT) {
if (ooz > zBuffer[idx]) {
zBuffer[idx] = ooz;
buffer[idx] = ch;
}
}
}

int main() {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

// Ẩn con trỏ nhấp nháy
CONSOLE_CURSOR_INFO cursorInfo;
GetConsoleCursorInfo(hConsole, &cursorInfo);
cursorInfo.bVisible = FALSE;
SetConsoleCursorInfo(hConsole, &cursorInfo);

while (true) {
fill(buffer, buffer + WIDTH * HEIGHT, ' ');
fill(zBuffer, zBuffer + WIDTH * HEIGHT, 0);

// tính lượng giác 1 lần mỗi frame
cosA = cosf(A); sinA = sinf(A);
cosB = cosf(B); sinB = sinf(B);
cosC = cosf(C); sinC = sinf(C);

for (float i = -cubeWidth; i < cubeWidth; i += 0.5f) {
for (float j = -cubeWidth; j < cubeWidth; j += 0.5f) {
calculatePoint(i, j, -cubeWidth, '@');
calculatePoint(cubeWidth, j, i, '$');
calculatePoint(-cubeWidth, j, -i, '~');
calculatePoint(-i, j, cubeWidth, '#');
calculatePoint(i, -cubeWidth, -j, ';');
calculatePoint(i, cubeWidth, j, '+');
}
}

gotoxy(hConsole, 0, 0);

for (int k = 0; k < WIDTH * HEIGHT; k++) {
cout
Несмотря на то, что я использую «\ x1b [h» для перемещения курсора обратно в верхнюю часть, консоль все еще прокручивается вниз-каждая новая кадра печатается ниже предыдущей. (Im использую vscode в Windows 11). < /P>
Что я попробовал: < /p>
  • Использование «\ x1b [2j» или «\ 033 [H» для очистки экрана /движения Cursor < /li>
    Использование :: flushsh Терминал Windows)
Ожидаемое поведение: я хочу, чтобы куб вращался на месте (в фиксированной области консоли), а не прокручивать вниз.

Подробнее здесь: https://stackoverflow.com/questions/797 ... n-place-on
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»