ria pc game
fle game engine - движок для создания игр
fle game engine - движок для создания игр


Balls and holes PC game / Balls and Holes PC игра
Вакансии
Игродельня
Сегодня
22 февраля 2019 21:31
Вход Регистрация Забыли пароль ?

megainformatic - Создание интернет-магазина
              Добро пожаловать в систему управления сайтом megainformatic cms !  
подробнее...

Теги создание сайтов, создание игр, дизайн, игры, информатика, уроки photshop, php, c++, музыка, delphi, cms, робосайт
Статьи сайта
megainformatic - Моделируем девушку в 3d используя 3ds max - Подготовка к моделированию ноги - готовим ширму

megainformatic - Моделируем девушку в 3d используя 3ds max - Выполняем моделирование ноги

megainformatic - Моделируем девушку в 3d используя 3ds max - Улучшаем созданную модель женской ножки

megainformatic cms stat kit

megainformatic - Подводная лодка и подводный мир

megainformatic - megainformatic cms - Форма для смены шаблонов сайта - модуль template selector

megainformatic cms social

megainformatic cms social Руководство пользователя

megainformatic - megainformatic cms - Форма для смены шаблонов сайта - модуль template selector

модуль слайдера

ТЗ на сайт коллективных покупок

модуль slider

megainformatic cms seo

Поддержка сайтом нескольких языков - модуль multi lang

Поддержка сайтом нескольких языков - модуль multi lang

megainformatic - Моделируем девушку в 3d используя 3ds max - другие статьи сборника статей - обзор

установка нового шаблона в joomla 2.5.4

Описание продукта megainformatic cms social

Описание продукта megainformatic cms social

megainformatic - ТЗ на сайт по аналогии rys-stroi.ru

megainformatic cms groupon

megainformatic - дизайн сайта строительной компании УЛЬТРА-СТРОЙ

megainformatic - Тестирование подключения платежной системы

megainformatic - Выпадающее окно регистрации на сайте

megainformatic - Тестирование подключения к платежной системе с использованием скрипта эмулятора

megainformatic - Модуль для регистрации пользователя на сайте

megainformatic - Код для модуля регистрации пользователя на сайте

megainformatic - Быстрый подсчёт ключевых слов в статье

megainformatic - Модуль подсчёта ключевых слов в статье

megainformatic - Онлайн-сервис для подсчёта статистики ключевых слов

megainformatic - Пишем слайдер на javascript с нуля

megainformatic - Логика работы слайдера на javascript

megainformatic - Пишем свою соц. сеть - модуль предложений для webjob

megainformatic - Пишем свою соц. сеть - модуль предложений для webjob - часть реализации для личного кабинета

megainformatic - Пишем свою соц. сеть - Реализация файлового хранилища предложений в csv-файле

megainformatic - Тестирование подключения к платежной системе ЕДИНЫЙ КОШЕЛЕК (w1.ru) с использованием скрипта эмулятора

megainformatic - Пишем свою cms - шаг 1

megainformatic - Пишем свою cms - шаг 2

megainformatic - Пишем свою cms - шаг 3

megainformatic - бесплатная флеш игра freeway fury 2 - разработчик Serius Games

megainformatic - бесплатные флеш игры сторонних разработчиков

megainformatic - Как я осваивал Flash

megainformatic - Список уроков на тему создания flash приложений и игр

megainformatic - Как я осваивал Flash - шаг 2 - Основы создания простейших flash - игр

проект портала Идеи Комфорта

megainformatic - игра Веселый Буквоежка

megainformatic - игра Веселый Буквоежка

megainformatic - Использование cron, crontab и планировщика задач

megainformatic - Совместное использование jquery и mootools или других js-фреймворков

megainformatic - Модуль content php performer для megainformatic cms

megainformatic - Пишем компактный слайдер

megainformatic - Что нужно знать для создания сайта ?

megainformatic - Что нужно знать для создания сайта ? Глава 2 - Кодировки и DOCTYPE

megainformatic - Что нужно знать для создания сайта ? Глава 3 - Идём дальше - нанизываем новый код - где объявляются стили css и код javascript

megainformatic - Что нужно знать для создания сайта ? Содержание

megainformatic - Что нужно знать для создания сайта ? css - стили

подробнее

     
  [Назад] [Все уроки] [Далее]  
     
 

9/06/2008 Воспроизведение в игре музыки в формате XM.

Для воспроизведения используется компонент MiniFMOD 1.78

[downloads:14]

переписанный на Delphi. Успешно используется в примере игры XTropper - http://XProger.mirgames.ru (автор XProger).

 

Рассмотрим поэтапно как реализовано воспроизведение музыки в указанном примере игры.

В модуле XTropper.dpr -

uses {...} MiniFMOD in 'MiniFMOD\MiniFMOD.pas',

l_sound,

между операторами begin и end. -

snd_Init;

Game_Init;

внутри цикла "прокачки" сообщений -

Game_Update;

snd_Update;

 

function WndProc -

Case message of
WM_QUERYENDSESSION, WM_CLOSE:
begin
{...}
snd_deInit;

{...}

if inMenu then
Menu_Message(message, wParam, lParam);

 

 

Старт воспроизведения музыки - в модуле XTropper.dpr -

между begin и end.

Game_Update -

в модуле l_game.pas -

Game_Update -

XMStop

XMPlay

{...}

Game_Init > MenuInt

 

Процедуры GameStart и GameFree -

в модуле l_menu.pas -

Menu_Init, MenuLoad

{...}

procedure Menu_Message -

Game_Start;

 

Обобщим полученную информацию -

Исходный код для работы с MiniFMOD находится в папке MiniFMOD

в этой папке находятся

MiniFMOD.obj - по всей видимости скомпилированный в MSVS файл библиотеки работы с minifmod

MiniFMOD.pas - интерфейсы для использования данной библиотеки

Так и есть в комментариях к файлу MiniFMOD.pas приведено следующее -

{
MiniFMOD 1.7 is a free C library from Fairlight
Technologies (http://www.fmod.org) which allows
you to play .XM files. Compiled into a .OBJ,
it is then possible to use it in any language
that supports OMF .OBJ files.

Here is the Delphi header I made for it.

Twis (June 2004).
}

Т.е. это говорит именно о том, что obj-файл это объектный файл библиотеки minifmod 1.7

Следует отметить, что minifmod не гарантирует 100% точности и идентичности звука XM-файла по сравнению скажем с воспроизведением в плеере или трекере. Об этом свидетельствуют заметки в readme содержащиеся в дистрибутиве midifmod178.rar (85 Кб). Однако на первых порах для игры данная библиотека думаю подойдет.

В реальных тестах и проверках будет ясно. Посмотрим.

 

Продолжим обобщения -

Итак, в папку проекта игры нужно добавить папку MiniFMOD содержащую указанные выше 2 файла.

Далее -

в раздел uses модуля проекта или модуля приложения добавить ссылку на файл MidiFMOD.pas

модуль l_sound ? Суть вопроса: Как происходит воспроизведение музыки при помощи MiniFMOD -

путем вывода результата непосредственно на звуковую карту или же требуется предварительный рендеринг в звуковой буфер DirectSound с последующим выводом полученного через IDirectSound?

Поскольку в модуле l_sound содержится ссылка на MidiFMOD.pas, то скорее всего это 2 вариант, т.е.

при помощи miniFMOD XM файл сначала выводится в выделенный звуковой буфер IDirectSoundBuffer, а затем полученный кусочек уже воспроизводится средствами IDirectSound.

Однако эксперимент с комментированием ссылки на uses MiniFMOD внутри модуля l_sound показывает, что ошибок компиляции не возникает. Следовательно l_sound не использует MiniFMOD и ссылка возможно осталась ошибочно.

Смотрим далее -

 

из-за указанной особенности в uses также нужно добавить использование модуля l_sound.pas написанного XProger

Где-то после создания окна приложения, например в OneTimeSceneInit вызвать процедуры подобные snd_Init и Game_Init.

внутри метода Run -

перед FrameMove или даже внутри FrameMove вызываем процедуры подобные

Game_Update;

snd_Update;

Следует обратить внимание на то, что - в модуле проекта XTropper.dpr между begin и end. -

{...}

while not isQuit do
begin
while PeekMessage(msg, 0, 0, 0, PM_REMOVE) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;

if not glActive then
WaitMessage
else
begin
Time := GetTimer;
Time_Delta := Time - Time_Old;

flag := false;
for i := 1 to Time_Delta div 20 do
// будет ли влиять указанная периодичность на качество воспроизведения???
begin
Game_Update;
snd_Update;
flag := true;
end;

if flag = true then
Time_Old := Time - Time_Delta mod 20;
// или это не окажет влияния???
Game_Render;
end;
end;

{...}

 

внутри MsgProc -

при WM_DESTROY -

//WM_QUERYENDSESSION, WM_CLOSE: //в модуле проекта XTropper.dpr закрытие происходит по данным сообщениям

Game_Free;
//внутри данной процедуры происходит освобождение объекта XM-плеера - XMFree.

snd_deInit;

 

Это всё что касается создания, обработки и уничтожения объектов воспроизведения музыки.

Теперь необходимо рассмотреть детальную реализацию того, что происходит внутри данных процедур, касающееся загрузки конкретных XM-модулей, запуска и останова проигрывания, регулировки громкости и других особенностей.

 
Использование модуля l_sound.pas можно пока оставить без изменений, поскольку он выполняет роль фактического плеера, служит для управления звуком (запуск, стоп, громкость и т.п.) на уровне возможностей IDirectSound. Единственно, что поскольку l_sound.pas ориентирован на работу со старыми интерфейсами из модуля DirectX.pas (версии DirectX 6), то в этом плане возможно потребуется его переделка.
 

Game_Init -

Menu_Init -

XMLoadFromFile('data\music\baits.xm');
XMPlay;

Game_Update -

XMStop //вероятно так сделано для того, чтобы очередной кусок был выведен в звуковой буфер с опережением

XMPlay //т.е. сначала кусок выводится потом работа продолжается, а затем выполняется останов и снова вывод новой порции в буфер Это предположение, посмотрим что на практике!!!

 

 

Game_Free -

XMStop;
XMFree;

В приложении XTropper воспроизведение музыки управляется через объект меню -

внутри функции обработки сообщений (function WndProc ...) -

Game_Free при сообщениях WM_QUERYENDSESSION, WM_CLOSE, а в конце ее -

if inMenu then
Menu_Message(message, wParam, lParam);

При выборе пункта меню Start - внутри указанной процедуры -

Game_Start;

Game_Start -

XMFree;
XMLoadFromFile('data\music\rave.xm');
XMPlay;

 

Внутри модуля l_menu.pas также есть процедура -

procedure Menu_Load;
begin
XMFree;
XMLoadFromFile('data\music\baits.xm');
XMPlay;
end;

Где и как она вызывается?

Ответ - она вызвается внутри модуля l_input.pas в ответ на нажатие Escape -

procedure KeyOnUp(ID: Byte);
begin
Key[ID] := false;
case ID of
VK_ESCAPE : if not inMenu then
begin
snd_StopAll(0);
Player.ResetKeys;
if Player.Health = 0 then
Menu_Load;
inMenu := true;
end;

end;
end;

 

 

Теперь рассмотрим работу со звуком - использование модуля l_sound.pas в приложении XTropper -

Рассмотрение пока не требуется, т.к. XM воспроизводится без IDirectSound. Однако таким образом не используются все преимущества IDirectSound. В частности отсутствует возможность регулировки громкости музыки.

 

Попробуем использовать возможности MiniFMOD в имеющемся объеме для воспроизведения музыки.

Оказалось достаточно даже следующего способа работы:

Создаем 2 метода -

function TD3DGameApp.InitMusic: HResult;
begin
result := S_OK;

XMLoadFromFile('Media\Music\wizard_morning.xm');
XMPlay;
end;

procedure TD3DGameApp.FreeMusic;
begin
XMStop;
XMFree;
end;

 
И вызываем их где-либо, например в конце CreateSoundObjects и DestroySoundObjects. Всё. При старте приложения сразу же включается музыка.
 

Если требуется загрузка и воспроизведение иной мелодии, то достаточно вызвать следующую последовательность команд -

XMStop;
XMFree;

XMLoadFromFile('Media\Music\wizard_morning.xm');
XMPlay;

 

Возникает воспрос как регулировать громкость мелодии?

Поскольку miniFMOD скорее всего воспроизводит музыку через средства Windows без DirectSound, то теоретически должна быть возможность регулирования громкости за счет доступа к глобальному регулятору громкости системы. Есть ли такая возможность в модуле MMSystem.pas ?

 

Организация проигрывания различных музыкальных тем в разных частях приложения:

При старте приложения должна играть 1 тема,

При выходе в главное меню - другая

При переходе к игровой сцене - тема для нее.

На стадии загрузки игровой сцены должна загружаться мелодия для нее.

При старте игровой сцены должно включаться воспроизведение.

При выходе из игровой сцены воспроизведение должно останавливаться.

При удалении игровой сцены должен очищаться объект проигрывателя XM-мелодии.

Остановка и последующий старт воспроизведения не приводят к моментальному появлению звука. Имеет место некоторая задержка. Это свидетельствует о том, что для моментального включения/отключения мелодии нужно воспользоваться регулировкой громкости.

В модуле MMSystem.pas действительно есть функция - function waveOutSetVolume

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

Можно тажке посмотреть как реализовано управление громкостью в мультимедиа-плеере TMediaPlayer. Это ничего не дает. Там нет таких процедур!!!

Однако читая документацию по waveOutSetVolume, а также просматривая код модулей MMSystem.pas и MiniFMOD.pas обнаруживаем, что

1) громкость регулируется для локального экземпляра звука - значит это то, что нам нужно.

2) экспорты некоторых функций - в модуле MiniFMOD.pas являются сходными из аналогичных модуля MMSystem.pas Это еще раз подтверждает, что музыка воспроизводится минуя DirectSound обращаясь напрямую к системным функциям мультимедиа. Это же дает зацепку о способе регулировки звука при помощи указанного метода.

waveOutSetVolume требует 2-х параметров:

HWAVEOUT hwo, - обработчик устройства воспроизведения
DWORD dwVolume - громкость - младшее слово - левый канал, старшее - правый.

[далее] - о воспроизведении музыки при помощи библиотеки OggVorbis

 
     
  [Назад] [Все уроки] [Далее]  
     
подробнее

Что нужно знать для создания сайта ? Стандартные шрифты для сайта

[к содержанию]

Статья Ерошенкова Сергея - http://techmeat.net/about

источник статьи: http://techmeat.net/standartnye-shrifty-dlya-sajta.html

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

Стандартные шрифты:

1. Arial
2. Verdana
3. Times
4. Times New Roman
5. Georgia
6. Trebuchet MS
7. Sans
8. Sans
9. Comic Sans MS
10. Courier New
11. Webdings
12. Garamond
13. Helvetica

Тоже стандартные шрифты, но не для всех ОС:

1. Palatino Linotype / Palatino

Приятный шрифт с засечками, поддерживаемый Windows и MAC. Его можно использовать вместо привычных нам шрифтов семейств Georgia или Times. С помощью него можно написать очень стильные, заголовки.

2. Tahoma

Шрифт без засечек, схож с Arial и Helvetica, но чуть уже. Строгий, но в тоже время мягкий шрифт, прекрасно подходит для оформления текста.

3. Impact

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

4. Century Gothic

Этот шрифт поддерживается в основном лишь на OS Windows, но пользователи MAC могут использовать другой его аналог – Futura. Очень элегатный шрифт, забытый дизайнерами, но до сих пор входящий в стандартный пакет шрифтов Windows.

5. Arial Black

Крупный шрифт семейства Arial. Схож по массивности с Impact, но не такой компактный. Очень подходит для ярких заголовков.

6. Arial Narrow

Еще один шрифт семества Arial. Выручит вас в ситуации, когда необходимо уместить как можно больше текста в однйо строке – очень компактный шрифт.

7. Copperplate / Copperplate Gothic Light

Этот шрифт схож с Century Gothic, но имеет маленькие засечки. Также прексрасно подхдит для оформления заголовков. Поддерживается примерно на 80% машин MAC и 50% Windows.

8. Gill Sans / Gill Sans MT

Поддерживается в основном на OS MAC (но и прекрасно виден и в Vista). Компактный, элегантный шрифт, легко читаемый и подходящий для основного текста.


PS: Новичкам (опытные уже знают) рекомендую  прописывать шрифт в CSS, причем не по одиночке, а сгруппировав 3-4 похожих шрифта на случай отсутствия основного из них в браузере конечного пользователя:font-family: Webdings, Garamond, ‘Times New Roman’, Sans;

Статья не претендует на уникальность и не является окончательной версией. Написал больше «для себя», т.к. надоело каждый раз спрашивать Яндекс правильное написание нужного шрифта :)

спасибо Сергею, за краткую и информативную статью.

далее

[к содержанию]

подробнее

     
  [Назад] [Все уроки] [Далее]  
     
 

12/06/2008 Воспроизведение файлов в форматах *.it, *.xm, *.s3m, *.mod

Для воспроизведения используется интерфейс для библиотеки FMOD 3.75 (c) Firelight Technologies Pty, Ltd,
1994 - 2004 http://www.fmod.org

Автор конверсии на Delphi - Dragan Bocevski.

Полный список понимаемых библиотекой FMOD 3.75 файлов -

*.MOD;*.S3M;*.XM;*.IT;*.MID;*.RMI;*.SGT;*.WAV;*.MP2;*.MP3;*.OGG;*.WMA;*.ASF

 

Чем FMOD 3.75 отличается от miniFMOD?

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

FMOD 3.75 также распространяется на бесплатной основе, но возможности его несоизмеримо шире. Заметно, что качество звука воспроизводимого трека гарантированно выше, а возможности по настройкам и регулировкам - все какие только нужны: громкость, списки воспроизведения, регулировка позиции воспроизведения по паттернам, спектральный анализатор звуковой волны и многое другое, что потянет на использование уже не только в игровом проекте, но и для написания собственного медиа-плеера наподобие ModPlugPlayer или даже тректера наподобие ModPlugTracker. Правда следует отметить, что ModPlugPlayer и ModPlugTracker написаны совсем на другой основе (по крайней мере не на основе FMOD), хотя и используют те же ставшие стандартом де-факто трекерские форматы - *.it, *.xm, *.s3m, *.mod и еще целый ряд подобных им.

 

Почему бы не взять для музыки OggVorbis и ограничиться этим?

Вполне можно, разработчики современного FMOD версии 4.17 пошли еще дальше и разработали формат OXM, который еще более компактен чем оригинальные XM-файлы за счет сжатия сэмплов в формате ogg. Если Вам это нужно, то можете использовать самые свежие версии FMOD.

Мы же здесь ограничимся рассмотрением использования версии FMOD 3.75 в игровом проекте Нечто: Необъяснимое.

В этом проекте планируется использовать OggVorbis преимущественно для воспроизведения длинных речевых диалогов. FMOD 3.75 - для воспроизведения оригинальных музыкальных треков в форматах *.it, *.xm и других.

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

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

Поскольку FMOD 3.75 умеет открывать и воспроизводить и файлы в формате OggVorbis, то использование отдельной библиотеки и ее файлов не потребуется!

 
Что нужно для использования FMOD 3.75 ?
 

В первую очередь, конечно, нужно создать свои треки, например в ModPlugTracker 1.16. Есть и несколько уроков, посвященных этой проблеме - введение в трекерскую музыку, введение в ModPlugTracker 1.16 и ряд других. Если файлы содержат речь или длинные наборы звуков, то их нужно пересохранить в более компактном формате - сначала экспортировать в Wav или mp3, а затем в Ogg. Поскольку FMOD 3.75 понимает и mp3 файлы, то можно оставить в формате mp3. Однако это целесообразно делать только для записей речи. Музыкальные файлы в трекерских форматах (*.it, *.xm, *.mod, *.s3m) более компактны чем mp3 или ogg поскольку содержат только наборы сэмплов и нот, а не непрерывную звуковую дорожку, которая должа играть на протяжении определенного времени как это имеет место в wav, mp3 и ogg. Правда mp3 и ogg позволяют сильно сократить объем по сравнению с wav. Но все-равно они проигрывают в объеме трекерским файлам.

Таким образом получается следующая картина - для коротких звуков лучше использовать формат wav, который легко воспроизводится средствами IDirectSound. Для более длинных звуков или записей речи нужно использовать mp3 или ogg. И наконец музыку, написанную в трекере можно использовать в своем собственном формате, учтя лишь тот факт, что размеры входящих в мелодию сэмплов должны быть не слишком большими, чтобы общий объем не превышал скажем 4Mb, а то и еще меньше. Иначе дистрибутив игры, особенно распространяемой через сеть, разрастется до непомерных размеров, а это актуально лишь для CD и DVD-версий игры. Игры же распространяемые по сети желательно делать как можно меньшими.

 
На заре создания сайта Мега Информатик автором уже был создан компонент SXModPlayer2 на основе библиотеки MPPSDK.DLL, но по некоторым причинам - качество звука и некоторые ограничения не дают возможности полноценно использовать его в качестве успешного плеера музыки в игровых проектах. Главным образом из-за отсутствия открытого кода по библиотеке mppsdk.dll. Есть правда открытый код ModPlugTracker 1.16, но он написан на C++, знатоком которого автор к сожалению не является.
 
По этим причинам разыскивался аналогичный компонент и им стал FMOD 3.75.
 
Итак, перейдем к рассмотрению работы с библиотекой FMOD 3.75
 

Для начала разберемся как это сделано в примере из дистрибутива http://www.fmod.org/index.php/release/version/fmodapi375win.zip -

допустим мы распаковали содержимое данного архива в папку fmodapi375win\

тогда мы рассмотрим сейчас реализацию примера из папки -

fmodapi375win\samplesdelphi\FMod

 

Здесь находится файл проекта testbed.dpr который без проблем открывается из Delphi 7.

Открываем этот файл из Delphi.

 
В опциях проекта указываем ссылку на папку Search path - ..\..\api\delphi; (Project > Options > Directories\Conditionals)
 
 

Из папки fmodapi375win\api копируем файл fmod.dll в папку fmodapi375win\samplesdelphi

В опциях проекта в поле Output directory укажите ..\ (см. рисунок) для того, чтобы скомпилированный exe-файл попал в папку fmodapi375win\samplesdelphi уже содержащую необходимую ему dll.

 

Нажимаем ОК, выполняем компиляцию.

Если всё сделано верно Вы должны получить следующее сообщение -

 
 
Если Вы уже догадались, как исправить данную ошибку, то сделайте это сами.
 

Если нет, то вот что нужно сделать -

Дело в том, что в данном массиве содержится на 1 меньше элемент, чем описано в его начале. Просто найдите тип TFSoundOutputTypes и обратите внимание какие константы описаны там.

Скопируйте элемент FSOUND_OUTPUT_PSP, вставьте его в массив OutputTypes который давал ошибку, заключив в кавычки и вставив после 'FSOUND_OUTPUT_GC' -

'FSOUND_OUTPUT_PSP',

Сохраните и снова откомпилируйте проект. Теперь результат должен быть ОК.

 
Запустите полученный в папке fmodapi375win\samplesdelphi файл testbed.exe
 
 
Откройте какой-либо трекерский файл (*.it, *.xm, *.s3m или *.mod) нажав кнопку Load. Если под рукой нет ничего подходящего можете скачать примеры треков.
 
Теперь можете нажать кнопку Play и попробовать регулировать громкость, переключаться на последующие паттерны (-/+). Можно щелкнуть по окошку спектрального анализатора - Click for spectrum. Кнопочка Config позволит Вам выбрать другое устройство (драйвер) воспроизведения звука и кое-какие параметры фильтрации.
 
Сравнив звучание одной и той же мелодии например в трекере ModPlugTraker, а затем в данном тестовом приложении приходим к выводу, что оно более чем превосходит все наши ожидания, в чём-то даже звучание превосходит оригинал.
 
Рассмотрим как реализованы вызовы интерфейсов FMOD 3.75 в примере данного приложения.
 

Проект testbed.dpr

Модуль main.pas

В методе создания окна формы - procedure TfrmMain.FormCreate

FMOD_Load(nil); метод загрузки динамической библиотеки - возвращает значение о том, загружена она или нет

Далее следует сравнение версий API в исходных файлах и версии библиотеки dll

{ Check version numbers }
if FMOD_VERSION > FSOUND_GetVersion then
begin
Application.MessageBox(PChar(Format('API version %3.2f is newer than DLL version %3.2f', [FMOD_VERSION, FSOUND_GetVersion])), 'Version mismatch', MB_OK or MB_ICONERROR);
Halt;
end;

Инициализируется FSound. FSound управляет параметрами звуковых буферов, в которые поступают результаты вывода звуковых потоков от FMusic. Т.е. объект FMusic получив it или ogg файл сначала выводит его в отведенный буфер производя микширование (в случае трекерского модуля) или декодирование в случае mp3 или ogg. Полученный в буфере кусочек звука воспроизводится средствами звука Windows или DirectSound - в зависимости от того, какой драйвер (устройство) для вывода звука будет выбрано.

Для начала выбираются настройки по умолчанию -

{ Initialize FSOUND }
try
if not FSOUND_SetOutput(FSOUND_OUTPUT_DSOUND) then
//вывод через IDirectSound
raise Exception.Create('FSOUND_SetOutput failed');
if not FSOUND_SetDriver(0) then
//первое в списке устройство вывода
raise Exception.Create('FSOUND_SetDriver failed');
if not FSOUND_SetMixer(FSOUND_MIXER_QUALITY_AUTODETECT) then
//автоопределяемое качество микширования
raise Exception.Create('FSOUND_SetMixer failed');
if not FSOUND_SetHWND(Handle) then
//устанавливается обработчик окна приложения
raise Exception.Create('FSOUND_SetHWND failed');
except
Application.MessageBox(FMOD_ErrorString(FSOUND_GetError), 'Initialization', MB_OK or MB_ICONHAND);
raise;
end;

Если все прошло гладко, то FSound инициализируется со следующими параметрами - частота дискретизации микширования стерео-сигнала 22050 Гц, количество программных аудио-каналов - 128, флаги - 0

if not FSOUND_Init(22050, 128, 0) then
begin
Application.MessageBox(FMOD_ErrorString(FSOUND_GetError), 'FSOUND_Init', MB_OK or MB_ICONHAND);
Halt;
end;

 

Очищается список воспроизведения - количество файлов не должно превышать 512. К слову сказать, FMOD умеет выводить полифонию, т.е. файлы, содержащиеся в списке могут воспроизводиться одновременно! Это очень удобно, особенно с той точки зрения, когда нужно будет чтобы играла музыка и в то же время персонаж что-нибудь говорил. Это не потребует создания отдельных объектов fmod!

{ Initialize song list to empty }
for Index := 0 to MAX_SONGS - 1 do
begin
FSongs[Index].Module := nil;
FSongs[Index].Stream := nil;
FSongs[Index].Channel := -1;
end;

Номер текущего трека, число треков, состояние CD-плеера - FMOD умеет работать и с CD!!!

FTrackNumber := 0;
FNumTracks := 0;
FCDPaused := False;
FCDPlaying := False;

 

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

FSpectrum := TMiniSpectrum.Create(nil);
FSpectrum.Parent := pnlSpectrum;
FSpectrum.Align := alClient;
FSpectrum.Enabled := False;
FSpectrum.OnClick := pnlSpectrumClick;

 
Оставшиеся строки кода актуальны только для примера testbed.dpr
 
[далее] - продолжаем рассмотрение работы с FMOD 3.75 из проектов Delphi
 
[Назад] [Все уроки] [Далее]
 
     
     
     
подробнее


[к содержанию] [другие статьи Тимонина Андрея]

DirectX9. Создаем первое приложение.

автор: Тимонин Андрей

дата публикации на сайте Мега Информатик: 18.11.2012

Добро пожаловать в цикл моих уроков посвященных программированию.

На написание этой статьи меня вдохновил блог о создании игр с нуля, который можно посмотреть по следующей ссылке mindillusion.ru.

Здесь мы продолжаем работать с Direct X9 и создадим свое приложение на основе созданного нами класса.

Результат наших действий будет такой, как на скриншоте.

И так, перейдем к делу... Для начала, нам необходимо создать окно. Используем Win32 Api фунции. Мой базовый класс для упрощения создания таких приложений.

class BaseWindowClass {
protected:
WNDCLASS baseWndClass;
HWND baseHWindow;
MSG baseMessage;

float dx, dy; //смещение координат Direct3D относительно координат окна
float clientWidth, clientHeight; //длина и высота окна

public:
//конструктор
BaseWindowClass();
//деструктор
virtual ~BaseWindowClass();

/*Этот метод создает окно.
Параметры:
hInstance - идентификатор приложения
szTitle - заголовок приложения
iWidth - ширина окна
iHeight - высота окна
*/
bool Create(HINSTANCE hInstance, LPCWSTR szTitle,
DWORD iStyle = WS_OVERLAPPEDWINDOW | WS_VISIBLE,
int iWidth = CW_USEDEFAULT,
int iHeight = CW_USEDEFAULT);
//оконная процедура
static LRESULT CALLBACK WndProc(HWND hWindow, UINT iMessage,
WPARAM wParam, LPARAM lParam);
//Этот метод запускает цикл обработки сообщений
void Run();
//Этот метод выполняет обработку сообщений
virtual bool MessageHandler(UINT iMessage, WPARAM wParam,
LPARAM lParam);
//Абстрактный метод. Предназначен для рисования в окне.
//Вызывается в цикле сообщений.
virtual void Render(float ElapseTime) = 0;
virtual void FrameMove(float ElapseTime)=0;

//этот метод выполняет инициализацию Direct3D
bool initD3D();
//этот метод настраивает устройство Direct3D
void setMatricesAndRenderStates();

};

А теперь посмотрим на реализацию методов.

BaseWindowClass::BaseWindowClass() {}

//-----------------------------------------------------------------------

BaseWindowClass::~BaseWindowClass()
{

//удаляем класс окна
UnregisterClass(L"BaseWindow", baseWndClass.hInstance);
}

Создание окна осущесттвляется таким образом.

bool BaseWindowClass::Create(HINSTANCE hInstance, LPCWSTR szTitle,
DWORD iStyle, int iWidth, int iHeight)
{
//заполняем структуру с параметрами класса окна
baseWndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
baseWndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SPACE));
baseWndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
baseWndClass.hInstance = hInstance;
baseWndClass.lpfnWndProc = WndProc;
baseWndClass.lpszClassName = L"Base Window";
baseWndClass.lpszMenuName = NULL;
baseWndClass.cbClsExtra = 0;
baseWndClass.cbWndExtra = 0;
baseWndClass.style = 0;

//пробуем зарегистрировать класс окна
if(!RegisterClass(&baseWndClass))
{
//если не получилось, генерируем исключение
Space::ExceptionBase e(CLASSREGISTRATIONERROR, L"Не могу зарегистрировать класс");
throw e;
}

//пробуем создать окно
baseHWindow = CreateWindow(L"Base Window", szTitle, iStyle,
CW_USEDEFAULT, CW_USEDEFAULT,
iWidth, iHeight, NULL, NULL,
hInstance, (void*)this);
//в случае неудачи генерируем исключение
if(baseHWindow == NULL)
{
Space::ExceptionBase e(WINDOWCREATIONERROR, L"Не могу создать окно");
throw e;
}
//пробуем установить заданный текст в заголовке окна
if(!SetWindowText(baseHWindow, szTitle))
{
//если не получилось, генерируем исключение
Space::ExceptionBase e(SETTITLEERROR, L"Не могу изменить текст в заголовке окна");
throw e;
}

return 0;
}

Окно создано. Пришло время узнать, как же будем происходить рендер. И где будет формироваться каждый кадр нашего приложения.

Операционная система Windows общается со своими клиентскими приложениями посредством сообщений. А значит, нам необходимо обрабатывать эти сообщения и между делом выводить наше, сформированное в заднем буфере изображение на канву окна.

CALLBACK Функция WndProc выглядит у нас таким образом

LRESULT CALLBACK BaseWindowClass::WndProc(HWND hWindow,
UINT iMessage, WPARAM wParam, LPARAM lParam)
{
//создаем указатель на данный экземпляр класса
BaseWindowClass *baseWnd = NULL;
bool beProcessed = false;

//обрабатываем принятое сообщение
switch(iMessage)
{
//это сообщение отправляется при создании окна
case WM_NCCREATE:
//изменяем атрибут данного окна на значение, указанное в параметре
//(lParam) сообщения (указатель на данные, которые используются для
//создания окна)
SetWindowLong(hWindow, GWL_USERDATA,
(long)(LPCREATESTRUCT(lParam)->lpCreateParams));
break;
default:
//определяем указатель на данный экземпляр класса
baseWnd = (BaseWindowClass*)GetWindowLong(hWindow,
GWL_USERDATA);
if(baseWnd != NULL)
{
//вызываем обработчик сообщений данного класса
beProcessed = baseWnd->MessageHandler(iMessage,
wParam, lParam);
}
break;
}
//если принятое сообщение не было обработано...
if(beProcessed == false)
{
//... выполняем стандартную обработку
return DefWindowProc(hWindow, iMessage, wParam, lParam);
}
return 0;
}

Цикл обработки сообщений, пока не поймаем событие закрытия окна.

void BaseWindowClass::Run()
{
MSG msg;
ZeroMemory( &msg, sizeof(msg) );
//входим в цикл обработки сообщений
while( msg.message!=WM_QUIT )
{
//читаем очередное сообщение
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
//обрабатываем его
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
float ElapseTime;
ElapseTime = Space::getElapsedTime();

//перерисовываем окно
FrameMove(ElapseTime);

Space::Graphics& gr = Space::Graphics::get();
if (!FAILED(gr.StartRender(0x00000000)))
{
Render(ElapseTime);
// закончили рендер
gr.EndRender();
}
else
gr.Reset();
}
}
}

Окно создано, события обрабатываются, осталось только создать наше Direct3D устройство и настроить матрицы проекций. Смотрим далее.

//этот метод выполняет инициализацию Direct3D и объектов игры
bool BaseWindowClass::initD3D()
{
//определяем размер клиентской части окна
RECT clientRect;
GetClientRect(baseHWindow, &clientRect);
//определяем смещение координат Direct3D относительно оконных координат
dx = (float)((clientRect.right - clientRect.left)/2);
dy = (float)((clientRect.bottom - clientRect.top)/2);
//сохраняем размер окна
clientWidth = dx * 2;
clientHeight = dy * 2;

// Инициализируем графику
if (!Space::Graphics::get().Init(baseHWindow, clientWidth, clientHeight))
return FALSE;

return TRUE;
}

Устройство создано, осталось его настроить.

//этот метод настраивает устройство Direct3D
void BaseWindowClass::setMatricesAndRenderStates()
{
Space::Graphics& gr = Space::Graphics::get();

//начинаем рендер. Очищаем буфер кадра и заливаем черным цветом
if (!FAILED(gr.StartRender(0x00000000)))
{
// настраиваем рендер-стейты
gr.SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

//отключаем освещение
gr.SetRenderState(D3DRS_LIGHTING, FALSE);

//устанавливаем режим отображения как сплошной
gr.SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
gr.SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);

//разрешаем Z буфер
gr.SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);

//настроим Z буфер на запись
gr.SetRenderState(D3DRS_ZWRITEENABLE, TRUE);

D3DXMATRIX mat, matViewProj, matProj, matView;
D3DXMatrixIdentity(&mat);

//определяем размер клиентской части окна
RECT clientRect;
GetClientRect(baseHWindow, &clientRect);
//определяем смещение координат Direct3D относительно оконных координат
dx = (float)((clientRect.right - clientRect.left)/2);
dy = (float)((clientRect.bottom - clientRect.top)/2);
//сохраняем размер окна
clientWidth = dx * 2;
clientHeight = dy * 2;

// матрицы вида и проекции
D3DXMatrixTranslation(&matView, 0, 0, 0);
D3DXMatrixOrthoLH(&matProj, clientWidth, -clientHeight, 0, 10);

// получаем матрицу вида/проекции
D3DXMatrixMultiply(&matViewProj, &matView, &matProj);

// настраиваем фильтрацию текстуры
gr.SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
gr.SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
gr.SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);

// включаем альфа-блендинг
gr.SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
gr.SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
gr.SetRenderState( D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA );
}

}

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

FrameMove и Render. У меня получился такой класс.

class RenderWindow : public BaseWindowClass
{
private:

//этот метод освобождает все созданные объекты
void ReleaseAll();

public:
//конструктор
RenderWindow(void);
//деструктор
virtual ~RenderWindow(void);
//обработчик сообщений пользователя
virtual bool MessageHandler(UINT iMessage, WPARAM wParam,
LPARAM lParam);
//этот метод рисует очередной кадр
virtual void Render(float ElapseTime);
virtual void FrameMove(float ElapseTime);

void CreateScene();

};

Что прописывать в конкретном методе, решать вам. А я покажу, как я создавал этот класс в стандартной функции main - главной функции приложения.

//точка входа в программу
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,
LPSTR szCmdLine, INT iCmdShow)
{
try
{
std::setlocale( LC_ALL, ".ACP" );
//создаем экземпляр класса игры
RenderWindow game;
//создаем окно
game.Create(hInst, L"Pandora 1.0b",WS_CAPTION|WS_SYSMENU /*WS_OVERLAPPEDWINDOW*/ | WS_VISIBLE,
800, 600);
//инициализируем Direct3D
game.initD3D();
//устанавливаем матрицы и настраиваем параметры отображения сцены
game.setMatricesAndRenderStates();
game.CreateScene();
//запускаем цикл обработки сообщений
game.Run();
}
//ловим исключения, и выводим сообщения об ошибках
catch(Space::ExceptionBase err)
{
MessageBox(NULL, (const wchar_t*)err, L"Ошибка", MB_ICONERROR);
}
catch(...)
{
MessageBox(NULL, L"Неизвестная ошибка", L"Ошибка", MB_ICONERROR);
}
return 0;
}

 

На этой позитивной ноте я статью заканчиваю. С уважением, Андрей.

 

[к содержанию] [другие статьи Тимонина Андрея]



обзор #108 игры созданные megainformatic часть 1


просмотров: 552




обзор #108 игры созданные megainformatic часть 2


просмотров: 548




обзор #108 игры созданные megainformatic часть 3


просмотров: 546




обзор #108 игры созданные megainformatic часть 4


просмотров: 546




обзор #108 игры созданные megainformatic часть 5


просмотров: 546




обзор #108 игры созданные megainformatic часть 6


просмотров: 546




обзор #108 игры созданные megainformatic часть 7


просмотров: 546




обзор #108 игры созданные megainformatic часть 8


просмотров: 547


megainformatic live chat
Начать беседу
X
 

Оставленные комментарии



fle game engine - движок для создания игр
fle game engine - движок для создания игр


Something: Unexplained 2 captive of desires / Нечто: Необъяснимое 2 в плену желаний
Костя Коробкин Комикс Коллекционное издание - 6 комиксов, 81 страница, 220 mp3 треков
megainformatic Размещение баннерной рекламы у нас
Время загрузки: 1,6286