Игры, как правило, состоят не только из поочерёдно сменяющихся картинок, но и имеют хоть какое-то, но звуковое сопровождение. MIDletPascal поддерживает проигрывание всего одного аудиопотока! Т.е. слышать звук разрывающихся снарядов, под пятую сонату Бетховена не получится. Это есть жирный минус и один из многих камней в огород MIDletPascal. Впрочем, разработчики оставили возможность подключения своих модулей написанных на Java… но мы же пишем на Pascal! ;)
Итак, мы имеем возможность проигрывания midi, wav, mp3 и au файлов. Но в то же время, накладываются ограничения самого телефона, и об этом не стоит забывать. Существует возможность loop’инга, т.е. проигрывания одного и того же звука несколько раз подряд.
Прежде чем что-либо писать, необходимо найти какой-нибудь midi файл, и обозвав его “music.mid” добавить в ресурс проекта. Теперь можно приступать к написанию кода. Далее опишу код простой программки выводящей пучок “болтающихся под музыку щупалец”, заодно познакомив с некоторыми математическими функциями:
program vis;
const S = 12; // Кол-во щупалец N = 8; // Кол-во звеньев в каждом из них
var i, j : Integer; x, y : Real; tx, ty : Real; k, d : Real; // Углы поворота звеньев относительно друг-друга a : array [1..N] of Real; // Длина одного звена len : Real; begin // Инициализация звука if not OpenPlayer('/music.mid', 'audio/midi') then // загрузка музыки Halt; // ошибка при загрузке (не поддерживается midi формат или звук отключен) if not SetPlayerCount(-1) then // проигрывать бесконечное число раз Halt; if not StartPlayer then // начать проигрывание Halt;
// Нам необходимо создать что-то графическое... // Расчёт длины звена, в зависимости от размеров экрана if GetWidth > GetHeight then len := GetHeight/2/N else len := GetWidth/2/N; randomize; k := random(360) * pi / 180; d := pi * 2 / S; // просто оптимизиация // Главный цикл repeat // Расчёт коэфицента поворота if random(50) = 0 then k := random(360) * pi / 180; // Поворот всех щупалец a[1] := a[1] + sin(k)/10; // Интерполяция углов между щупальцами for i := 2 to N do a[i] := a[i] + (a[i - 1] - a[i]) * 0.1; // Рисуем результат (под музыку ;) SetColor(0, 0, 0); FillRect(0, 0, GetWidth, GetHeight); // Стираем всё for j := 0 to S - 1 do begin x := 0.5 * GetWidth; y := 0.5 * GetHeight; for i := 2 to N do begin SetColor(255, trunc(255 - 255 * i/N), 255); // Немного школьной тригонометрии :) tx := x + cos(j * d + a[i]) * len; ty := y + sin(j * d + a[i]) * len; DrawLine(trunc(x), trunc(y), trunc(tx), trunc(ty)); x := tx; y := ty; end; end; // Вывод на дисплей repaint; until GetKeyClicked = KE_KEY0; // Закрыть приложение при нажатии "0" StopPlayer; end.