2015-02-13 2 views
1
while (true) 
{ 
    Console.Clear(); 
    for (int row = 0; row < 50; row++) 
    { 
     for (int col = 0; col < 50; col++) 
     { 
     Console.Write(world[row, col]); 
     } 
     Console.WriteLine(); 
    } 
     Thread.Sleep(500); 
} 

Я пишу игру, и у меня есть фигура, состоящая из 10 символов. Я хочу, чтобы он перемещался по массиву символов, когда нажимали некоторые кнопки со стрелками. Проблема в том, что эта игра не совсем текучая. Когда используется Console.Clear(), консоль постоянно мигает, и это раздражает. Есть ли решение этой проблемы? (Если я не хочу использовать Console.SetCursorPosition(), потому что это делает намного сложнее сделать эту игру).Console.Clear() мигает

+2

Вы можете попробовать что-то вроде консольного двойного буфера: https://code.msdn.microsoft.com/windowsdesktop/C-Console-Double-Buffer-adc31032 – itsme86

+2

почему 'while (true)' здесь? – chouaib

+2

Я был с тобой прямо до того места, где ты написал «потому что это делает его намного сложнее»! Однако я бы спросил, почему вам нужно постоянно перерисовывать экран? – DavidG

ответ

2

Попробуйте подвести сцену в 1 строке, чем рисовать его сразу, это не будет (скрыть) мигающий эффект до определенного момента:

string scene = ""; 

// iterate your array to construct the scene string 
for (int row = 0; row < 50; row++) 
{ 
    for (int col = 0; col < 50; col++) 
    { 
     scene += world[row, col]; 
    } 
    scene += '\n'; // new line 
} 
Console.Clear(); // thanx David 
Console.Write(scene); 
+3

Лучше переместить 'Clear' чуть выше' Write'. – DavidG

+2

Я бы рекомендовал использовать 'StringBuilder' вместо конкатенации строк здесь. – itsme86

+2

@ itsme86: определенно действительная точка, я просто предложил это (родное) решение, а остальное на OP, я думаю, он отлично поработает с этого момента – chouaib

2

Я никогда не делал это сам, но вы могли бы иметь возможность создать двойную буферную схему бедного человека, удвоив размер Console.BufferHeight. Когда вы будете готовы нарисовать, Console.SetCusorPosition() один раз до начала буферной зоны вне экрана, нарисуйте свою сцену как обычно, а затем используйте Console.MoveBufferArea(), чтобы переместить только что снятую заставку на экран.

Смежные вопросы