2015-06-19 3 views
0

Я делаю текстовую игру, я хочу сделать ввод с текстом медленно (char по char с разницей в ~ 100 мс), я попытался сделать цикл, который пересекает строку и печатает символы один за другим, но мне нужен таймер между тем, чего я не смог достичь даже с помощью google. поэтому мне нужна помощь в создании таймера или другого алгоритма, чтобы медленно печатать строки. мой код:печатать строку char char/timer

static void PrintSlowly(string print) 
{ 
    foreach(char l in print) { 
     Console.Write(l); 
     //timer here 
    } 
    Console.Write("\n"); 
} 
+1

Возможно, сон 100 мс? Ваша игра многопоточная в любом случае? –

+1

'Thread.Sleep (100)'? – stefankmitph

+0

@ bali182 Вы бы сделали многопоточное игровое программное обеспечение в момент обучения, где задавали бы такие вопросы? –

ответ

1

Противный, противный дешевое решение:

static void PrintSlowly(string print) 
{ 
    foreach(char l in print) { 
     Console.Write(l); 
     Thread.sleep(10); // sleep for 10 milliseconds  
    } 
    Console.Write("\n"); 
} 

Так как вы, вероятно, не слишком заботится о производительности, вы могли бы пойти с этим. но имейте в виду, что Thread.Sleep is pretty wasteful

+0

Какой аргумент в Thread.sleep? milisecs? ИКС? – Ravid

+0

миллисекунды, как и комментарий позади него. –

+0

Почему так много потоков? на самом деле не понял нить (я должен был) – Ravid

1

Основываясь на решении apomene, я бы выбрал (реальное) решение на основе таймера, поскольку Thread.Sleep довольно неточен.

static void PrintSlowly(string print) 
{ 
    int index = 0; 
    System.Timers.Timer timer = new System.Timers.Timer(); 

    timer.Interval = 100; 
    timer.Elapsed += new System.Timers.ElapsedEventHandler((sender, args) => 
    { 
     if (index < print.Length) 
     { 
      Console.Write(print[index]); 
      index++; 
     } 
     else 
     { 
      Console.Write("\n"); 
      timer.Enabled = false; 
     } 
    }); 

    timer.Enabled = true; 
} 

Таймер возвращается каждые 100 миллисекунд, выбирает следующий символ и печатает его. Если больше символов недоступно, оно печатает возврат и отключает себя. Я написал его, используя метод анонимной обработки, используя лямбда-выражение, а не самый чистый способ. Речь идет только о принципе. Эта реализация выполняется параллельно с вашим приложением, поэтому она не блокирует выполнение кода. Если вы этого хотите, другой подход может быть лучше.

В качестве альтернативы - в качестве модификации решения apomene без занятости - вы можете использовать ManualResetEvent.

static System.Timers.Timer delay = new System.Timers.Timer(); 
static AutoResetEvent reset = new AutoResetEvent(false); 

private static void InitTimer() 
{ 
    delay.Interval = 100; 
    delay.Elapsed += OnTimedEvent; 
    delay.Enabled = false; 
} 

private static void OnTimedEvent(object sender, ElapsedEventArgs e) 
{ 
    ((System.Timers.Timer)sender).Enabled = false; 
    reset.Set(); 
} 

static void PrintSlowly2(string print) 
{ 
    InitTimer(); 

    foreach (char l in print) 
    { 
     Console.Write(l); 
     delay.Enabled = true; 

     reset.WaitOne(); 
    } 
    Console.Write("\n"); 
} 

Он ждет с использованием AutoResetEvent, поэтому другие приложения/потоки могут использовать процессор!

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