Четверг, 25.04.2024, 07:20

Delphi

Приветствую Вас Гость

Поиск
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня были:
Самые активные пользователи

Меню сайта
Категории каталога
Основы [8]
Исходники [2]
Наш опрос
Вы программируете на Delphi
Всего ответов: 180
Главная » Статьи » MIDletPascal » Исходники

Звук и Музыка
Игры, как правило, состоят не только из поочерёдно сменяющихся картинок, но и имеют хоть какое-то, но звуковое сопровождение. 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.


Категория: Исходники | Добавил: Ivin (02.04.2008)
Просмотров: 3819 | Рейтинг: 4.0/1 |