Репликация эффекта анимации Spinrite в C - PullRequest
0 голосов
/ 01 декабря 2010

Я хотел бы повторить эффект вращения, который Spinrite отображает в правом верхнем углу экрана, чтобы указать, что он все еще работает и не заморожен. Вы можете увидеть пример этого здесь в 2:18 - http://youtu.be/XRmDwVj5CRM

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

Я буду воспроизводить эффект в C на платформе ARM, но я ищу общий совет, а не код, например, как увеличить шаги анимации.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 01 декабря 2010

Это какая-то старая технология, но похоже, что Гибсон немного обновил свой интерфейс. Я помню, как его прядильщик был / \ | - персонажами ... Но я отвлекся. :)

Это в текстовом режиме и, скорее всего, это делается путем перехвата прерывания таймера в DOS и рисования всех остальных отметок таймера.

Стандартный таймер DOS тикал примерно каждые 55 миллисекунд.

Вы можете рисовать прямо на экране в DOS на X86, записывая указатель 0xA0000, используя тупой расширенный набор символов DOS.

(Обратите внимание, что это из старой памяти, прошло более 15 лет с тех пор, как я сделал что-то из этого :) Другими словами, чтобы нарисовать букву «А» в первой строке / столбце экрана, вы должны сделать следующее.

    char *screen = 0xA0000;
    *screen = 'A';

Чтобы немного продвинуться, (без проверки ошибок или границ).

#define COLUMNS 80
#define ROWS    25
#define VIDMEM_BASE 0xA0000

// Row and column are 1 based
// Note that in a real implementation you would make sure row/column are within the screen bounds
// and if you were on the last row, you might scroll the screen up etc.
void writeScreen( char theChar, size_t row, size_t column )
{
    char *screenBase = VIDMEM_BASE;

    screenBase += ((row - 1) * COLUMNS) + column - 1;
    *screenBase = theChar;
}

Учитывая вышесказанное, вам придется выяснить, как это работает в вашей системе ARM, и воспроизвести его. Глядя на порт ncurses или систему Borlands conio для ARM, вы, вероятно, получите хороший старт. Я знаю, что был порт библиотеки Borland Turbo Vision для Linux, но я не уверен, что он когда-либо был перенесен в ARM. Вот ссылка на страницу sourceforge, если вам интересно. Turbo Vision в свое время был отличным графическим интерфейсом в текстовом режиме, хотя он того стоит.

Надеюсь, это поможет.

0 голосов
/ 01 декабря 2010

Я давно не работал на платформе ARM.Раньше у меня был Архимед.

Кажется, я не могу комментировать вопрос, поэтому я попрошу уточнить здесь:

Что вы используете для графики дляанимация?Я имею в виду анимированный GIF, набор растровых файлов или рисование с нуля каждый раз, что-то еще?

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

Я понятия не имею, какую библиотеку пользовательского интерфейса или что вы используете, но большинство из тех, что я когда-либо работалесть способ poll () в очереди событий.Каждый раз, когда возвращается poll (), вычисляйте время, прошедшее с момента последней перерисовки анимации, и, если оно достаточно большое, выполните следующий кадр.Если нет, уменьшите тайм-аут poll (), чтобы вы не блокировали poll () слишком долго.

В качестве альтернативы, иногда вы можете заставить ОС помещать синхронизированные события в очередь событий.Перерисовывайте кадр каждый раз, когда вы читаете один из очереди событий.Это может быть особенно полезно, поскольку, если событие медленно обрабатывает события и начинает получать резерв, об этом будет свидетельствовать замедление анимации.Т.е. спиннер будет нормально вращаться на полной скорости, медленно, когда приложение трясется и борется, и останавливается, когда приложение зависает.

Это та информация, которую вы ищете?

Какдля увеличения шагов анимации, я уверен, вы не говорите о чем-то вроде:

int step = 0;

...

step = (step + 1) % max_steps;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...