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


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

megainformatic - Костя Коробкин - СЕКРЕТНЫЙ ПРОЕКТ - интерактивный комикс (kk scp) - онлайн комикс - страница 1
Костя Коробкин - СЕКРЕТНЫЙ ПРОЕКТ - интерактивный комикс (kk scp) - онлайн комикс - страница 1 Предлагаем вашему вниманию онлайн-комикс Костя Коробкин - СЕКРЕТНЫЙ ПРОЕКТ - интерактивный комикс (kk scp). Привет, меня зовут Костя Коробкин ! Однажды я поездом отправился в гости к бабушке и по пути со мной приключилась эта история...
подробнее...

Теги создание сайтов, создание игр, дизайн, игры, информатика, уроки photshop, php, c++, музыка, delphi, cms, робосайт
Статьи сайта
megainformatic cms admin

megainformatic - Моделируем девушку в 3d - Подготовка 2d-эскиза тела человека

megainformatic cms stat kit

megainformatic cms seo

megainformatic - Теория и практика 3d игр - О Кватернионах

megainformatic - Теория и практика 3d игр - Основы теории векторов

megainformatic - Теория и практика 3d игр - Важные замечания

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-фреймворков

подробнее

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


Доброго времени суток, Вам, читающим эти строки !!!

Как я и обещал в предыдущей статье - Быстрый подсчёт ключевых слов в статье

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

Как всё это работает Вы можете увидеть здесь - Онлайн-сервис подсчёта ключевых слов

На самом деле логика работы такого модуля достаточно проста и сводится к следующим основным шагам:

1.) Получить текст статьи из текстового файла

2.) Убрать из текста все символы кроме букв заменив их пробелами

3.) Разбить полученный текст на массив, собирая статистику по каждому слову.

Вот собственно и всё :))))

Ну а теперь код -

<?php

// 1.) Получить текст статьи из текстового файла

//имя файла статьи берем из значения параметра pf переданного по GET
$paper_file = substr($_GET['pf'], 0, 250);
if ( !$paper_file )
$paper_file = 'home.txt';

if ( file_exists($paper_file) )
{
$content = file($paper_file);
}

?>

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

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

Этот момент уже реализован в сервисе Онлайн-сервис подсчёта ключевых слов

Но не описан здесь.

Как реализовать выгрузку файла на сайт я уже описывал в статье - Выгрузка файла на сайт

Поэтому здесь я её касаться не буду.

<?php

// 2.) Убрать из текста все символы кроме букв заменив их пробелами

//заменяем спец. символы пробелами
function kg_replace_special_chars($line)
{
//определяем длину строки
$line_len = strlen($line);
//перебираем строку
for ( $i = 0; $i < $line_len; $i++ )
{
$symbol_code = ord($line[$i]);

//если символ - это буква -
if ( ($symbol_code > 63 && $symbol_code < 91) || ($symbol_code > 95 && $symbol_code < 122)
|| ($symbol_code > 190 && $symbol_code < 256) )
{
//ничего с ним не делаем
}
else {
//заменяем на пробел
$line[$i] = ' ';
}
}

return $line;
}

?>

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

<?php

//выводим табличку кодов символов
function show_symbol_codes(&$view)
{
for ( $i = 0; $i < 256; $i++ )
{
$view .= '<span style="color: #0000ff;">' . chr($i) . '</span> --- '.$i.' ';
}
}
?>

И собственно последний шаг -

<?php

// 3.) Разбить полученный текст на массив, собирая статистику по каждому слову

$view = '';

//перебираем все строки статьи
$l = 0;
$words_statistic = array(); //найденные слова
$words_statistic_count = array(); //статистика найденных слов
foreach ( $content as $line )
{
//заменяем знаки препинания и прочие спец. символы пробелами
$line = kg_replace_special_chars($line);
//$view .= $line;

//разбиваем строку на слова
$words = explode(" ", $line);

//считаем количество слов
$words_count = count($words);
for ( $i = 0; $i < $words_count; $i++ )
{
//если слово уже есть в массиве - увеличиваем его статистику
if ( in_array($words[$i], $words_statistic) )
{
$words_statistic_count[$words[$i]] = $words_statistic_count[$words[$i]] + 1;
}
else {
//если слова еще нет в массиве слов - добавляем его туда
$words_statistic[] = $words[$i];
$words_statistic_count[] = $words[$i];
$words_statistic_count[$words[$i]] = 1;
}
}


$l++;

}


//show_symbol_codes(&$view);


//показать слова, у которых статистика больше заданного значения
$value = intval($_GET['v']);
if ( !$value )
$value = 1;

$count_words_statistic = count($words_statistic_count);
for ( $i = 0; $i < $count_words_statistic; $i++ )
{
if ( $words_statistic[$i] != '' )
{
if ( $words_statistic_count[$words_statistic[$i]] > $value )
$view .= $words_statistic[$i] . ' ' . $words_statistic_count[$words_statistic[$i]] . '|';
}
}
?>

Работать описанный код будет аналогично тому, как он работает тут - kg

И самое главное - после всех манипуляций не забудьте вывести значение переменной $view на страницу в нужном месте.

т. е. примерно так -

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
<title>Keywords Generator</title>
</head>

<body>
<?php
echo $view;

?>
</body>
</html>

Собственно теперь Вы владеете всей информацией, чтобы создать такой модуль.

Желаю Вам удачи !!! :))))

Ну а если вдруг что-то не получается или у Вас нехватает опыта, но есть маленький (или выше) :))) бюджет - обращайтесь

подробнее

Костя Коробкин - Компания Зергов (kk kz) - онлайн комикс - страница 1

Онлайн-комикс Костя Коробкин - Компания Зергов - интерактивный комикс (kk kz).

Все начиналось как обычно. Мы въехали в город.

Костя Коробкин - Компания Зергов (kk kz) - онлайн комикс - страница 1

если кликать картинку она будет последовательно меняться в размерах от 620 до 2048 пиксель.

[страница 1] [страница 2] 

подробнее

  Веселый Буквоежка Аудио Комикс  
     
 

Введение в программирование игр на С++ для платформы DirectX 9

Первый старт

 
     
 

Данный небольшой урок является введением в программирование игр на C++ для DirectX 9

Вам нужно иметь установленную среду Microsoft Visual Studio 2005 или 2008 (можно триал),

и DirectX SDK 9 версии, или лучше самой последней - DirectX SDK August 2008.

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

Запускаем Microsoft Visual Studio (далее просто MSVS для краткости), из папки с установленным DirectX SDK (далее просто DX) открываем папку с каким-либо проектом внутри папки Samples, например

DXSDK_Aug2008\Samples\C++\Direct3D\SkinnedMesh

 
     
  Для правильной сборки примера Вам нужно будет внести в проект небольшие дополнения  
     
  В окошке Solution Explorer нажимаем кнопочку проекта Skinned Mesh  
     
   
     
  Выбираем пункт меню Project > Properties  
     
   
     
  Нужно открыть узел C/C++ и для пункта General в строке Additional Include Directories указать абсолютный или относительный путь к папке из DXSDK_Aug2008\Include. Мы выполнили указание пути к папке с заголовочными файлами, необходимыми для компиляции dx-приложения.  
     
  аналогично для узла Linker, пункт General в строке Additional Library Directories указать путь к папке DXSDK_Aug2008\Lib\x86. Это делается для указания пути к библиотекам dx которые потребуются при сборке directx приложения  
     
  Жмем ОК, выполняем сборку Build > Build Solution  
     
  В папке проекта SkinnedMesh появится папка Debug содержащая отладочную откомпилированную версию exe-файла  
     
  Для изменения на Release выбирайте конфигурацию Release, снова задавайте пути к папкам заголовков и библиотек и снова выполняйте сборку  
     
   
     
  При этом готовый модуль будет помещен в папку Release  
     
  Вы справились с первым, самым самым начальным уроком программирования directx на c++  
     
  Далее мы познакомимся с тем, как расширить пример и внести в него свои коррективы  
             
  [назад] [далее] [к содержанию]
 
подробнее

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

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

продолжение...

 
[назад]
 

Теперь рассмотрим код, который должен осуществляться при уничтожении приложения - во время закрытия окна формы в данном примере -

procedure TfrmMain.FormClose

 
FMUSIC_StopAllSongs(); //останавливаем все играющие звуковые файлы
for Index := 0 to MAX_SONGS - 1 do
begin
if FSongs[Index].Module <> nil then
begin
FMUSIC_FreeSong(FSongs[Index].Module);
//освобождаем ресурсы памяти от трекерских файлов и
end
else if FSongs[Index].Stream <> nil then
begin
FSOUND_Stream_Stop(FSongs[Index].Stream);
//файлов-потоков (таких как wav, mp2, mp3, ogg и подобных)
FSOUND_Stream_Close(FSongs[Index].Stream);
end;
end;
FSpectrum.Free;
//удаляем объект спектрального анализатора

FMOD_Unload; //и выгружаем библиотеку fmod.dll из памяти

 

Мы выяснили что должно происходить во время старта и уничтожения приложения.

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

 

загрузка - procedure TfrmMain.btnLoadClick

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

SongCount := lbxFiles.Items.Count;

if SongCount = MAX_SONGS then
begin
Application.MessageBox(PChar(Format('Limit of %d songs reached', [MAX_SONGS])), 'Load error', MB_OK or MB_ICONHAND);
Exit;
end;

 

Для очередного элемента открытых файлов -

Пробуем открыть файл как трек, а затем как поток

Stream := nil;
Module := FMUSIC_LoadSong(PChar(dlgOpen.Files[Index]));
if Module = nil then
begin
Stream := FSOUND_Stream_Open(PChar(dlgOpen.Files[Index]), FSOUND_NORMAL or FSOUND_LOOP_NORMAL, 0, 0);
end;

Если никак не удалось - снова предупреждение

if (Module = nil) and (Stream = nil) then
begin
Application.MessageBox(FMOD_ErrorString(FSOUND_GetError), 'Load error', MB_OK or MB_ICONHAND);
Continue;
end;

 

Если трек загрузился, то установить громкость для данного трека на максимум, а шаг панорамы на 15%

if Module <> nil then
begin
FMUSIC_SetMasterVolume(Module, 255);
if (FMUSIC_GetType(Module) = FMUSIC_TYPE_MOD) or (FMUSIC_GetType(Module) = FMUSIC_TYPE_S3M) then
FMUSIC_SetPanSeperation(Module, 0.15); // 15% crossover
end;

 

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

FSongs[SongCount].Module := Module;
FSongs[SongCount].Stream := Stream;
FSongs[SongCount].Playing := False;

lbxFiles.Items.Add(ExtractFileName(dlgOpen.Files[Index])); //эта особенность актуальна лишь для примера testbed.dpr
lbxFiles.ItemIndex := SongCount;
//имя файла добавляется в список и текущим в списке становится данный файл

 

После этого вызывается псевдо-щелчок по файлу. Это приводит к считыванию текущих параметров из модуля (потока) данного файла, но это уже более актуально для примера testbed.dpr, хотя что-то может пригодиться и в игровом приложении

{...}

lbxFilesClick(nil);

 

выгрузка мелодии из памяти -

procedure TfrmMain.btnDeleteClick

определяем текущий элемент списка и останавливаем,

Index := lbxFiles.ItemIndex;
if Index < 0 then
Exit;

btnStopClick(nil);

 

а затем удаляем его -

lbxFiles.Items.Delete(Index);
// сдвигаем нижележащие элементы на освободившуюся позицию
if lbxFiles.Items.Count > 0 then
begin
if Index < lbxFiles.Items.Count - 1 then
begin
for Index2 := Index to lbxFiles.Items.Count - 2 do
FSongs[Index2] := FSongs[Index2 + 1];
end;
if Index < lbxFiles.Items.Count then
lbxFiles.ItemIndex := Index
else
lbxFiles.ItemIndex := lbxFiles.Items.Count - 1;
end;
lbxFilesClick(nil); //оcвежаем параметры для нового текущего файла

 

Воспроизведение мелодии -

procedure TfrmMain.btnPlayClick

Выбранная мелодия останавливается, если она уже играла

Index := lbxFiles.ItemIndex;

if Index < 0 then
Exit;

if FSongs[Index].Playing then
btnStopClick(Sender);

Включаем воспроизведение текущей мелодии списка

if FSongs[Index].Module <> nil then
begin
FSongs[Index].Playing := FMUSIC_PlaySong(FSongs[Index].Module);
if not FSongs[Index].Playing then
Application.MessageBox(FMOD_ErrorString(FSOUND_GetError), 'Play song', MB_OK or MB_ICONHAND);
end

 

или потока, если это поток

else if FSongs[Index].Stream <> nil then
begin
FSongs[Index].Channel := FSOUND_Stream_Play(FSOUND_FREE, FSongs[Index].Stream);
FSongs[Index].Playing := FSongs[Index].Channel >= 0;
if not FSongs[Index].Playing then
begin
Application.MessageBox(FMOD_ErrorString(FSOUND_GetError), 'Play stream', MB_OK or MB_ICONHAND);
end

 

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

else
begin
FSOUND_SetPan(FSongs[Index].Channel, FSOUND_STEREOPAN);
FSOUND_SetVolume(FSongs[Index].Channel, 255);
end;

 

Остановка воспроизведения -

procedure TfrmMain.btnStopClick

Определяем текущую мелодию

Index := lbxFiles.ItemIndex;

if Index < 0 then
Exit;

Если это трекерский модуль - применяем команду остановки для него

if FSongs[Index].Module <> nil then
FMUSIC_StopSong(FSongs[Index].Module)

если это потоковое аудио - применяем другую команду остановки
else if FSongs[Index].Stream <> nil then
FSOUND_Stream_Stop(FSongs[Index].Stream);

Текущий канал потока - неопределен, индикатор проигрывания сброшен
FSongs[Index].Channel := -1;
FSongs[Index].Playing := False;

 

Регулировка громкости текущей мелодии -

Если не установка регулятора глобальной громкости

if not FSettingMasterVolume then
begin

Определяем текущую композицию
Index := lbxFiles.ItemIndex;
if Index > -1 then
begin

для модуля применяем свою команду
if FSongs[Index].Module <> nil then
begin
FMUSIC_SetMasterVolume(FSongs[Index].Module, trkMasterVolume.Position);
lblSongMasterVolume.Caption := Format('%3.3d', [trkMasterVolume.Position]);
//это актуально для элемента управления

//регулятором
end
else if FSongs[Index].Stream <> nil then

для потока - свою
begin
FSOUND_SetVolume(FSongs[Index].Channel, trkMasterVolume.Position);
lblSongMasterVolume.Caption := Format('%3.3d', [trkMasterVolume.Position]);
//это актуально для элемента управления

//регулятором
end;
end;
end;

 

Регулировка текущего воспроизводимого паттерна в трекерском модуле -

переход к предыдущему паттерну порядка воспроизведения -

procedure TfrmMain.btnPrevOrderClick(Sender: TObject);
var
Index: Integer;
Order: DWORD;
begin

считываем текущий модуль
Index := lbxFiles.ItemIndex;
if Index < 0 then
Exit;

если это трекерский модуль - считываем текущий индекс элемента порядка воспроизведения и уменьшаем его на 1
if FSongs[Index].Module = nil then
Exit;
Order := FMUSIC_GetOrder(FSongs[Index].Module);
if Order > 0 then
FMUSIC_SetOrder(FSongs[Index].Module, Order - 1);
end;

 

для переключения на следующий паттерн всё аналогично кроме строк -

т.е. приращаем индекс на +1

if Order < FMUSIC_GetNumOrders(FSongs[Index].Module) then
FMUSIC_SetOrder(FSongs[Index].Module, Order + 1);

 

внутри метода периодической работы таймера представлены ряд интересных команд -

procedure TfrmMain.tmrMainTimer(Sender: TObject);
var
Index: Integer;
begin

для игрового проекта это по большому счету не особо нужная информация, но все-таки полезна
lblCPU.Caption := Format('%.1f%%', [FSOUND_GetCPUUsage]);
//например можно определять загруженность процессора
lblChannels.Caption := Format('%3.3d', [FSOUND_GetChannelsPlaying]);
//музыкой и количество занятых звуковых каналов

//это полезно, т.к. для музыки не существует такого понятия как FPS, зато вышеуказанные параметры могут служить в какой-то мере для целей оценки быстродействия работающего проекта
Index := lbxFiles.ItemIndex;
if Index > -1 then
begin
ShowSpectrum;
ShowDynamicSongInfo(Index);
//данный метод будет полезен с точки зрения наблюдения за текущей позицией воспроизведения
if FMUSIC_IsFinished(FSongs[Index].Module) and chkPlaylist.Checked then
//если мелодия кончилась и установлен индикатор работы в режиме плей-листа - т.е. списка воспроизведения, то переход к следующей мелодии
begin
btnStopClick(nil);
Inc(Index);
if Index >= lbxFiles.Items.Count then
Index := 0;
lbxFiles.ItemIndex := Index;
lbxFilesClick(nil);
btnPlayClick(nil);
end;
end;
{ ... }

end;

 

Конфигурирование - выбор драйвера и параметров фильтрации -

Настройки конфигурирования происходят в модуле формы TfrmConfig -

С точки зрения наших задач заслуживает внимания метод модуля config.pas -

Считываются параметры установленные в окне формы конфигуратора и применяются к объекту FSOUND.

procedure TfrmConfig.btnOkClick(Sender: TObject);
var
Flags: Cardinal;
begin
FSOUND_SetOutput(OutputTypes[cbxOutputType.ItemIndex]);
FSOUND_SetDriver(cbxOutputDevice.ItemIndex);
FSOUND_SetMixer(TFSoundMixerTypes(cbxMixerType.ItemIndex));
Flags := 0;
if chkSoftwareMIDI.Checked then
Flags := Flags or FSOUND_INIT_USEDEFAULTMIDISYNTH;
if chkGlobalFocus.Checked then
Flags := Flags or FSOUND_INIT_GLOBALFOCUS;
FSOUND_Init(OutputRates[cbxOutputRate.ItemIndex], 128, Flags);
end;

 
Оставшиеся нерассмотренными здесь методы, я думаю, Вы разберете самостоятельно.
 
Теперь переходим к практическим упражнениям - реализации использования FMOD 3.75 для воспроизведения музыки и звуков в трекерских и потоковых форматах.
 

Файл fmod.dll размещаем в папке проекта, в настройках проекта указываем ссылку на интерфейсы в delphi-исходниках - fmod375;

В секции interface

uses

добавляем ссылку на fmodtypes

В секции implementation

uses

добавляем ссылки на fmod, fmoderrors

 

Внутри класса приложения объявляем 2 метода -

//music functions
procedure InitMusicLib;
procedure FreeMusicLib;

 

Пишем реализацию данных методов -

procedure TD3DGameApp.InitMusicLib;
var
Index: Integer;
begin
FMOD_Load(nil);

{ Check version numbers }
if FMOD_VERSION > FSOUND_GetVersion then
begin
MessageBox(g_d3dApp.m_hWnd, 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;

{ Initialize FSOUND }
try
if not FSOUND_SetOutput(FSOUND_OUTPUT_DSOUND) then
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(g_d3dApp.m_hWnd) then
raise Exception.Create('FSOUND_SetHWND failed');
except
MessageBox(g_d3dApp.m_hWnd, FMOD_ErrorString(FSOUND_GetError), 'Initialization', MB_OK or MB_ICONHAND);
raise;
end;

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

{ 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;

FTrackNumber := 0;
FNumTracks := 0;

LoadPlaylist(DefaultThemes); //данный метод будет реализован далее (см. ниже)

end;

 

procedure TD3DGameApp.FreeMusicLib;
var
Index: Integer;
begin
FMUSIC_StopAllSongs;
for Index := 0 to MAX_SONGS - 1 do
begin
if FSongs[Index].Module <> nil then
begin
FMUSIC_FreeSong(FSongs[Index].Module);
end
else if FSongs[Index].Stream <> nil then
begin
FSOUND_Stream_Stop(FSongs[Index].Stream);
FSOUND_Stream_Close(FSongs[Index].Stream);
end;
end;

FreePlayList; //данный метод будет реализован далее (см. ниже)

FMOD_Unload;
end;

 
Как видим нам почти ничего даже переделывать не пришлось, только опустили кое-какой код и изменили вызовы MessageBox.
 

Я организую вызов данных методов внутри TD3DGameApp.CreateSoundObjects и TD3DGameApp.DestroySoundObjects.

Где будете делать это Вы - решать Вам. Можете поступить аналогично. Следует иметь в виду, что метод InitMusicLib должен вызываться только после того, как окно приложения будет создано и обработчик окна - m_hWnd в нашем случае обретет своё действительное значение - в противном случае будут только ошибки... ошибки... и ошибки...

 

 
Теперь реализуем загрузку нужных мелодий в список. Для удобства и наименьших изменений кода можно сделать это организовав загрузку требуемого списка мелодий из обычного текстового файла, где бы каждая строка соответствовала полному имени файла внутри дистрибутива игры. Таким способом и Вы и Ваши пользователи будут вольны не только слушать в игре то что было предопределено ее дистрибутивом, но и любые другие файлы мелодий поддерживаемых форматов.
 
Единственным ограничением списка воспроизведения является количество файлов в нем - не более 512, но это ограничение легко обойти использовав столько плей-листов сколько нужно. Конечно же в каждый момент времени работа будет осуществляться только с выбранным списком.
 

Загрузка списка мелодий из текстового файла const DefaultThemes = 'Media\Music\muzon_themes.txt'; -

Код уже должен быть Вам знаком по предыдущему повествованию, особо нового ничего нет

procedure TD3DGameApp.LoadPlaylist(PlayList: string);
var
Index: Integer;
Module: PFMusicModule;
Stream: PFSoundStream;
SongCount: Integer;
begin

создаем список строк будущего плей-листа и загружаем
FTMSPlayList := TStringList.Create;
try
FTMSPlayList.LoadFromFile(PlayList);
except
MessageBox(g_d3dApp.m_hWnd, PChar('Playlist '+PlayList+' not found!'),
'Playlist load Error', MB_OK or MB_ICONHAND);
end;

SongCount := FTMSPlayList.Count;

предупредить, если мелодий в списке больше допустимого!

if SongCount = MAX_SONGS then
begin
MessageBox(g_d3dApp.m_hWnd, PChar(Format('Limit of %d songs reached',
[MAX_SONGS])), 'Load error', MB_OK or MB_ICONHAND);
Exit;
end;

загружаем файлы списка в массив FSongs

for Index := 0 to SongCount - 1 do begin
Stream := nil;
Module := FMUSIC_LoadSong(PChar(FTMSPlayList[Index]));
if Module = nil then
begin
Stream := FSOUND_Stream_Open(PChar(FTMSPlayList[Index]),
FSOUND_NORMAL or FSOUND_LOOP_NORMAL, 0, 0);
end;

if (Module = nil) and (Stream = nil) then
begin
MessageBox(g_d3dApp.m_hWnd, FMOD_ErrorString(FSOUND_GetError),
'Load error', MB_OK or MB_ICONHAND);
Continue;
end;

if Module <> nil then
begin
FMUSIC_SetMasterVolume(Module, 255);
if (FMUSIC_GetType(Module) = FMUSIC_TYPE_MOD)
or (FMUSIC_GetType(Module) = FMUSIC_TYPE_S3M) then
FMUSIC_SetPanSeperation(Module, 0.15); // 15% crossover
end;

FSongs[Index].Module := Module;
FSongs[Index].Stream := Stream;
FSongs[Index].Playing := False;
end;
end;

 

Метод FreePlaylist выглядит совсем просто -

procedure TD3DGameApp.FreePlaylist;
begin
FreeAndNil(FTMSPlayList);
end;

 

Воспроизводим и останавливаем нужный трэк или поток по его номеру в массиве FSongs -

procedure TD3DGameApp.PlayItem(Index: Integer);
begin
if (Index < 0) or (Index > FTMSPlayList.Count-1) then
Exit;


if FSongs[Index].Playing then
StopItem(Index);

if FSongs[Index].Module <> nil then
begin
FSongs[Index].Playing := FMUSIC_PlaySong(FSongs[Index].Module);
if not FSongs[Index].Playing then
MessageBox(g_d3dApp.m_hWnd, FMOD_ErrorString(FSOUND_GetError),
'Play song', MB_OK or MB_ICONHAND);
end
else if FSongs[Index].Stream <> nil then
begin
FSongs[Index].Channel := FSOUND_Stream_Play(FSOUND_FREE,
FSongs[Index].Stream);
FSongs[Index].Playing := FSongs[Index].Channel >= 0;
if not FSongs[Index].Playing then
begin
MessageBox(g_d3dApp.m_hWnd, FMOD_ErrorString(FSOUND_GetError),
'Play stream', MB_OK or MB_ICONHAND);
end
else
begin
FSOUND_SetPan(FSongs[Index].Channel, FSOUND_STEREOPAN);
FSOUND_SetVolume(FSongs[Index].Channel, 255);
end;
end;
end;

procedure TD3DGameApp.StopItem(Index: Integer);
begin
if (Index < 0) or (Index > FTMSPlayList.Count-1) then
Exit;

if FSongs[Index].Module <> nil then
FMUSIC_StopSong(FSongs[Index].Module)
else if FSongs[Index].Stream <> nil then
FSOUND_Stream_Stop(FSongs[Index].Stream);
FSongs[Index].Channel := -1;
FSongs[Index].Playing := False;
end;

 

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

Сначала реализуем удаление -

 
procedure TD3DGameApp.DeleteSong(Index: Integer);
var
Index2: Integer;
begin
if (Index < 0) or (Index > FTMSPlayList.Count-1) then
Exit;

StopItem(Index);
FTMSPlayList.Delete(Index);
// Move all following items up one position
if FTMSPlayList.Count > 0 then
begin
if Index < FTMSPlayList.Count - 1 then
begin
for Index2 := Index to FTMSPlayList.Count - 2 do
FSongs[Index2] := FSongs[Index2 + 1];
end;
end;
end;

 

Теперь добавление -

function TD3DGameApp.AddSong(Filename: string): Integer;
var
Module: PFMusicModule;
Stream: PFSoundStream;
SongCount: Integer;
begin
SongCount := FTMSPlayList.Count;

if SongCount = MAX_SONGS then
begin
MessageBox(g_d3dApp.m_hWnd, PChar(Format('Limit of %d songs reached',
[MAX_SONGS])), 'Load error', MB_OK or MB_ICONHAND);
result := -1;
Exit;
end;


Stream := nil;
Module := FMUSIC_LoadSong(PChar(Filename));
if Module = nil then
begin
Stream := FSOUND_Stream_Open(PChar(Filename),
FSOUND_NORMAL or FSOUND_LOOP_NORMAL, 0, 0);
end;

if (Module = nil) and (Stream = nil) then
begin
MessageBox(g_d3dApp.m_hWnd, FMOD_ErrorString(FSOUND_GetError),
'Load error', MB_OK or MB_ICONHAND);
result := -1;
Exit;
end;

if Module <> nil then
begin
FMUSIC_SetMasterVolume(Module, 255);
if (FMUSIC_GetType(Module) = FMUSIC_TYPE_MOD)
or (FMUSIC_GetType(Module) = FMUSIC_TYPE_S3M) then
FMUSIC_SetPanSeperation(Module, 0.15); // 15% crossover
end;

result := FTMSPlayList.Add(Filename);

FSongs[result].Module := Module;
FSongs[result].Stream := Stream;
FSongs[result].Playing := False;

end;

 

Регулируем громкость - значения громкости 0 - тишина, 255 - максимум

procedure TD3DGameApp.Volume(SongIndex: Integer; Value: Byte);
begin
if (SongIndex < 0) or (SongIndex > FTMSPlayList.Count-1) then
Exit;

if FSongs[SongIndex].Module <> nil then
FMUSIC_SetMasterVolume(FSongs[SongIndex].Module, Value)
else if FSongs[SongIndex].Stream <> nil then
FSOUND_SetVolume(FSongs[SongIndex].Channel, Value);

end;

 

Регулировка позиции воспроизведения модуля по паттернам - переход к следующему/предыдущему паттерну -

function TD3DGameApp.Go2NextPattern(SongIndex: Integer): Integer;
begin
result := -1;

if (SongIndex < 0) or (SongIndex > FTMSPlayList.Count-1) then
Exit;

if FSongs[SongIndex].Module = nil then
Exit;
result := FMUSIC_GetOrder(FSongs[SongIndex].Module);
if result < FMUSIC_GetNumOrders(FSongs[SongIndex].Module) then begin
result := result + 1;
FMUSIC_SetOrder(FSongs[SongIndex].Module, result);
end;
end;

function TD3DGameApp.Go2PrevPattern(SongIndex: Integer): Integer;
begin
result := -1;

if (SongIndex < 0) or (SongIndex > FTMSPlayList.Count-1) then
Exit;

if FSongs[SongIndex].Module = nil then
Exit;
result := FMUSIC_GetOrder(FSongs[SongIndex].Module);
if result < FMUSIC_GetNumOrders(FSongs[SongIndex].Module) then begin
result := result - 1;
FMUSIC_SetOrder(FSongs[SongIndex].Module, result);
end;
end;

 

Для целей отладки будет полезно получать параметры производительности системы FMOD -

var
Index: Integer;
begin
SS_CPUUsage := Format('%.1f%%', [FSOUND_GetCPUUsage]);
SS_Channels := Format('%3.3d', [FSOUND_GetChannelsPlaying]);

if CurrentSongIndex > -1 then
begin
if FMUSIC_IsFinished(FSongs[CurrentSongIndex].Module) and PlaylistMode then
begin
StopItem(CurrentSongIndex);
Index := CurrentSongIndex;
Inc(Index);
if Index >= FTMSPlayList.Count then
Index := 0;
CurrentSongIndex := Index;
PlayItem(Index);
end
else if FMUSIC_IsFinished(FSongs[CurrentSongIndex].Module) and
not PlaylistMode then begin
PlayItem(CurrentSongIndex);
end;
end;

данный метод должен вызываться периодически (аналогично FrameMove). Здесь также проверяется режим плей-листа. Если он установлен, то будет проигрываться следующий файл списка, в противном случае будет бесконечно воспроизводиться композиция с индексом CurrentSongIndex.

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

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

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

 
     
  [Назад] [Все уроки] [Далее]  
     
     
  Веселый Буквоежка - игра  
     
 

Как создать игру ? - Программируем сами.

Рассмотрение программирования игр под DirectX 9c на C++ с использованием среды разработки MSVS 2005 или выше.

 
     
  [содержание] [назад] [страница 2] [далее]  
     
  Введение в 2d-игры - страница 2 - создание игровой оболочки как у игр от Nevosoft, Alawar и аналогичных  
     
 

Этот простой пример поможет Вам быстрее освоить программирование игр на C++.

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

 
     
  игровая оболочка  
     
 

При закрытии окна нажатием кнопки X в правом верхнем углу приложение завершает работу, а игра так и не будет запущена.

Нажатие кнопок Играть, Купить, Еще игр приводит к каким-либо действиям -

Играть - запускается игра;

Купить - отображается веб-страничка покупки;

Еще игр - отображается веб-страничка других игровых проектов;

 
     
 

Для того, чтобы реализовать такую оболочку потребуется следующее:

1) изображение основного экрана оболочки и 3 изображения кнопок Играть, Купить, Еще игр;

2) файлы в формате html, представляющие страницы Купить и Еще игр;

3) потребуется написать код, реализующий описанные возможности:

- при выборе Играть должна запускаться игра - в нашем примере пока простейший пример DirectX-приложения;

- при выборе других пунктов должны открываться соответствующие веб-странички;

 
     
  Начнём !  
     
  Скачайте указанные ниже 4 изображения на свой компьютер, внутри папки созданного MFC-проекта создайте подпапку Media\shell_window и разместите данные изображения внутри созданной папки  
     
  базовая картинка оболочки  
     
  кнопка играть  
     
  кнопка купить  
     
  кнопка еще игр  
     
 

Теперь переходим к разработке собственно оболочки - в окне Solution Explorer нашего проекта выбираем вкладку Resource View и последовательно открываем узлы

Fle2 > Fle2.rc > Dialog > IDD_FLE2_DIALOG

Пункт IDD_FLE2_DIALOG щелкаем дважды

 
     
  открытие шаблона окна диалога нашего приложения  
     
  При этом в правой части будет открыт редактор Диалоговых окон и шаблон Диалога окна нашего приложения  
     
  редактор шаблонов диалоговых окон  
     
 

Нам нужно внести в шаблон окна следующие изменения:

Убрать кнопки OK и Cancel;

Удалить метку с текстом TODO: Place dialogs controls here

После этого сохранить изменения в шаблон диалога и закрыть его.

 
     
 

Теперь нужно будет написать программный код.

Откройте файлы Fle2Dlg.h и Fle2Dlg.cpp

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

Правда если Вы дали классам окна диалога другие имена, исключив слово Dlg, то тогда Вам нужно открыть заголовочный и cpp файлы, которые содержат описание класса окна диалога Вашего приложения - объект окна диалога производится от класса CDialog -

class CFleDlg : public CDialog

 
     
 

В модуль Fle2Dlg.h добавляем следующий код -

// CFle2Dlg dialog
class CFle2Dlg : public CDialog
{
// Construction
public:
CFle2Dlg(CWnd* pParent = NULL); // standard constructor
~CFle2Dlg(); //определяем деструктор объекта CFleDlg

// Dialog Data
enum { IDD = IDD_FLE_DIALOG };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support


// Implementation
protected:
HICON m_hIcon;

// Generated message map functions
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()

private:
CImage* pBigImage; //определяем объекты, в которых будут храниться изображения
CImage* pPlayImage; //формирующие внешний вид игровой оболочки
CImage* pBuyImage;
CImage* pOthesImage;

RECT m_rcClientBounds; //размеры рабочей области окна будем хранить здесь
RECT m_rcPlayImage; //аналогично будем хранить размеры изображений
RECT m_rcBuyImage;
RECT m_rcOthesImage;

void InitShell(); //описываем метод инициализации оболочки

bool TargetBtnArea(CPoint* CursorPos, RECT* aBtnArea); //метод попадания указателя мыши в область границ одной из кнопок игровой оболочки

public:
bool bPlayBtnUp; //индикаторы отпускания левой кнопки мыши над данной кнопкой
bool bBuyBtnUp; //игровой оболочки - используются для срабатывания нажатий
bool bOthesBtnUp; //этих кнопок
private:
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);

};

 
     
  коричневым цветом выделен код, который Вы должны набрать сами, зеленым цветом я выделил поясняющие комментарии, их набирать не нужно.  
     
  в модуле Fle2Dlg.cpp пишем такой код - коричневым цветом снова выделен код, который Вы должны набрать сами, зеленым цветом я выделил поясняющие комментарии, их набирать не нужно.  
     
 

#include "stdafx.h"
#include "Fle.h"
#include "FleDlg.h"

#include "openwebpage.h" //подключаем модуль openwebpage.h и .cpp - эти модули выполняют открытие указанной веб-страницы и входят в комплект ПОЛНОГО ИСХОДНОГО КОДА игры ВЕСЕЛЫЙ БУКВОЕЖКА, который Вы можете приобрести всего за 200 рублей

о том, что еще входит в состав комплекта ПОЛНОГО ИСХОДНОГО кода Вы узнаете далее

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

 

#define bi_x 0 //определяем начальные координаты первого из 4х изображений
#define bi_y 0 //которые будут формировать внешний вид нашей игровой оболочки

//определяем имена файлов веб-страниц для кнопок <Еще игр> и <Купить>
#define OthesGamesUrl L"\\WebLinks\\index.htm"
#define BuyGameUrl L"\\WebLinks\\buy_fle.htm"

 


// CFle2Dlg dialog


CFle2Dlg::CFleDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFleDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

pBigImage = NULL; //обнуляем экземпляры объектов класса CImage
pPlayImage = NULL;
//которые мы описали в заголовочном файле
pBuyImage = NULL;
pOthesImage = NULL;

bPlayBtnUp = false; //выставляем индикатор отпускания левой кнопки мыши
bBuyBtnUp = false; //над данной кнопкой игровой оболочки в false
bOthesBtnUp = false;

}

CFle2Dlg::~CFleDlg()
{


delete pBigImage; //при удалении объекта CFleDlg из памяти нужно удалить и эти объекты
delete pPlayImage;
delete pBuyImage;
delete pOthesImage;


}

void CFle2Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CFleDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
// ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
END_MESSAGE_MAP()


// CFle2Dlg message handlers

BOOL CFle2Dlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon


InitShell();
//выполняем инициализацию нашей игровой оболочки

return TRUE; // return TRUE unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.

void CFle2Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc(this); // device context for painting //выводим изображения на поверхности окна нашей игровой оболочки

 

pBigImage->Draw(dc, bi_x, bi_y);

pPlayImage->Draw(dc, m_rcPlayImage.left, m_rcPlayImage.top);

pBuyImage->Draw(dc, m_rcBuyImage.left, m_rcBuyImage.top);

pOthesImage->Draw(dc, m_rcOthesImage.left, m_rcOthesImage.top);

CDialog::OnPaint();

}
}

// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CFleDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}

//данный метод выполняет загрузку изображений, формирующих внешний вид игровой оболочки в объекты CImage из указанных файлов. Так что если Вы в дальнейшем захотите использовать другие изображения - просто задайте соответствующие имена файлов

void CFle2Dlg::InitShell()
{

SetCurrentDirectory(AppRootDir);

pBigImage = new CImage();
pBigImage->Load(L"Media\\shell_window\\fle.jpg");

pPlayImage = new CImage();
pPlayImage->Load(L"Media\\shell_window\\fle_play.jpg");

pBuyImage = new CImage();
pBuyImage->Load(L"Media\\shell_window\\fle_buy.jpg");

pOthesImage = new CImage();
pOthesImage->Load(L"Media\\shell_window\\fle_other_games.jpg");

GetClientRect(&m_rcClientBounds); //получаем размеры рабочей области окна

int y = m_rcClientBounds.bottom - pPlayImage->GetHeight(); //координата y кнопки <Играть>
int x = 0;//координата x
m_rcPlayImage.left = x;
m_rcPlayImage.top = y;
m_rcPlayImage.right = x + pPlayImage->GetWidth();
m_rcPlayImage.bottom = y + pPlayImage->GetHeight();


x = x + pPlayImage->GetWidth(); //координата x для кнопки <Купить>
m_rcBuyImage.left = x;
m_rcBuyImage.top = y;
m_rcBuyImage.right = x + pBuyImage->GetWidth();
m_rcBuyImage.bottom = y + pBuyImage->GetHeight();

x = x + pPlayImage->GetWidth(); //координата x для кнопки <Еще игр>
m_rcOthesImage.left = x;
m_rcOthesImage.top = y;
m_rcOthesImage.right = x + pOthesImage->GetWidth();
m_rcOthesImage.bottom = y + pOthesImage->GetHeight();

}

//данный метод проверяет попадание указателя мыши в область указанной параметром aBtnArea кнопки


bool CFle2Dlg::TargetBtnArea(CPoint* CursorPos, RECT* aBtnArea)
{
if ( CursorPos->x >= aBtnArea->left &&
CursorPos->x <= aBtnArea->right &&
CursorPos->y >= aBtnArea->top &&
CursorPos->y <= aBtnArea->bottom )
return true;
else
return false;
}

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

void CFle2Dlg::OnLButtonUp(UINT nFlags, CPoint point)
{

CPoint pt = point;

bPlayBtnUp = TargetBtnArea(&pt, &m_rcPlayImage);
bBuyBtnUp = TargetBtnArea(&pt, &m_rcBuyImage);
bOthesBtnUp = TargetBtnArea(&pt, &m_rcOthesImage);

 

if ( bPlayBtnUp | bBuyBtnUp | bOthesBtnUp )
{
if ( bBuyBtnUp )
OpenSite(m_hWnd, BuyGameUrl);

if ( bOthesBtnUp )
OpenSite(m_hWnd, OthesGamesUrl);

if ( bPlayBtnUp )
{
EndDialog(IDOK);
StartD3DApp();
}
}

CDialog::OnLButtonUp(nFlags, point);
}

 


 
     
 

Несколько Важных нюансов:

1) Чтобы указанный код правильно работал нужно включить файлы openwebpage.h и openwebpage.cpp в состав Вашего проекта -

в окне Solution Explorer щелкаем правой кнопкой мыши пункт с названием проекта Fle2 и выбираем Add > New Filter

 
     
  включить файлы openwebpage.h и openwebpage.cpp в состав Вашего проекта  
     
 

Созданную группу именуем common, щелкаем по названию правой кнопкой мыши и выбираем Add > Existing Item, указываем на файлы openwebpage.h и openwebpage.cpp

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

 
     
  2) Будет не очень удобно, если exe файл Вашего проекта будет создаваться среди кучи других файлов. Рекомендую создать внутри папки проекта отдельную подпапку, а сам проект настроить таким образом, чтобы exe-файл попадал туда, т. е.  
     
 

В окне Solution Explorer выбираем пункт с названием нашего проекта - Fle2

выбираем пункты главного меню Project > Properties и в открывшемся окне настроек свойств выбранного проекта (не случайно я указал вначале выбрать Fle2 иначе откроются совсем другие свойства) выбираем пункт

Configuration Properties > General

а в окне справа в поле Output Directory указываем нужную нам подпапку для размещения exe-файла

 
     
  в окне справа в поле Output Directory указываем нужную нам подпапку для размещения exe-файла  
     
  На показанном рисунке настройка выполнена для конфигурации Debug, эту же настройку нужно сделать для конфигурации Release. И не забывайте сохранить изменения в проект - File > Save All либо используя аналогичную кнопку на панели инструментов.  
     
 

3) Откройте файл stdafx.h и добавьте в его конец строку кода -

#include <atlimage.h>

 
     
 

4) Откройте файл Fle2.h (если Ваш проект назывался не Fle2, а например, MyProj, то данный файл будет называться MyProj.h)

добавьте в его конец строки

__declspec(selectany) TCHAR AppRootDir[MAX_PATH] = L""; //рабочая папка приложения
__declspec(selectany) DWORD AppRootDirSize = MAX_PATH;

5) Откройте окно настроек проекта - нужно сначала выбрать в окне Solution Explorer пункт с названием проекта, а затем главное меню - Projects > Properties и

Configuration Properties > C++ > General

в поле Additional Include Directories

добавьте ссылку на папку common, размещенную внутри папки проекта -

common; Аналогичную настройку нужно выполнить для конфигурации Release.

 
     
  добавьте ссылку на папку common, размещенную внутри папки проекта  
     
 

6) При написании кода приведенного выше обратите внимание на имя класса, которое Вы используете

т. к. класс окна диалога в этом примере называется CFle2Dlg, то везде, где требуется указание этого имени - объявлении класса, в прототитах методов и т.д. нужно указывать его, если Вы назвали класс окна диалога по-другому - то Вам нужно везде слово CFle2Dlg заменить на имя класса, которое Вы используете в своем примере - в противном случае при компиляции (сборке) получите ошибки несоответствия.

 
     
 

7) Метод

void CFle2Dlg::OnLButtonUp(UINT nFlags, CPoint point)

нужно сформировать в форме обработчика события WM_LBUTTONUP для класса CFle2Dlg -

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

Далее В окне Solution Explorer выбираем вкладку Class View, в списке классов находим CFle2Dlg, щелкаем правой кнопкой мыши и выбираем пункт Properties, с правого края откроется новое окно, в котором нужно нажать кнопку Messages, в списке найти событие WM_LBUTTONUP и сформировать для него обработчик выбрав пункт <Add> OnLButtonUp

 
     
  В окне Solution Explorer выбираем вкладку Class View, в списке классов находим CFle2Dlg, щелкаем правой кнопкой мыши и выбираем пункт Properties, с правого края откроется новое окно, в котором нужно нажать кнопку Messages, в списке найти событие WM_LBUTTONUP и сформировать для него обработчик выбрав пункт <Add> OnLButtonUp  
     
  Теперь осталось вставить в обработчик тот самый код, который мы закомментировали.  
     
  8) При компиляции возникнет ошибка из-за отсутствия реализации функции StartD3DApp(); - просто закомментируйте эту строку кода, т. к. мы реализуем эту функцию в дальнейшем - она будет запускать игру.  
     
 

9) Для правильного функционирования кнопок <Купить> и <Еще игр> внутри папки Fle, где создается exe-файл, нужно создать подпапку WebLinks и разместить в ней два файла -

index.htm

buy_fle.htm

 
     
 

Пробуем выполнить сборку - [F7], а exe-файл ищем теперь уже внутри созданной подпапки !!!

При запуске запускается созданная нами оболочка. При нажатии мышью кнопки <Играть> приложение просто завершает работу - мы пока не реализовали запуск игры - будем это делать в дальнейшем. При нажатии на кнопки <Купить> и <Еще игр> должны открываться соответствующие веб-странички из папки WebLinks.

Работа по созданию игровой оболочки завершена! В следующем нашем уроке Мы реализуем в первом приближении работу кнопки <Играть> - будет запускаться начальное простейшее DirectX-приложение. В последующих уроках будем постепенно наращивать возможности создаваемой игры.

 
     
     
     
  Если у Вас еще остались неразрешенные вопросы - обращайтесь на наш Форум, либо на e-mail автора.  
     
     
     
     
  [содержание] [назад] [страница 2] [далее]  
     
megainformatic live chat
Начать беседу
X
 

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



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


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