Эта статья посвящена игре <Тетрис>, которую я создал с помощью
AtMega32, управляя лучом осциллографа. Эту игру я весьма творчески назвал
"Скопетрис".
Осциллограф Telequipment D61 с запущенным "Скопетрисом".
Проект начался с нескольких резисторных сборок типа R-2R ("цепочки
лестницы"), которые я собрал, играя с цепями с действующими резисторами.
Благодаря R-2R величина, выраженная в цифровых битах, может быть
преобразована в соответствующие значения аналогового напряжения. В цепи
наиболее существенному биту соответствует напряжение с Vcc/2, следующему
биту - Vcc/4, а следующему за ним - Vcc/8 и т. д. Например, конфигурация
цепочки лестницы R-2R для 4-битового преобразователя будет следующей:
Используя действующие цепи резисторов и резисторы SMD на платах, я
создал две "цепочки лестниц" R-2R для 8-битового аналогово-цифрового
преобразователя, который мог напрямую встраиваться в макет и
подсоединяться к микроконтроллеру.
Цепи из действующих резисторов образуют резисторные лестницы по 5.6 К.
Это означает, что резисторы 2R должны быть по 11.2 К. Первая попытка
состояла в том, чтобы использовать SMD резисторы по 12 К, предполагая, что
относительная погрешность в 7% не столь значительна. Но я ошибался: такая
точность была более чем неудовлетворительной, а сгенерированный
циклический сигнал с диапазоном значений от 0 до 255 имел очень
нестабильный период и даже периодически затухал.
Решением стало спаять SMD резисторы по 150 К параллельно с резисторами
по 12 К, чтобы в итоге получить 11.11 К. Такой подход устранил проблему с
точностью и результирующий сигнал получился превосходным.
Забавы с векторами
Две резисторные лестницы, соединяющие порты AtMega32,
были подсоединены к осциллографу в режиме Х/У.
Таким образом можно было управлять положением луча, просто приписывая
значения регистрам микроконтроллера. Теперь вставал вопрос: что же делать
с установкой?.. Конечно же, рисовать на экране!
К сожалению, интенсивностью луча нельзя было управлять,
поскольку мы имели дело с настоящим векторным экраном. Но благодаря хорошему
старому зеленому фосфору, толщину линии можно было корректировать в зависимости
от скорости движения луча.
Как бы то ни было, перемещение луча не было безупречным.
Когда его требовалось перемещать на большие расстояния, появлялись проблемы
проскакивания, а также периодически на экране появлялись дефекты,
связанные с подтормаживанием фильтров. Пытаясь улучшить ситуацию, я
поместил несколько буферов на выход цепи R-2R. Это устранило проблему
некоторых тормозящих дефектов, но луч все так же продолжал иногда
проскакивать. Я подозреваю, что причиной этого могли быть некоторые
конденсаторы в R-2R.
"Скопетрис" на макетной плате.
Тетрис - с цепными реакицями
Теперь, когда у меня была система, способная рисовать на
экране осциллографа, я решил создать игру <Тетрис>, чтобы подняться немного выше
обычных забав с осциллографами. Я долго и упорно обдумывал то, как лучше
всего обрисовать игровое поле. Действительно ли стоит рисовать квадрат или
другой символ для каждого занятого куба? Я пришел к выводу, что
единственный действительно хороший способ сделать это - нарисовать
отдельные кирпичики на игровом поле, отслеживая их контуры.
Это требование ведет к необходимости управления каждым
активным кирпичиком, его перемещением и раздроблением. С одной стороны, это
увеличило сложность выполнения задачи, но с другой - это стоило того,
потому что позволило имитировать истинные тяжесть и цепную реакцию весьма
естественно.
Правило цепной реакции - это интуитивное дополнение к
стандартным правилам игры "Тетрис". Всякий раз, когда кирпич может упасть,
это ведет к возможности удаления дальнейших законченных линий. В этом состоит
отличие от традиционного "Тетриса", где кирпичики могут повиснуть в воздухе.
Я узнал о правилах цепной реакции, играя в превосходную игру Quadra некоторое
время назад.
Графика требует обрисовки всех объектов игры на 100 Гц для
гарантии гладкости и отсутствия вспышек. Обрисовав объекты, луч остается в
верхнем левом углу игрового поля. Когда количество кирпичиков на площадке
растет, обрисовка занимает больше времени, а также может случиться, что частота
становится намного меньше 100 Гц, если площадка заполнена.
Управление
Чтобы управлять игрой, я подсоединил 9-выводной коннектор
D-Sub к микроконтроллеру, чтобы можно было использовать стандартный
джойстик Atari/C64/Amiga.
Подсчет очков
Эта игра - всего лишь марафон "Тетрис" с увеличивающийся
скоростью, а очки - просто число удаленных линий. Скорость, однако, зависит
не от числа удаленных линий, а от количества раундов - каждый раз, когда кирпич
падает, контуры разрушаются. Таким образом, чтобы набрать большое
количество очков, необходимо каждый раз убивать большое количество
контуров и, конечно же, быть в состоянии справляться с высокими скоростями.