2012-01-13 5 views
0

Я извиняюсь за мой статус новичка, но, пожалуйста, медведь со мной:Проектирование «адаптированный текст» для консольных приложений/C# Пользовательские приложения

Я пытаюсь создать эффект «текущий текст» не в отличие от видели в старой команды (DOS!) или даже ностальгически/юмористически воспроизведено в линейке игр Fallout, разработанной Bethesda Game Studios. Я ищу по существу для создания сценария, который будет оказывать это влияние на большинство консольных приложений, которые я бы использовал, от простых пользовательских приложений LINQ to SQL до консольных приложений «игр». Это для моего собственного назидания, поскольку я очарован эффектом и очень хотел бы воспроизвести его.

Я подумал, можно ли просто буферизовать текст таймером, чтобы обеспечить этот внешний вид и создать впечатление загружаемого (потокового) текста, но как новичок на C#, я не уверен, с чего начать , Вот. Пожалуйста, дайте мне знать, если мне нужно предоставить какие-либо разъяснения, поскольку я ищу твердые основания.

+1

Как выглядит текущий текст? – Ryan

+0

Простое текстовое сообщение, например «Добро пожаловать в приложение». Выберите из следующих функций базы данных. ' Эффект будет продолжаться, когда пользователи ответят и когда будут предоставлены ответы от приложения. – JackOrangeLantern

ответ

2

Если под «распознанный текст», вы имеете в виду ввода текста в консоли, так что она выглядит, как будто кто-то печатает его, вам нужно сделать следующее:

  • ввода Trap клавиатуры и отключить клавиатуру echo
  • Напишите каждый символ отдельно
  • Пауза между каждым символом в течение достаточно короткого периода времени с использованием Thread.Sleep() перед записью следующего символа.

IF, Ото, по «распознанный текст», вы имеете в виду что-то похожее на фильм Матрица, где символы, по всей видимости, падает вниз от верхней части экрана:

Matrix-style animated gif

Это сложнее, тем более, что доступ к консоли .Net немного ограничен, не хватает ничего, как ncurses.

Этот вопрос, Is there any console "graphics" library for .Net?, может быть полезно там.

FWIW, вот способ сделать это .Net. Возможно, вы захотите поиграть с разными размерами интервалов, чтобы получить желаемый эффект. На самом деле это не приводит к нажатию клавиш: скорее, перед любым дисплеем он потребляет любые ожидающие нажатия клавиш, не вторя их в оболочку.

using System; 
using System.Threading; 

namespace FlowingText 
{ 
    class Program 
    { 
    const int CHARACTER_INTERVAL_IN_MILLISECONDS = 50 ; // interval between characters is 1/4 second (250ms) 
    const int PARAGRAPH_INTERVAL_IN_MILLISECONDS = 500 ; // interval between paragraphs is 1 second (1000ms) 

    static int Main(string[] args) 
    { 
     foreach (string paragraph in PARAGRAPHS) 
     { 
     Display(paragraph) ; 
     } 
     return 0 ; 
    } 

    public static void Display(string paragraph) 
    { 
     EndOfLine() ; 
     foreach(char ch in paragraph) 
     { 
     Thread.Sleep(CHARACTER_INTERVAL_IN_MILLISECONDS) ; 
     DisplayChar(ch) ; 
     } 
     EndOfLine() ; 
     Thread.Sleep(PARAGRAPH_INTERVAL_IN_MILLISECONDS) ; 
     return ; 
    } 

    private static void DisplayChar(char ch) 
    { 
     ConsumeInput() ; 
     Console.Out.Write(ch) ; 
     Console.Out.Flush() ; 
     return ; 
    } 

    private static void EndOfLine() 
    { 
     ConsumeInput() ; 
     Console.Out.WriteLine() ; 
     Console.Out.Flush() ; 
     return ; 
    } 

    private static void ConsumeInput() 
    { 
     const bool NO_ECHO = true ; 

     // consume any pending keystrokes w/o echoing the character 
     while(Console.KeyAvailable) 
     { 
     Console.ReadKey(NO_ECHO) ; 
     } 

     return ; 
    } 

    private static readonly string[] PARAGRAPHS = 
    { 
     "Nam non rhoncus sapien. Donec in lorem sed mauris porttitor imperdiet vitae ut nunc. In eu erat non nunc dictum vestibulum. Cras erat dui, fringilla vel pulvinar nec, consequat eu orci. Aliquam erat volutpat. Phasellus rhoncus, lectus a volutpat lacinia, quam turpis venenatis sem, a vestibulum orci nulla congue lacus. Quisque molestie, tellus eu dapibus dictum, erat turpis fringilla nibh, id posuere lacus lectus ut libero." , 
     "Mauris vulputate, nulla porttitor dignissim convallis, ligula odio fermentum leo, et faucibus magna eros nec libero. Nam a risus quis mauris ultricies tempor. Quisque nulla velit, pellentesque at pellentesque ac, dignissim quis metus. Fusce tristique, diam vitae pellentesque tristique, metus risus egestas sapien, at luctus justo arcu a neque. Suspendisse enim augue, laoreet in posuere sit amet, facilisis non tortor. Phasellus quam nisl, ullamcorper non volutpat a, pretium vestibulum metus. Suspendisse at faucibus felis. Ut ullamcorper consectetur velit vitae tincidunt." , 
     "Aenean eget purus a nulla varius volutpat. Duis eget blandit massa. Nunc eget arcu ante, sed congue elit. Phasellus vulputate felis non nibh semper non luctus magna eleifend. Maecenas eget nulla nulla, lobortis tincidunt magna. Proin et lacus est, quis viverra elit. Praesent feugiat dui ut tortor bibendum cursus." , 
     . 
     . [elided] 
     . 
     "Vestibulum enim tellus, suscipit vel vulputate nec, dignissim quis dui. Proin porttitor, orci sed vulputate viverra, nisi sem mollis nisi, ut accumsan quam mauris varius lectus. Vivamus ac nunc ipsum, quis vestibulum nisi. Sed aliquet iaculis leo quis commodo. Sed lorem nisi, tincidunt adipiscing blandit at, porta a metus. Vivamus nec leo eget sapien dapibus consequat vel at lacus. Praesent nec ligula felis, eu malesuada nisi. Vestibulum tincidunt nisl quis nulla suscipit volutpat. Sed at ligula sit amet mauris tincidunt dignissim vel in nibh. Vivamus eget hendrerit erat. Sed fringilla congue lacus vitae convallis. Fusce eget risus sit amet lectus placerat commodo. In ac leo sit amet diam sagittis placerat in ultrices eros. Nam semper, orci et malesuada cursus, mi ipsum gravida dolor, at accumsan est magna sit amet ante. Nulla facilisi." , 
     "Aliquam accumsan dictum luctus. Nunc commodo interdum diam, at feugiat augue semper at. Integer tincidunt, metus quis porta cursus, dolor nisl tincidunt massa, nec rhoncus ipsum ligula sit amet nunc. Fusce velit nunc, bibendum et vestibulum nec, consequat non turpis. Aenean gravida sagittis nulla, ut posuere nulla molestie in. Ut nec odio non arcu pellentesque dapibus. Nullam vel ligula sit amet orci tincidunt congue eu a risus." , 
     "Quisque tempus ipsum ut diam scelerisque egestas. Nam at felis nunc. Proin ut odio lacinia massa sagittis tempus quis et metus. Integer dictum eros vel mi tincidunt eu iaculis augue sollicitudin. Integer vel justo ut mi viverra egestas. Aenean consectetur nisl vel dui interdum quis tincidunt lacus scelerisque. Cras lacus dolor, suscipit eget blandit et, cursus at nunc. In dictum malesuada blandit." ,   
    } ; 

    } 
} 
+0

Спасибо за ответ, особенно за thread.sleep, я могу использовать текущую документацию, чтобы попробовать это и опубликовать мои результаты здесь. Пожалуйста, простите мою нубость: на «Вход клавиатуры Trap и отключите эхо-клавиатуру» - можете ли вы объяснить, что это значит? – JackOrangeLantern

+0

[Матричный эффект в .NET] (http://www.vbforums.com/showthread.php?t=645452) – Ryan

+0

Я не имею в виду матричный эффект, хотя на самом деле эта ссылка может пригодиться. Большое спасибо. Однако, учитывая мой статус новичка, я не могу воспроизвести эффект - так что, пожалуйста, изучите это видео на YouTube в Интернете, чтобы получить висцеральное значение, что я имею в виду (просто немой, чтобы избежать постороннего звука): http://www.youtube. com/watch? v = yOuULqeFYD4 & feature = related. Это то, что я подразумеваю под текстом «flowing text» - отображением ввода, с текущими словами. Дисплей нежелательного материала выглядит не слишком далеко от матричного, и я думаю, что могу попытаться воспроизвести этот эффект (для реальных вещей). – JackOrangeLantern

0

Хорошо,

Я следовал по ссылке Thread.Sleep и попытался создать этот эффект для текстовых консольных приложений в C#. Я не был уверен, что я должен отредактировать свой вопрос или опубликовать его в ответ, так как технически я пытаюсь ответить на собственный вопрос, но ничего не решался, ничего не выиграл.

Я не уверен, насколько глубоко я должен документировать программы и/или код, поэтому, пожалуйста, дайте мне знать, если я под/над документом что-нибудь.

/** 
* A program which is intended to "slowly" print text in green. 
* A String read by the Console is converted to a char array and printed to the screen. 
* 
* Information derived from Microsoft 
* ----------------------------------- 
* Thread.Sleep is used in two ways: through a Timespan variable and through a direct call to the function. 
* Thread.Sleep(int) blocks the thread in milliseconds. 
* Thread.Sleep(Timespan) blocks the thread for a period of time measured in (int days, int hours, int minutes, int seconds). 
* Thread.Sleep is overloaded. 
* ----------------------------------- 
* End Information 
* Source 1: http://msdn.microsoft.com/en-us/library/d00bd51t.aspx [Thread.Sleep(int)] 
* Source 2: http://msdn.microsoft.com/en-us/library/274eh01d.aspx [Thread.Sleep(Timespan)] 
* 
**/ 

using System; 
using System.Threading; 

namespace PlacidText 
{ 

class Program 
{ 
    static TimeSpan interval1 = new TimeSpan(0, 0, 0, 1); 
    static TimeSpan interval2 = new TimeSpan(0, 0, 0, 2); 

    static void Main(string[] args) 
    { 

     Console.WriteLine("Welcome to Placid Text, home of slow-typing."); 

     while (true)   //loop 
     { 
      Console.WriteLine("Initializing Menu"); 
      Thread.Sleep(interval1); 
      Console.WriteLine("Please select from the following options"); 
      Console.WriteLine("\'t\' to select slow-type,"); 
      Console.WriteLine("Input \'q\' to quit:"); 

      String screenselect = Console.ReadLine(); 


      if (string.Compare(screenselect, "t") == 0) 
      { 
       Console.WriteLine("Slow-Type"); 
       Slowtype slowtype = new Slowtype();  //new instance of Slow-Type 
       slowtype.PrintZeString(); 
      } 
      else if (string.Compare(screenselect, "q") == 0) 
      { 
       break; 
      } 
      else 
      { 
       Console.WriteLine("Error: Bad input"); 
      } 

     } 

     Console.WriteLine("Ending Session"); 
     Thread.Sleep(interval2); 
     Environment.Exit(1); 
    } 

    public class Slowtype 
    {  //This class is used for Slowtype 

     private string printy; 

     public Slowtype()  //default constructor 
     { 
      printy = null; 
     } 

     public Slowtype(string printy)   //constructor 
     { 
      this.printy = printy; 
     } 

     public void PrintZeString() 
     { 

      Console.WriteLine("Please enter a string"); 

      printy = Console.ReadLine(); 

      Console.WriteLine(""); 

      char[] array = printy.ToCharArray(); 

      for (int i = 0; i < array.Length; i++) 
      { 
       char letter = array[i]; 

       Console.ForegroundColor = ConsoleColor.Green; 

       Console.Write(letter); 

       Console.ResetColor(); 

       Thread.Sleep(100); 
      } 

      Console.WriteLine(""); 
      return; 
     } 
    } 
} 

}

код работает, но я не уверен, если это оптимальный формат или лучший способ идти об этом, но это попытка отработать из рекомендаций, предоставленных nicholas- Carey.

~ Jack Orange Фонарь

+0

Я изменил свой ответ, чтобы показать пример кода. –

+0

Kewlness! Я собираюсь реализовать код и поиграть с ним. Мне очень нравится обширная инкапсуляция кода. Я не уверен, как удаление эхо-эффекта нажатия влияет на программу, но с небольшим количеством исследований и разработки, я думаю, что я буду лучше разбираться. – JackOrangeLantern

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