Вход в Зоопарк
gps мониторинг автотранспорта и мобильных сотрудников.
Вход > Palm OS > Май 2001г.
--
28 Мая 2001г.

Адаптация программ для PalmOS с учетом возможностей HandEra 330

автор: Сергей Столбов
версия для печати

В марте этого года компания TERMINAL Studio начала проект «BrickShooter

для всех платформ». Мы решили портировать нашу популярную игру под

различные платформы. Изначально, разумеется, была десктоповая версия для

Windows, а сейчас уже существуют версии для PalmOS и Windows CE (Pocket

PC). Именно с этих платформ мы начали, поскольку поступали множественные

просьбы от поклонников игры, которые хотели, чтобы любимая игра была с

ними везде.

Мне принадлежит идея игры, я же ее и реализовал, создав полтора года

назад Windows-версию. Но сначала вкратце о том, о какой игре пойдет речь.

Что такое BrickShooter

BrickShooter — игра, основанная на совмещении «кирпичиков»

разного цвета. Игровое пространство состоит из двух частей: поля 10х10

и периферийной части — четырех групп по десять очередей из трех кирпичей.

С периферийной части они выпускаются на поле, и каждый из них имеет направление,

в котором стремится двигаться все время. Направления отмечены на кирпичах

стрелками. Первоначально на поле стоят «кирпичики» без стрелок:

это неподвижные «кирпичики», они никогда не перемещаются.

Если путь подвижного кирпича преграждает другой кирпич, он останавливается,

но как только пусть освободится, он продолжит двигаться в том же направлении.

Если кирпич достигает противоположенной стенки, он занимает в ее очереди

ближнее к полю место.

Когда три или более кирпичей одного цвета встречаются, они взрываются,

принося игроку очки.

BrickShooter

Инвентарь

Есть много вариантов набрать инструментарий. Для написания BrickShooter

for PalmOS были использованы следующие инструменты:

  • Prc-tools — бесплатный компилятор для приложений PalmOS в C или

    C++.

  • PalmOS Emulator — незаменимое средство отладки и проверки приложения

    прежде, чем запускать его на реальном устройстве.

  • PalmOS SDK — инструментом назвать сложно, но вещь необходимая.

  • Falch.net developer studio — IDE, интегрирующаяся с Prc-tools,

    но имеющая встроенный редактор ресурсов. В принципе, без этого недешевого

    инструмента можно было бы обойтись, но он избавляет от обилия рутинной

    работы.

  • PilRC — компилятор ресурсов, который используется Falch.net.

  • Не обошлось и без редактора Paint, для редактирования монохромных

    картинок он весьма хорош.

HandEra 330

Первым делом посмотрим, какие новые функции это чудо современной техники

предоставляет, и что BrickShooter из этого использует, а что нет:

  • HiRes экран разрешением 240x320 (охвачено)
  • Возможность поворота экрана на 90, 180 и 270 градусов (не охвачено)

  • Виртуальный SilkScreen (охвачено)
  • Возможность его минимизации
  • Возможность подмены иконки калькулятора
  • Крупные иконки (охвачено)
  • Новые шрифты (охвачено)
  • Колесо и кнопка (one hand operation) (не охвачено)

1. HiRes и повороты

Поддержка этой возможности в свою очередь распадается на две задачи: во-первых,

нужно использовать высокое разрешение и, во-вторых, показать операционной

системе, что эта возможность задействована.

Начнем с первого. Прежде чем задействовать специальные экранные функции,

необходимо проверить, поддерживаются ли они. Если вызвать одну из таких

функций на устройстве, которое их не поддерживает, это его сразу «порушит».

Чтобы проверить наличие поддержки VGA-функций (так они называются), вызывают

FtrGet:

int VgaEnabled(void)

{

UInt32 version;

return HANDERA = !FtrGet(TRGSysFtrID, TRGVgaFtrNum,

&version);

}

HANDERA здесь глобальная переменная, к которой программа обращается,

когда нужно проверить, поддерживаются ли VGA функции, чтобы каждый раз

не дергать FtrGet.

Теперь при запуске программы можно проверить устройство на наличие поддержки

VGA-функций и установить необходимый режим.

if (VgaEnabled())

VgaSetScreenMode(screenMode1To1, rotateModeNone);

Первый параметр screenMode1To1 указывает на то, что окно программы не

следует растягивать в полтора раза, а второй rotateModeNone — на

то, что не нужно производить поворот экрана. Очевидно, что для того, чтобы

задействовать поворот экрана, нужно лишь изменить второй параметр.

Теперь предстоит изменить размер формы. Это также не представляет особых

трудностей:

void SizeForm(FormPtr *frmP)

{

RectangleType rect;

rect.topLeft.x = 0;

rect.topLeft.y = 0;

WinGetDisplayExtent(&rect.extent.x, &rect.extent.y);

WinSetWindowBounds(FrmGetWindowHandle(frmP),

&rect);

}

Эта функция даже представлена в «Programmer companion». Ее

же придется вызывать при изменении размеров окна при максимизации или

минимизации silkscreen, но об этом немного позже.

Что делать с такой большой формой? Тут открываются просторы для творчества.

В BrickShooter был создан новый набор «кирпичиков» и другой

графики, а при отрисовке проверяется, не на HandEra ли исполняется программа,

и если да, рисуется большая картинка по особым (практически почти что

умноженным на 1,5) координатам. Вот частный случай, рисование «кирпичика»

с игрового поля:

if (!HANDERA)

DrawBitmap(GetID(Field[i][j]),6+(I+2)*9+1,12+(j+2)*9+1);

else

DrawBitmap(GetID(Field[i][j]),8+(i+2)*14+1,16+(j+2)*14+1);

Остаются остальные формы, в которых хотелось бы просто увеличить шрифт.

Для этого предусмотрена функция VgaFormModify:

if (HANDERA)

VgaFormModify(form, vgaFormModify160To240);

Где form — указатель на активную форму. Эта функция «растягивает»

форму в полтора раза, заменяя стандартные шрифты на укрупненные, поддерживаемые

HandEra.

Теперь вторая часть: как показать операционной системе, что программа

поддерживает высокое разрешение. Ведь необходимо, чтобы в разделе Applications

утилиты Preferences программа фигурировала как HiRes. Для этого нужно

добавить HEX-ресурс. Я использую PilRC, поэтому мне необходимо было прописать

такую строчку:

HEX "sKst" ID 1000 0x00 0x00 0x00 0x00

2. Виртуальный silkscreen: поддержка минимизации

Чтобы поддерживать минимизацию и максимизацию silkscreen`а программа

должна обрабатывать событие displayExtentChangedEvent. При получении формой

такого события следует изменить ее размер и сделать перерисовку. Добавляем

такой обработчик:

case displayExtentChangedEvent:

SizeForm(FrmGetActiveForm());

FrmDrawForm(FrmGetActiveForm());

DrawField(1) // Перерисовка игрового поля

handled = true;

break;

Вот, в общем, и вся поддержка. Как использовать освободившееся место,

думаю, не нужно рассказывать.

3. Крупные иконки

Раз разрешение устройства выше, а размер экрана почти тот же, значит пиксели

меньше. Раз пиксели меньше, нужно использовать более крупные шрифты. Но

поскольку в launcher используются крупные шрифты, нужно использовать и

более крупные иконки, что HandEra и делает. Наряду с иконками размеров

22x22 и 15x9 в HandEra используются иконки 32x32 и 24x14.

Таким образом, в программу нужно включить еще три семьи иконок. Почему

три? Дело в том, что нужен еще один комплект инвертированных 32x32 иконок

для использования при замене иконки калькулятора на silkscreen. Эти семьи

должны иметь ID 2000 (32x32), 2001 (24x14) и 2002 (инвертированные 32x32).

4. Шрифты

Шрифты HandEra напрямую в BrickShooter используются только в одном месте

— в About при указании того, на каком устройстве исполняется программа.

В остальных местах они используются косвенно, при «растягивании»

формы. Шрифты вызываются очень просто, той же функцией FntSetFont, что

и на обычных устройствах:

FntSetFont(VgaBaseToVgaFont(boldFont));

В принципе, это все, что нужно для того, чтобы сказать «моя программа

поддерживает основные функции компьютера HandEra».

Заключение

Результат всех трудов, то есть саму версию BrickShooter для Palm можно

найти и загрузить с сайта Внешняя ссылкаTERMINAL

Studio.

Опубликовано с любезного разрешения автора

Ссылки по теме:

Интервью с Сергеем Столбовым



Обсудить на Базаре ручных компьютеровОбсудить на Базаре ручных компьютеров



’витырь Љенгуратора



--
Просим при воспроизведении материалов этого сайта делать ссылку на Зоопарк ручных компьютеров
Copyright © 1999-2016 Зоопарк ручных компьютеров