Lars Pontoppidan
Эта статья посвящена игре «Тетрис», которую я создал с помощью 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.
Подсчет очков
Эта игра - всего лишь марафон «Тетрис» с увеличивающийся скоростью, а очки - просто число удаленных линий. Скорость, однако, зависит не от числа удаленных линий, а от количества раундов - каждый раз, когда кирпич падает, контуры разрушаются. Таким образом, чтобы набрать большое количество очков, необходимо каждый раз убивать большое количество контуров и, конечно же, быть в состоянии справляться с высокими скоростями.