Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C# Вывести в заданную позицию консоли информацию о координаты мыши, состояние управляющих клавиш https://www.cyberforum.ru/ csharp-beginners/ thread1427939.html
Всем доброго времени суток, в институте такая вот задача далась, помогите её решить пожалуйста: Написать программу, которая выводит в заданную позицию консоли информацию о координаты мыши,...
Написать программу для получения сведений о системе, используя WinAPI функции C#
Всем доброго времени суток, в институте такая вот задача далась, помогите её решить пожалуйста: Написать программу для получения сведений о системе, используя функции Win32 API: GetSystemInfo (),...
C# Написать программу для получения сведений о системе, используя функции Win32 API В институте такая вот задача далась, помогите её решить пожалуйста: Написать программу для получения сведений о системе, используя функции Win32 API типа: GetSystemDirectory (), GetWindowsDirectory... https://www.cyberforum.ru/ csharp-beginners/ thread1427936.html C# Вывод цифр, добавляя ноль Есть массив. Он заполняется значением по возрастанию, то есть первый элемент 1, второй 2, 3,4,5....и так до 99. Как вывести значение массива так, чтобы он выводил на экран вот в таком ввиде:... https://www.cyberforum.ru/ csharp-beginners/ thread1427912.html
C# Как правильно перегрузить оператор сложения двух строк
Здравствуйте форумчане ! Я пытаюсь реализовать один алгоритм , в котором идет работа с двоичной сс. Но не знаю , как правильно перегрузить оператор сложения двух строк. :( К примеру у меня есть...
C# Как сохранять информацию в текстовый документ? https://www.cyberforum.ru/ csharp-beginners/ thread1427851.html
Всем привет, у меня запара можете подсказать как сохрать в текстовый документ инфу и доставать её от туда?
C# Операции в над обобщенными типами using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace cs_test_app_1 { class Program { static void... https://www.cyberforum.ru/ csharp-beginners/ thread1427840.html C# Эргономические исследования
помогите пожалуйста написать код на и что то вроде секундомера, в общем в должны считать время редактирования для офисов а в количество кликов мыши и время например для перемещения папки или...
C# Работа с кодировкой вида "u0430\u0434\" в HttpResponce ответах Приветствую! возникла странная проблема. В ответах от хттп сервера я получаю контент, в котором кириллица отображается символами вида "u0430\u0434\u0430" Цель - встроить декодирование ответов... https://www.cyberforum.ru/ csharp-beginners/ thread1427726.html C# Представить сигнал из Wave-файла в виде осциллограммы https://www.cyberforum.ru/ csharp-beginners/ thread1427723.html
Представить сигнал записан в wav файле без использования звукового редактора в виде осциллограммы (зависимость амплитуды отсчетов от времени). спектрограммы (сонограммы) спектра Фурье Ето...
Открыть файл с помощью WinInet.dll C#
Приветствую. Долго уже мучаюсь, не могу понять в чём моя ошибка. Ситуация следующая: В проект C# .NET CF 3.5 импортирую библиотеку wininet.dll v8.0 для работы с FTP. К серверу подключаюсь....
C# Передача данных клиент-сервер Всем доброго. Только начал изучать сокеты и передачу через tcp/udp. Есть клиент и сервер, коннект через udp: private void buttonReceive_Click(object sender, EventArgs e) { ... https://www.cyberforum.ru/ csharp-beginners/ thread1427700.html
[Bicycle Reinventor]
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
23.04.2015, 10:05 0

Очистка входного потока - C# - Ответ 7518754

23.04.2015, 10:05. Показов 4284. Ответов 2
Метки (Все метки)

Лучший ответ Сообщение было отмечено DonkeyKong как решение

Решение

Когда изучал паттерн GameLoop, упрощал некоторые куски кода на примере MonoGame, адаптируя их под консоль. Стремления создать полноценную игру не было - интересно было создать лишь консольный игровой движок, на основе которого можно было потом что-то сделать. Тогда же я столкнулся с проблемой, которая имеет те же корни, что и у вас.
В геймдеве всегда есть потребность в обработке длительных и одиночных нажатий клавиш. Например, если мы нажимаем кнопку бега, персонаж должен бежать, пока кнопка нажата. И наоборот - если мы нажимаем кнопку прыжка, персонаж должен прыгнуть лишь один раз и не прыгать снова, пока пользователь не отпустит кнопку и не нажмёт её снова. Для этих целей на каждой итерации игрового цикла состояние пользовательского ввода проверяется с состоянием на предыдущей итерации, чтобы видеть изменения (за счёт этого можно обнаруживать события нажатия и отпускания клавиши). Однако это не работает для консоли, потому что у консоли нет ивентов типа keyDown и keyUp, а именно они используются для реализации этого механизма. Консольное окно - если грубо - просто текстовый редактор. Что будет, если в текстовом редакторе зажать кнопку? В момент нажатия нужная буква появится в тексте, затем последует пауза в секунду, а затем эта буква будет потоком очень быстро набираться в текстовое поле. Поэтому при обработке пользовательского ввода в консоль, мы фактически обрабатываем текстовый ввод.
Какими могут быть решения? Как вариант - можно было бы использовать глобальный хук клавиатуры, но я не знаю, как это работало бы на самом деле с консолью. Я решал проблему по-другому. Для того, чтобы пользовательский ввод был независимым, я вынес обработку пользовательского ввода из основного цикла GameLoop в отдельный поток, чтобы методы отрисовки и игровой логики ему не мешали, реализовал сохранение статуса нажатой кнопки на предыдущей итерации и завёл отдельный флаг, отображающий прочитал ли основной цикл нажатую клавишу или она ещё не обработана.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        // работает в отдельном потоке
        private void ProcessInput()
        {
            while (true)
            {
                if (Console.KeyAvailable)
                {
                    pressedKey = Console.ReadKey(true);
                    keyReaded = false;
                }
                else if (keyReaded)   // флаг keyReaded выставляется, если основной поток обработал нажатие
                {
                    pressedKey = new ConsoleKeyInfo();   // в таком случае мы очищаем последнюю нажатую клавишу
                }
                Thread.Sleep(1);
            }
        }
И основной игровой цикл:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
        public void Run()
        {
            gameTimer.Start();
            while (true)
            {
                long currentTicks = gameTimer.Elapsed.Ticks;
                elapsedTicks += currentTicks - previousTicks;
                previousTicks = currentTicks;
 
                if (elapsedTicks < targetElapsedTicks)
                {
                    Thread.Sleep((int)TimeSpan.FromTicks(targetElapsedTicks - elapsedTicks).TotalMilliseconds);
                }
 
                if (elapsedTicks > maxElapsedTicks)
                {
                    elapsedTicks = maxElapsedTicks;
                }
 
                gameTime.ElapsedGameTime = targetElapsedTicks;
                int stepCount = 0;
                while (elapsedTicks >= targetElapsedTicks)
                {
                    gameTime.TotalGameTime += targetElapsedTicks;
                    elapsedTicks -= targetElapsedTicks;
                    ++stepCount;
                    Update(gameTime);
                    keyReaded = true;
                }
                gameTime.ElapsedGameTime = targetElapsedTicks * stepCount;
 
                Draw(gameTime);
            }
        }
Гораздо проще дело обстоит в WinForms, и я очень надеюсь, что у вас именно это. В конечном итоге я также перешёл с консоли на WinForms и избавился от проблем пользовательского ввода, адаптировав классы Keyboard, KeyboardState и KeyState из моногейма.

Если вы пишете игру, рекомендую самостоятельно изучить паттерн GameLoop, потому что все игры за последние лет 10-15 написаны с использованием этого паттерна, пошаговые ли, реального времени ли, да хоть рогалики и квесты.

Хорошую статейку по этому поводу можно найти здесь. Я бы даже сказал, что очень хорошая статейка.
Пример с хабра.
Также полезными окажутся исходники MonoGame, которые можно найти здесь. Игровой цикл там реализовал по всем правилам паттерна и идентичен тому, что используется в XNA.

Вернуться к обсуждению:
Очистка входного потока C#
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.04.2015, 10:05
Готовые ответы и решения:

Прочитать все из входного потока
Начал учиться программировать на c#, решая задачки на сайте олимпиадного программирования. Сразу же...

Недопустимый двоичный формат входного потока
Всем привет! Возникла такая ошибка: &quot;Недопустимый двоичный формат входного потока.&quot; В чем может...

Выловить из входного потока нажатие Enter в незаполненной консоли
Как можно выловить из входного потока нажатие Enter в незаполненной консоли? Т.е. что бы при...

Очистка textBox из другого потока
Как можно попроще очистить textBox из неосновного потока?

2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2015, 10:05
Помогаю со студенческими работами здесь

Записать число в начало потока вернувшись с конца потока после записи нескольких элементов...
public static void Save(List&lt;SomeClass&gt; listSC, String fileName) { using...

Как из одного потока узнать состояние другого потока
Подскажите пожалуйста, как из одного потока узнать, что другой поток еще не запущен. Например,...

Очистка входного потока (cin или stdin)
ПОМОГИТЕ ПОЖАЛУЙСТА!!!! Делаю программу под консоль в линуксе, запрашиваю с клавиатуры имя файла....

Слова входного потока
Вывести самые длинные слова входного потока! если во вх потоке самое длинное слово одно,то...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru