Консольный щелчок мышью приложения X обнаружений/Сравнений координаты Y

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

P.S. Я знаю, что это уже в общих чертах без кода, если, но я не чувствую, что он необходим как все, которое я прошу, краткое объяснение того, как захватить X координат Y в консольном приложении и засунуть их в международные переменные.

Большое спасибо заранее!: D

11
задан Bloodyaugust 22 December 2009 в 06:21
поделиться

3 ответа

То, что сказал Фрэнк Крюгер. Ты действительно хочешь это сделать? Windows Forms разработаны для того, чтобы сделать это намного проще.

Если Вы это сделаете, Вам нужно будет использовать PInvoke в низкоуровневом API Windows. Попробуйте это в качестве отправной точки - но имейте в виду, что это значительно сложнее, чем было бы в приложении Windows Forms.

.
3
ответ дан 3 December 2019 в 04:13
поделиться

Кроме того, консоль предназначена не только для обработки текста. Для него можно написать довольно приличные оконные менеджеры. С ним можно делать все, что угодно. Просто сложнее.

Но он медленнее. Я реализовал виртуальную машину на C #, используя консоль для пользовательского интерфейса. Он не печатает строки текста одну за другой; он [интерфейс] действует скорее как графический интерфейс.

Если вам нужен ввод с помощью мыши на консоли, попробуйте эту ловушку: http://blogs.msdn.com/b/toub/archive/2006/05/03/589468.aspx?PageIndex=2#comments

7
ответ дан 3 December 2019 в 04:13
поделиться

Когда вы пишете игру без использования событий ... все, что вы на самом деле делаете, это реализуете сами. Это выгодно, потому что вы можете сделать его намного более эффективным, чем использование встроенных событий вашего языка. Игры, написанные таким образом, менее подвержены ошибкам, если вы знаете, что делаете.

Например, когда я пытался научить своего брата писать игры, я написал для него простую игру-змейку. У меня был основной цикл в потоке, переместил змейку и нарисовал ее в новой позиции в цикле.У меня был бы одновременно запущенный поток, который непрерывно проверяет 4 вещи:

  1. Если змея врезалась в себя (игра окончена); если игра закончилась, остановите основной поток, который обновляет основную позицию змейки, распечатайте игру на экране, дождитесь ввода клавиши, затем перезапустите игру.

  2. Если змея съела яблоко; увеличьте переменную счетчика, которая говорит, сколько яблок было съедено, и напечатайте это новое значение на экране, перезаписав то, что было там ранее.

  3. Если змея съела количество яблок, кратное 10 (змея увеличивается на 1 ячейку, вычтите из переменной ожидания, которая говорит, сколько времени должно пройти между каждым движением змеи)

  4. Если была нажата клавиша со стрелкой нажал. Если влево, установите move в 0, если вправо установите движение в 1, если вниз установите, передвиньте в 2, если вверх установите, передвиньте в 3. Целое число, в котором это хранится, является указателем на массив из 4 делегатов, которые заставляют змею двигаться. в правильном направлении.

Основной цикл, который обновляет положение змейки, сообщает потоку, проверяющему эти 4 вещи, что делает змейка. Я делаю это так: каждая ячейка на экране, которую перемещает голова змеи, указывает на двумерный массив делегатов. Об этом массиве делегатов:

Игра написана в консольном режиме и использует цвета консоли. Консоль настроена на 80x50 символов. Делегат следующим образом: "delegate void ptr ()"; затем я создаю массив с помощью: "ptr [,] pos = new ptr [80,50]". Скажем, голова змеи находится в позиции (4,5) на экране, после того, как она переместится туда, основной цикл выполнит «pos [4,5] .Invoke ();».

Один из них: Когда змея перемещается в новую позицию, поток основного цикла получит каждую ячейку, которую змея покрывает на экране, и установит делегата в этой позиции, чтобы он указывал на функцию с именем «void gameover ()», которая установит переменную gameover_ к истине. Поэтому, когда поток цикла, который проверяет статус игры, проверяет завершение игры, он останавливает игру и выводит ее на экран.

Другой: Когда яблоко рисуется на экране, позиция делегата, в которой оно отрисовывается (которое рандомизируется), устанавливается так, чтобы указывать на «void increment_apple ()», которая увеличивает счетчик яблока, удаляет текущее яблоко из поля зрения и рисует новое яблоко. на экране, установив старое положение яблока так, чтобы оно указывало на «void nop ()», которое ничего не делает, а новое положение яблока указывало бы на «void increment_apple ()».

По сути, так и работает игра. Как видите, змея перемещается в эти позиции на экране, и, не выполняя никаких явных проверок, таких как «if (snake_position == some_position)», игра автоматически делает все, что от нее требуется, для всего, что происходит в игре, очень похоже на то, как когда вы нажимаете кнопку в форме, действие, назначенное этому событию, автоматически выполняется, без необходимости проверять событие самостоятельно.

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

Вот как это работает за кадром: основной цикл для вашего приложения формы будет выполняться в потоке, который проверяет ввод всех кнопок и т. д. на экране.Каждый из этих элементов устанавливает для используемой логической переменной значение true. Когда вы нажимаете эту кнопку, другой поток, выполняющий цикл, проверяет, что вы нажали, и, скажем, вы нажали кнопку с именем «button1», этой кнопке будет назначен делегат; этот делегат затем выполняется с тем, на что он указывает.

Сложно объяснить, но имеет ли это смысл для вас?

5
ответ дан 3 December 2019 в 04:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: