Прогулка по лунолётам. 3 - Оживляем "Кон-тики"

На предыдущей прогулке мы успешно запрограммировали модель, позволяющую управлять лунолётом в динамике вблизи безвоздушных планет. Однако, вывод оперативной информации о полёте представлял собой только поток ежесекундно меняющихся цифр. Пришла пора добавить графику и перейти в двумерное пространство.

Возможности даже UserRPL (у SysRPL они выше) по работе с графикой весьма богаты: отображение функций, точнее, их кривых, рисование на уровне примитивов "линия", "дуга", "прямоугольник", "круг", вывод двоичных графических объектов в определенное место экрана, анимация по заданной последовательности изображений и многое другое.

Тем не менее, UserRPL не ориентирован на вывод графики в динамическом режиме. Если вы попробуете делать это стандартными способами - очистить экран, добавить объекты, сохранить экран, показать, повторить в цикле - то картинка начнет мерцать. Скорости обработки не хватает.

Поэтому для динамики потребуется не совсем стандартный подход, накладывающий некоторые ограничения. Суть его в том, что мы не очищаем экран всякий раз, а инвертируем точки по двум состояниям объекта: предыдущему и текущему. "Исключающее ИЛИ" с предыдущим состоянием погасит точки, оно же высветит их для текущего. Это касается двоичных объектов (GROB). Из функций рисования такими свойствами обладает лишь TLINE. Её то мы и будем использовать для обрисовки "Кон-тики" под разными углами атаки.

Для рисования векторного изображения лунолёта нам должно хватить восьми точек. Для простоты расчетов возьмём полярную систему координат с центром, вокруг которого будет вращаться корабль.

Вот необходимая нам математика.

Наша задача - отработать блок отрисовки лунолёта, поэтому программа (см. прикрепленный файл и текст ниже) будет упрощенной. Не будем пока реализовывать блок расхода топлива, расчета координат и многочисленных проверок. Ограничимся управлением стрелками: приращение ускорения будем всё так же производить вертикальными, а горизонтальные подключим для изменения угла атаки. Выведем также значения вертикальной и горизонтальной скоростей.

Кнопки "A" и "Q" будут служить для выхода из программы. Кнопка "M" позволяет переключать приращение угла между 1 и 10 (см. цифру справа от значения Δα).

Обратите внимание на использование стека, локальных переменных и организацию подпрограмм. Нам это всё обязательно понадобится на следующей прогулке.

Пробуем набрать скорость в вертикальном полете

Начинаем отклоняться вправо

Лунолёт под углом 45°

Снимки экрана получены с эмулятора. На реальном устройстве графика смотрится гораздо чётче.

Не совсем пока ясна концепция показа траектории. Как нагляднее мог бы выглядеть такой показ: просто кривая, построенная по контрольным точкам с изменением масштаба при выходе за пределы координатной сетки, или еще что-то?

На следующей прогулке нам предстоит решить этот вопрос и добавить все недостающие реалистичному симулятору блоки для полёта.

© Сергей Тарасов (Serguei Tarassov), 2007. Пользовательское соглашение.