MIDletPascal: курс молодого программиста

(Окончание. Начало в №33)

Вот и последняя часть нашего курса по MIDlet Pascal. Сегодня научимся работать с ресурсными файлами и поговорим о мобильной клавиатуре.


Файлы

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

Для хранения используемых файлов в папке проекта есть специальная папка res. Но просто скопировать туда нужный файл и работать с ним не получится - надо ещё и подключить его к программе. Делается это следующим образом: в главном меню выбираем "Project -> Import resource file...". Появится обычное окошко для выбора файла, выбираем нужный файл и жмём "Открыть".

 

Рассмотрим на примере основные функции и процедуры для работы с файлами и ресурсами. Вам надо подключить три файла: текстовый файл, в котором будет две строчки текста (после которых обязательно должна идти еще одна пустая строка), музыкальный файл и картинку.

program ResourceSample;
 var text:Resource;
  img:image;
  exit:command;
  str1,str2:string;
begin
 text:=OpenResource('/tekst.txt');
 if (ResourceAvailable(text)) then
  begin
   str1:=ReadLine(text);
   str2:=ReadLine(text);
   CloseResource(text);
  end;
 DrawText(str1,0,130);
 DrawText(str2,0,140);
 img:=LoadImage('/image.png');
 DrawImage(img,0,0);
 if OpenPlayer('/wrong.mid','audio/midi') then
  if SetPlayerCount(1) then
   if StartPlayer then DrawText('продолжительность - '+
    IntegerToString(GetPlayerDuration)+' мсек.',0,150);
 exit:=createCommand('Выход',CM_SCREEN,1);
 addCommand(exit);
 Repaint;
 while exit<>GetClickedCommand do delay(100);
end.

Начнём с переменных: "text" предназначена для хранения указателя на текстовый файл, "img" - для хранения изображения, "exit" - для команды, по нажатию которой мы будем завершать работу программы, а "str1" и "str2" будут содержать строки из текстового файла.

Сначала открываем текстовый файл (функция OpenResource), далее проверяем, открылся ли он корректно - ResourceAvailable должна вернуть значение "true". Если не произошла ошибка при открытии, читаем строки из файла функцией ReadLine (если читать больше нечего, вернётся пустая строка). Кроме того, MIDlet Pascal позволяет читать ресурсы побайтно функцией ReadByte(res:resource):integer - она считывает следующий байт из указанного ресурса или возвращает "EOF", если произошла ошибка или читать нечего. Закрываем ресурс функцией CloseResource и рисуем на экране полученные строки с помощью DrawText. Функцией LoadImage загружаем рисунок в переменную "img" и сразу рисуем его на экране в координатах "0,0".

Далее в программе идет работа с музыкой. Каждая из используемых функций, кроме GetPlayerDuration, возвращает "true", если действие завершилось удачно, или "false", если где-то произошёл сбой. OpenPlayer открывает указанный в первом параметре музыкальный файл в аудиоплеере, второй параметр может иметь одно из следующих значений:

  • audio/x-wav - для проигрывания wav-файлов;
  • audio/basic - для проигрывания au-файлов;
  • audio/mpeg - для проигрывания mp3-файлов;
  • audio/midi - для проигрывания MIDI-файлов.

Стоит предупредить, что музыка работает только на телефонах с поддержкой MIDP-2.0, поэтому в Properties надо изменить MIDP-version на MIDP-2.0. Функция SetPlayerCount устанавливает, сколько раз музыка будет проигрываться (значение "-1" означает, что музыка будет играть постоянно). Эта функция должна быть использована после OpenPlayer, но перед StartPlayer. StartPlayer начинает проигрывать файл, загруженный в OpenPlayer, StopPlayer останавливает проигрывание. Функция GetPlayerDuration возвращает продолжительность музыки (в миллисекундах), воспроизводимую плеером. Стоит сказать, что проигрывание музыки идёт как отдельный процесс, т.е. программа продолжает работу параллельно. Дальше выводится продолжительность музыки на экран, создаётся команда для выхода из программы и перерисовывается экран. В цикле "while" ожидается получение команды "exit".

Хочу сказать, что в MIDlet Pascal есть редактор изображений вроде Paint, в котором можно создавать и изменять картинки. Поддерживаются только изображения типа png. Не стоит забывать о цветопередаче - ведь у каждого телефона она может быть разной.


"Управляй мной"

Вот мы и подошли к самому интересному, а именно - к работе с клавиатурой и джойстиком. Функций для доступа к клавиатуре три. GetKeyClicked возвращает код (тип "Integer") последней нажатой клавиши или KE_NONE, если нажатий не было. GetKeyPressed возвращает код (тип Integer) нажатой в данный момент клавиши или KE_NONE. Для стандартных клавиш существуют следующие константы: KE_KEY0, KE_KEY1, KE_KEY2, KE_KEY3, KE_KEY4, KE_KEY5, KE_KEY6, KE_KEY7, KE_KEY8, KE_KEY9, KE_STAR, KE_POUND

К сожалению, возвращаемые коды могут различаться для разных устройств. Чтобы решить эту проблему, используется функция KeyToAction, которая переводит код клавиши в условный код игрового действия. KeyToAction может вернуть одно из следующих значений: GA_NONE, GA_UP, GA_DOWN, GA_LEFT, GA_FIRE, GA_GAMEA, GA_GAMEB, GA_GAMEC, GA_GAMED

Рассмотрим следующий пример: мы двигаем чёрный квадратик по экрану.

program Sample;
 var x,y,key:integer;
begin
 x:=0;
 y:=0;
 while key<>GA_FIRE do
  begin
   SetColor(255,255,255);
   FillRect(0,0,240,320);
   SetColor(0,0,0);
   FillRect(x,y,10,10);
   Repaint;
   Delay(100);
   Key:=KeyToAction(GetKeyClicked);
   if key=GA_LEFT then x:=x-10;
   if key=GA_RIGHT then x:=x+10;
   if key=GA_UP then y:=y-10;
   if key=GA_DOWN then y:=y+10;
  end;
end.

Две первые переменные используются как координаты для квадрата, а третья - для хранения последней нажатой клавиши. В начале программы присваиваем координаты левого верхнего угла дисплея. Далее начинается цикл, "пока не нажата клавиша джойстика". В этом цикле рисуем белый прямоугольник на весь экран, который заменяет фон, а потом рисуем чёрный квадратик с координатами "x,y". Затем переменной Key присваиваем код последней нажатой клавиши, который сразу же переводим в условный код игрового действия. А после этого, в зависимости от нажатой клавиши, изменяем координаты квадратика. Добавлю от себя, что в этом алгоритме есть существенный недочёт - нет проверки выхода за пределы экрана.

На этом статьи по программированию на мобильном Паскале заканчиваются. Тех знаний, что вы теперь имеете, вполне хватит для написания собственных программ. Надеюсь, вам понравилось!

Резидент Николай,
rezidentnik@gmail.com

Версия для печатиВерсия для печати

Номер: 

39 за 2009 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!