Когда вы пишете игру без использования событий ... все, что вы действительно делаете, осуществляете сами. Это выгодно, потому что вы можете сделать его намного более эффективным, чем при использовании встроенных событий вашего языка. Игры, написанные таким образом, менее подвержены ошибкам, если вы знаете, что делаете.
Например, когда я пытался научить своего брата тому, как написаны игры, я написал для него простую змеиную игру. У меня была основная петля в потоке, переместите змею и нарисуйте ее на новом месте в цикле. У меня будет поток, работающий в то же время, который непрерывно проверяет 4 вещи:
1) Если змея врезалась в себя (игра закончилась); если происходит игра, остановите основной поток, который обновляет основное положение змеи, печатайте игру на экране, ожидайте ввод ключа, затем перезапустите игру.
2) Если змея съела яблоко; увеличьте переменную счетчика, в которой указано, сколько яблок было съедено, и напечатайте это новое значение на экране, переписав то, что было раньше.
3) Если змея съела количество яблок, кратных 10 (змея вырастает на 1 клетку, вычесть из переменного ожидания, что говорит, сколько времени должно пройти между каждым движением змей делает)
4) Если нажата клавиша со стрелкой. Если влево, установите для перемещения в 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_ в значение true. Поэтому, когда поток цикла, который проверяет состояние игры, проверяет, что происходит в игре, он замораживает игру и печатает игру на экране.
Другое: Когда на экране изображено яблоко, позиция делегата, на которую он нарисована (рандомизирована), устанавливается на «void increment_apple()», которая увеличивает счетчик яблока, удаляет текущее яблоко из просмотреть и нарисовать новое яблоко на экране, установив старую позицию яблока на «void nop()», которая ничего не делает, а в новой позиции яблока указывается «void increment_apple()».
В основном, как работает игра. Как вы можете видеть, змея перемещается в эти позиции на экране и без каких-либо явных проверок типа «if (snake_position == some_position)», игра автоматически делает все, что должно быть для всего, что происходит в игре, очень похоже на то, как при нажатии кнопки на форме действие, назначенное этому событию, выполняется автоматически, без необходимости самостоятельно проверять событие.
Итак, вы могли бы использовать форму и события по умолчанию, которые предоставляет C#, но я этого не сделал. Я использовал консольный интерфейс и реализовал собственную систему событий.
Вот как это работает за кулисами: Основной цикл для вашего приложения формы будет работать в потоке, который проверяет ввод всех кнопок и т. Д. На экране. Каждый из этих элементов будет устанавливать логическую переменную, которую они используют для истины. Когда вы нажимаете эту кнопку, другой поток, выполняющий цикл, проверяет, что вы нажали, и говорите, что нажал кнопку «button1», эта кнопка имела бы назначенный ей делегат; этот делегат затем выполняется с учетом того, на что он указывает.
Трудно объяснить, но имеет ли это смысл для вас?
** Консольные приложения ** обычно не взаимодействуют с мышью, и у них нет много забот о системах координат пикселей. Хотя я уверен, что вы собираетесь получить кучу ответов, описывающих, как захватить мышь и многое другое, я думаю, вам лучше сделать шаг назад и пересмотреть то, что вы делаете. –
Большое спасибо за комментарий, но я изучаю как можно больше о консольных приложениях C#. Примерно через 3 месяца я буду удовлетворен и перейду к формам и, в конечном итоге, новым языкам. Я прочитал часть вашего блога и ценю ваши взгляды на изучение языков. Получение языка для выполнения чего-то, что обычно не происходит в некоторых случаях, является лишь частью проблемы. – Bloodyaugust