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


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

megainformatic - Уроки Photoshop - Рисуем волка из мультфильма стр 3
           
подробнее...

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

megainformatic - Уроки Photoshop - Рисуем и Анимируем на AllSoft.ru

megainformatic - DirectX 9c - Изучаем пример MultAnimation

megainformatic - megainformatic cms Система Управления Контентом

megainformatic - Темы для WordPress

megainformatic - Что нужно для создания собственного сайта ?

megainformatic - Макет дизайна Вашего сайта

скачать megainformatic cms

megainformatic - Итоги 2010 года

megainformatic - Что нужно для создания собственного сайта ?

megainformatic - как создать инсталлятор для собственной cms

megainformatic - Новости - страница 2

Нововведения в megainformatic cms

Web Администрирование

Уроки Верстки

Система автоматизированной е-майл рассылки

Система автоматизированной е-майл рассылки

megainformatic - Выгрузка файла на сайт

megainformatic - выпадающее меню на html и css

megainformatic - Использование checkbox

Краеугольная особенность работы Web-form на примере смены состояния checkbox

Технологии WEB

Технологии WEB - AJAX-запросы

Часто Задаваемые Вопросы

Продукты

Проблемы с кодировками при отображении страниц

игра Нечто: Необъяснимое Нить Накала - "в плену желаний"

Система Автоматизации Доставки Электронных Заказов megainformatic cms e-pro

megainformatic cms e-pro Автоматизация Обработки Уведомлений о Заказах по партнерским программам

megainformatic cms e-pro Автоматизация Обработки Уведомлений о Заказах по партнерским программам

webinformatic: Музыкальная страничка трэкера

megainformatic - Создание музыки и звука

webinformatic: Создание музыки и звука: урок 2

megainformatic - Создание музыки и звука: урок 3 - настройка Impulse Tracker для работы в WinXP

megainformatic - Создание музыки и звука: урок 4 - Введение в Mod Plug Tracker

megainformatic - Создание музыки и звука: урок 5 - Первая композиция в Mod Plug Tracker

megainformatic - Создание музыки в Impulse Tracker 2.14 - урок 6 - Ввод Нот

megainformatic - Создание музыки в Impulse Tracker 2.14 Первая мелодия

megainformatic - Создание музыки в Impulse Tracker 2.14 Настройка параметров сэмплов

megainformatic - Создание музыки и звука: теория и практика создания трэкерской музыки

megainformatic - Инструкция по оплате услуг средствами WebMoney

Основы работы в Microsoft Visual Studio 2008 и DirectX 9 (DX SDK Aug 2008)

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

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

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

Введение в программирование игр на С++ для платформы DirectX 9 Программирование игр в directx. Hello, World!

Введение в программирование игр на С++ для платформы DirectX 9 Разбираем конструкции языка C++ на примере работы в Microsoft Visual Studio 2008

Разбираем конструкции языка C++ на примере работы в Microsoft Visual Studio 2008 - Урок 1 Основные операторы языка C++

Разбираем конструкции языка C++ на примере работы в Microsoft Visual Studio 2008 - Урок 1 Основные операторы языка C++ (часть 2)

Урок 2 Написание Win32-приложений. Обзор стартового кода Win32-приложения. Добавление ресурса текстовая строка

Урок 3 Создание Win32-приложений. Создание меню и простых диалоговых окон.

Урок 4 Создание Win32-приложений. Стандартные диалоги. Изучение сопутствующих конструкций языка. Консольные Win32-приложения. Указатели. Ссылочный тип. Массивы.

Урок 4 часть 2 Win32. Диалог выбора цвета, смена цвета фона окна приложения

Написание приложения DirectX9c + MFC в среде MSVS 2005

megainformatic - Создание компьютерных игр на основе DirectX в среде Delphi 6, 7

megainformatic - Создание компьютерных игр на основе DirectX в среде Delphi 6, 7 - Почему избраны DX8 и Delphi ?

подробнее

Creating game on fle game engine - Simple game / Создание игры на fle game engine - Simple game

10 - Проверка столкновений



read paper in english

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





Содержание

страница 1 - Спрайты

страница 2 - Объекты

страница 3 - Наложение объектов

страница 4 - Код - Настройка параметров Scene Editor fge и написание кода для вывода спрайта шарика в вашем первом игровом приложении

страница 5 - Отображаем прыгающий шарик

страница 6 - Загрузка игровой сцены

страница 7 - Перемещения игровой сцены

страница 8 - Закрываем часть сцены от пустот при помощи черной текстуры с прорезью, ограничиваем перемещение сцены

страница 9 - Реализуем корректное попадание в ямы и около ям - определяем границы спрайтов ям и спрайта прыгаюшего шарика

страница 10 - Проверка столкновений

страница 11 - Игровой счёт, звуки, музыка

урок #2 страница 1 - Создание новых сцен для игры simple game, расширенная версия simple game extended

13. Скроллинг больших локаций

14. использование переменных в игре на c++ directx 9c

15. Мульти анимация







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

Создадим файл для определений границ

simple_game\Media\prop_desc\collision_rects_desc.txt



И определим границы -

ball; 0.0f; -0.07f; 0.08f; -0.16f; 0.5f;
hole; 0.138510f; -0.144f; 0.1f; -0.085f; 1.0f;


1 значение - это имя игрового объекта, следующие 4 параметра - его границы - левая верхняя точка - x и y, и правая нижняя - также.
Последнее значение - это масштабный коэффициент - он учитывается при вычислении границ.

Теперь создадим файл для описания свойств - для установки связи между объектами границ и игровыми объектами

simple_game\Media\prop_desc\game_object_class_properies.txt



Запишем туда -

//
// описание свойств шарика
//
begin =;
Name = ball;
Collided = true;
end =;
//
// описание свойств ямы
//
begin =;
Name = hole;
Collided = true;
end =;


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

Свойство Collided = true - означает что будет использоваться проверка коллизий или по-другому столкновений, для данного игрового объекта. Значение может быть установлено и в false. Но в контексте данного урока нам для обоих объектов нужна проверка столкновений.

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

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

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



Для реализации проверки столкновений прыгающего шарика с ямами нужно выполнить следующие действия:

В модуль

start.cpp



Подключить заголовочные файлы collision.h и game_object_properties.h -

после строки

#include "textures.h"



добавить -

#include "game_object_properties.h"
#include "collision.h"





после строки

#define SimpleGameScenesPath L"\\Media\\textures\\environment\\scenes\\simple_game\\"



добавить -

//==========================================
//
// имена файлов описаний свойств игровых объектов
// и границ для столкновений
//
//==========================================

#define GameObjectPropertyValue L"\\Media\\prop_desc\\game_object_class_properies.txt"

//индексы игровых объектов, имеющих свойства в файле свойств
#define ball_prop 0
#define hole_prop 1


Для перемещений прыгающего шарика и проверки столкновений и их обработки добавить в

start.h



После строки -

D3DXVECTOR2 m_scrCursorPos;



такой код -

//перемещения прыгающего шарика
void MoveJumpedBall();
float m_fCurrentTimer;
float m_fTimeDelay;
float m_fMoveSpeed;

D3DXVECTOR2 m_v2MoveDirs;
void ChangeMoveDirs(int Dir);

void JumpedBallContactHole();

bool m_bContactWithHoleDetected;
float m_fHoleX;
float m_fHoleY;

bool change_moved_ball_TimePause(float PauseInterval = 0.0f);
void change_moved_ball_ResetPauseTimer();
DWORD change_moved_ball_m_dwOldTime;
DWORD change_moved_ball_m_dwTime;
float change_moved_ball_m_fTimePeriod;

//переопределенная сцена и её методы

//скрываем все плашки ям (их переднюю часть)
void CreateOverridedGameScene();

CPtrArray* m_pOverridedGameScene; //массив объектов видоизмененной игровой сцены
void FreeOverridedGameScene();

//скрытие/показ указателя мыши
void HideSystemMouseCursorView(bool Hide);

//счёт попаданий в яму
int m_iHoleHits;
bool m_bInHole;

//сброс попадания в яму
bool hole_hit_TimePause(float PauseInterval = 0.0f);
void hole_hit_ResetPauseTimer();
DWORD hole_hit_m_dwOldTime;
DWORD hole_hit_m_dwTime;
float hole_hit_m_fTimePeriod;



В модуль

start.cpp



1)

Добавляем

В метод
CD3DGameApp::FrameMove



после строки

g_Splash.Anim();

код -

MoveJumpedBall();

В конец модуля

start.cpp



добавляем код -

//перемещения прыгающего шарика
void CD3DGameApp::MoveJumpedBall()
{
g_AI_Ball_Sprite.Anim();

change_moved_ball_TimePause(m_fTimeDelay);
hole_hit_TimePause(2.0f);
//проверяем контакт шарика с ямой
JumpedBallContactHole();
}


Реализацию остальных методов и их использование Вы можете посмотреть сами в коде модуля
start.cpp



Отмечу лишь, что для проверки столкновения шарика с границами ямы используется вызов функции CollisionDetected, которая проверяет пересекаются ли границы объекта ball с границами объекта hole и если да - то возвращается значение true.



Если столкновение зафиксировано - то плашка для данной ямы (её передняя часть отображается), чтобы имитировать попадание шарика в яму. Как только шарик отойдет от ямы в сторону - столкновение уже будет возвращать false и плашка для данной ямы уже отображаться не будет. Визуально шарик просто будет прыгать по поверхности ландшафта.





Скачать готовую игру simple game версия 1.0.0 4.01.2017 (без исходного кода).

Исходный код и другие полезные материалы и инструменты Вы получаете при оформлении платной подписки !


Размер: 51,8 Mb



новый современный движок для создания игр на платформе Windows Directx 9c - которая поддерживается большинством ПК.

Подробнее об оформлении подписки на fle game engine





Скачать fle game engine (полный исходный код).

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


Размер: 482 Mb



Контрольные суммы для проверки целостности скачанного архива.

CRC32: 9626C289
MD5: 7537172124F59B49431DA3CE0EE70B97
SHA-1: 951A654AFA932AAD706C090B5A37F37DD53E5920

Контрольные суммы можно проверить утилитой HashTab

После скачивания вы получите самораспаковывающийся архив. Запустите его, чтобы распаковать.

Система написана на c++ под directx 9.

Требования - наличие установленных MSVS 2005 (Microsoft Visual Studio) и DirectX SDK Aug 2008.

Для других версий MSVS и DirectX SDK могут потребоваться модификации кода !

Что включает дистрибутив ?

- Редактор сцен Scene Editor;

- пример игры simple game с полным исходным кодом;

- пошаговое описание создания примера игры simple_game - представляет набор html файлов пригодных для открытия и чтения из любого браузера;

- Coords 2D - утилиту отладки анимаций и подбора экранных координат содержит богатую библиотеку готовых примеров игровых спрайтов;

- полный исходный код fle game engine - позволит вам создать свою собственную игру, а также расширить движок необходимыми возможностями в дальнейшем, никаких ограничений на расширение нет;

- fgg_setup.exe Fly snow 3d - визуальные эффекты падающего снега/дождя и др. красивые эффекты с частицами в 2d/3d;

Скачав дистрибутив fle game engine вы можете приступить к созданию своей игры прямо сейчас !

Чтобы иметь возможность самостоятельно создать свою игру на базе примера simple_game с неограниченными возможностями дальнейшего расширения! - оформите подписку на fle game engine -


Стоимость: 600 руб.

Оформив подписку на fle game engine Вы получаете пример игры simple_game с исходным кодом, и сможете не просто прочитать всё, что описано, но и самостоятельно проделать в собственном приложении с возможностью неограниченного расширения. Также Вы получаете

Самую свежую версию Scene Editor fge 1.0.2 (на текущий момент) с поддержкой большего количества возможностей: сетка, настройки, скроллинг и другие. В бесплатной версии эти возможности не поддерживаются. подробнее о составе платной подписки.





[назад] [далее]



подробнее

     
     
  Добро пожаловать в систему управления сайтом megainformatic cms !  
     
  [к содержанию] [назад] [далее]  
     
 

7)  Создание шаблонов

 
     
 

В предыдущих уроках мы уже рассмотрели основы того, как можно подойти к созданию вашего сайта. Принципиально эти шаги являются универсальными и подойдут вам в применении к любой cms, потому что принципы использования html, css и php во всех системах подобны.

Главным отличием megainformatic cms является независимость и снятие многих ограничений на внедрение дополнительных модулей. Однако цена этому - крайняя минимализация и упрощение функционала.

 
     
  Рассмотрим каким образом можно с одной стороны немного усложнить систему, а с другой - получить некоторый набор новых возможностей.  
     
  Основная задача - это то, чтобы все страницы сайта выглядели в едином стиле, включая страницы модулей - поиск по сайту (search.php), карта сайта (map.php), модули обработки заказов (after_buy.php, after_pay_kind.php, buyer_data.php, accept_order.php).  
     
 

Казалось бы - самым простым способом является взятие необходимого кода из index.php и вставка в эти файлы. В принципе да, но не совсем так.

Если мы просто возьмем сейчас тот код, который уже есть в index.php и скопируем его и вставим в код этих модулей (еще не забудьте про соответствующие изменения), то в дальнейшем нам придется при изменении оформления - при использовании нового шаблона - вручную обновлять код html и css и во всех модулях, в который мы его вставим.

А как же сделать лучше тогда ? Спросите вы.

Воспользуемся опытом, который можно позаимствовать из других CMS. Мы конечно возьмём самый простейший вариант. И вот как он выглядит:

 
     
 

1) Сейчас у нас есть index.php, который содержит html, css код оформления нашего сайта, а также необходимый php код отвечающий за вывод контента и подключение других модулей; Модули которые я перечислил выше оформления не содержат вообще - только необходимый минимум php кода для обеспечения своей функциональности;

2) Шаг первый - мы должны разбить код файла index.php на 4 логические части -

header.php, menu.php, content.php, footer.php

эти файлы мы поместим в отдельную папку blocks

в файл header.php пойдёт весь код начиная от начала файла index.php и до строки

<div id="top"><a href="http://www.megainformatic.ru"><img src="images/skin/top.jpg" alt="создание игр, уроки, создание сайтов" width="800" height="111" border="0"></a></div>

включительно

 
     
 

в файл menu.php пойдёт весь код между строками -

<!-- ====== MENU ========= -->

<!-- ====== MENU ========= -->

 
     
 

в файл content.php нужно вставить код между строками -

начиная со строки следующей сразу же за блоком меню

<div id="infoleft">

и до второго появления строки

<!-- =============/ CONTENT ================ --> включительно !

оставшийся код пойдёт в файл footer.php

 
     
 

после того как эти файлы будут созданы, вам останется изменить код файла index.php на следующий -

 

 
     
 

<?php

/* =================================================================

megainformatic cms 16.01.2011

http://www.megainformatic.ru

Автор: Синицин Андрей Сергеевич (megainformatic)


***************************

данный файл является главной частью вашего сайта - он содержит ссылки на все остальные блоки,
отвечающие за формирование - заголовочной части (header), меню (menu), основного
информационного блока - контент (content), нижней части страницы (footer).

===================================================================
*/

include "blocks/header.php";
include "blocks/menu.php";
include "blocks/content.php";
include "blocks/footer.php";

?>

 
     
 

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

Каким образом ? А по аналогии с тем, что мы сотворили с index.php - мы разбили весь его код на 4 независимые части, которые теперь отвечают за формирование - заголовочной части шаблона сайта (header), блока меню (menu), контента (content), нижней части страницы (footer).

Значит чтобы превратить например модуль map.php в оформленный по шаблону мы вставляем в его начало следующий код

 
     
 

<?php

/* ==================================================================

megainformatic cms 16.01.2011

http://www.megainformatic.ru

Автор: Синицин Андрей Сергеевич (megainformatic)


***************************

модуль формирования карты сайта map.php

==================================================================
*/

$pagetitle_overloaded = "Мега Информатик - Карта сайта"; /*данная переменная определяет новый заголовок для страницы, иначе он берется из модуля header.php */

include "blocks/header.php";
include "blocks/menu.php";

 

?>

 
     
  Созданную карту сайта надо выводить в блоке контент (content.php), но поскольку этот блок по-умолчанию отвечает за вывод статей сайта, то мы его не можем взять, требуется его переделка и тут можно поступить двояко - либо создать видоизмененный файл content.php, назвав его как то по-другому и подключив директивой include, либо просто взять весь код оттуда и внеся изменения добавить в модуль map.php, мы так и поступим - вот что надо взять из модуля content.php -  
     
 

<div id="infoleft">

<div id="infoleft_content" align="justify">
<font color="#0000FF" size="2" face="Verdana, Arial, Helvetica, sans-serif">Сегодня</font>
<?php
$mounth = date("n");
$day = date("j");
$year = date("Y");
$time = date("G:i ");
$mounth_ru = "";
switch ( $mounth )
{
case 1: {
$mounth_ru = "января";
break;
}

case 2: {
$mounth_ru = "февраля";
break;
}

case 3: {
$mounth_ru = "марта";
break;
}

case 4: {
$mounth_ru = "апреля";
break;
}

case 5: {
$mounth_ru = "мая";
break;
}

case 6: {
$mounth_ru = "июня";
break;
}

case 7: {
$mounth_ru = "июля";
break;
}

case 8: {
$mounth_ru = "августа";
break;
}

case 9: {
$mounth_ru = "сентября";
break;
}

case 10: {
$mounth_ru = "октября";
break;
}

case 11: {
$mounth_ru = "ноября";
break;
}

case 12: {
$mounth_ru = "декабря";
break;
}

}
echo "<font color=\"#0000FF\" size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\"> $day $mounth_ru $year года $time </font><br>";
?>
Здравствуйте!
Вы попали на исследовательско-креативный сайт Мега Информатик. Наша цель
- создание, накопление и популяризация знаний в области создания компьютерных
игр, а также собственно создание игр.

</div>

</div>

<div id="inforight">

<div id="inforight_content" align="justify">
Мега Информатик функционирует с 20 февраля 2006 года, когда был создан первый
сайт на хостинге pochta.ru. Много воды утекло с тех пор. Уже нет хостинга
boom.ru, на котором также размещался сайт, хостинг pochta.ru объединился
с qip.ru. Много событий произошло и в жизни самого сайта. О самых последних
новостях Вы сейчас и узнаете.
</div>

</div>



<!-- ====== CONTENT ================= -->

<div id="content-container" align="justify">

<div id="content">

 
     
  далее вставляем код, который непосредственно отвечает за оформление и вывод карты сайта  
     
 

<table width="85%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>&nbsp;</td>
<td><font color="#000000" size="2" face="Verdana, Arial, Helvetica, sans-serif">Карта
Сайта megainformatic.ru</font></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>

<?php
include "config.php";

$pageid = 1;
$pagetitle = "сайт Мега Информатик - Новости";
//for ( $pageid = 1; $pageid <= 62; $pageid++ )
while ( $pagetitle != "" )
{
$pagetitle = "сайт Мега Информатик - Новости";

if ($rc = mysql_connect($dbhost, $dbuser, $dbpassw))
{
mysql_select_db($dbsite);
$table = "papers";

$sql = "SELECT * FROM $table WHERE pageid = '$pageid'";
$s = mysql_query($sql);

$a = mysql_fetch_array($s);
$pagetitle = $a[pagetitle];


if ($pagetitle == "" )
{
$pageid = 2;
$pagetitle = "сайт Мега Информатик - Новости";
break;
}

mysql_free_result($s);
}

echo "<tr>
<td>&nbsp;</td>
<td><p><a href=\"index.php?page=".$pageid."\"><font size='2'

face='Verdana, Arial, Helvetica, sans-serif'>".$pagetitle."</font></a></p></td>
<td>&nbsp;</td>
</tr>
";
$pageid++;
}

?>

</table>

</div>

</div>

<!-- =============/ CONTENT ================ -->

 
     
  и как обычно подключаем вывод нижней части страницы -  
     
  <?php
include "blocks/footer.php";
?>
 
     
  Другие модули оформить по шаблону можно аналогично.  
     
 

В следующих наших уроках нас ждут обновления системы на тему -

- переключение шаблонов через админку сайта, новый вариант системы шаблонов;

- отслеживание в админке списка статей, проектов, пользователей;

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

     
     
  уроки Photoshop - чудеса  
  Купить программу Уроки Photoshop - Чудеса  
  Уроки Photoshop - Чудеса  
     
  Нет никого и ничего мудрее природы. Человек - дитя природы.  
     
 

Вот и пришло время чудес. Попробуем сотворить что-нибудь красивое и интересное. В этом нам поможет профессиональная программа для обработки графики - Adobe Photoshop.

Какую версию использовать ? Любую доступную Вам - можно 6, 7, 8 (CS), 9 (CS 2), 10 (CS 3), CS4, CS5 и т.д. Кому что нравится.

Принципы рассмотренные здесь справедливы для любой из этих версий.

 
     
 

Какие специальные знания потребуются ? Думаю, что никаких особых знаний не потребуется, единственное, я надеюсь, что Вы обладаете хотя бы базовыми знаниями работы на ПК, т. е. Вам не нужно объяснять как установить Photoshop, как запустить его, как создать папку или файл, открыть изображение из Photoshop.

Во всём остальном можно будет разобраться, по ходу работы.

 
     
  В этом сборнике статей мы рассмотрим следующие темы:  
     
  - Коллаж от нуля; Коллаж от нулявозьмем фото и на его примере создадим пейзаж, затем добавим еще новых элементов и превратим в коллаж  
     
  - Рисуем девушку; Рисуем девушкукак нарисовать девушку взяв за основу одну или несколько фотографий  
     
  - Считаем звезды; Считаем звездысоздаем изображения космоса, звёзд и туманностей  
     
  - О, эта морская стихия; как создать коллаж на морскую тематикукак создать коллаж на морскую тематику  
     
  - Подводный мир; Подводный мирпродолжаем погружение в морские пучины  
     
  - Сны наяву; рисуем сказочный пейзаж райских лазурных берегов рисуем сказочный пейзаж райских лазурных берегов  
     
  - Дорогами исканий; дороги поисков приведут нас к созданию таинственного леса дороги поисков приведут нас к созданию таинственного леса  
     
  - Путешествие; Путешествиеотправляемся в путешествие по 2d- и 3d-мирам  
     
  - Мудрость природы;  
     
  - Шаг за шагом;  
     
  - Вселенная и космос;  
     
  - Грани мироздания;  
     
  - Красоты мира;  
     
  - Родной край;  
     
  - Удивительный мир растений;  
     
  - Загадки мира насекомых;  
     
  - Шум большого города;  
     
  - Праздник всегда с тобой !  
     
     
     
     
     
     
 

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

Спасибо за внимание и желаю Вам творческих успехов !!!

 
     
подробнее

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

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 с нужными индексами.

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

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

megainformatic api получения готового решения для решения различных задач возникающих при создании сайта



Что такое megainformatic api ?

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

Особенность всех решений.

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

Если решение требует каких-то внешних действий - например решение для регистрации пользователя нуждается в занесении учетной записи пользователя ожидающей активации в специальную таблицу, тогда предполагается что эти внешние действия должны быть реализованы на внешнем уровне, который использует данное api. Само решение в этом случае только предоставляет какой-то результат проверки: была ли попытка регистрации пользователя успешной.

Как воспользоваться megainformatic api для решения собственных задач в области разработки сайтов и вопросов тесно с ними связанных ?

Сначала Зарегистрируйтесь, авторизуйтесь на сайте, а затем Получите VIP.

Сразу же после этого вы можете использовать megainformatic api в своих веб-приложениях, указывая в качестве api_id id вашего аккаунта.

Задача Task Решение Solution
     
1. Валидация e-mail. Возвращает результат проверки - является ли данная строковая последовательность e-mail адресом или нет. Данное решение носит тестовый характер и служит для проверки доступности api.
api.php?api_id=5&pwd_code=cecb1d47ff6c76e0393848ddd16326b4
&solve_id=1&help=1&email=some@some.ru


Пример вызова api и получения результата:

<?php

$result_content = file_get_contents('http://megainformatic.ru/api.php?api_id=5&pwd_code=cecb1d47ff6c76e0393848ddd16326b4&
solve_id=1&help=1&email=some@some.ru');

$result = array();

if ( $result_content !== false )

{
$result = unserialize($result_content);
}

var_dump($result);

?>


посмотреть как работает пример -
test_api.php

параметр help=1 при запросах к любым решениям возвращает в переменной $param['help'] краткую справку по использованию данного решения.

2. Выполнение e-mail рассылки Выполняется рассылка email по указанному списку email адресов.
api.php?api_id=5&pwd_code=cecb1d47ff6c76e0393848ddd16326b4
&solve_id=2&help=1&maillist=some@some.ru,some2@some.ru
&letter=тестовое письмо&config=email_from:mix2@varve.ru,email_title:Предложение по развитию и поддержке вашего сайта,email_copy:cyberdjo@varve.ru


Более подробно об использовании данного решения можно узнать указав параметр help=1 (в ссылке-примере он указан)

ВНИМАНИЕ !!! Данный пример не выполняет фактической отправки писем. Решение будет работать только лично для вашего api. Подробнее см. в личном кабинете.
3. Proxy сервер. Позволяет скрыть ваше ip, т. к. обращение к запрашиваемому ресурсу происходит опосредованно через наш proxy. api.php?api_id=5&pwd_code=cecb1d47ff6c76e0393848ddd16326b4
&solve_id=3&help=1&url=http://megainformatic.ru/?page=19


Уважаемый посетитель, вот немного полезной инфы о Вас

Ваш ip: 34.229.175.129

Операционная среда (сведения об ОС, браузере и др.): CCBot/2.0 (https://commoncrawl.org/faq/)

4. Наш контент для вашего сайта Позволяет отображать на вашем сайте тематические статьи нашего сайта.

Обратите внимание ! В контенте статей обязательно присутствует ссылка на наш ресурс. Если она была удалена вашим обработчиком, то ваш аккаунт блокируется без возврата средств. Будьте ВНИМАТЕЛЬНЫ !!!

api.php?api_id=5&pwd_code=cecb1d47ff6c76e0393848ddd16326b4
&solve_id=4&help=1&page=157


В данном демо-примере при любых значениях page всегда отображается только контент 157 страницы. В вашем api_id будут отображаться нужные запрашиваемые страницы.

5. Парсинг или обработка входных данных с получением заданного результата.

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

В качестве примера используется регулярное выражение http[s]*://[A-Za-z0-9-_.]+.[A-Za-z0-9-_]{2,}[.]*, для поиска всех url на странице.

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

Таким образом чтобы решить задачу поиска url на странице megainformatic.ru вызываем решение со следующим набором параметров -

api.php?api_id=5&pwd_code=cecb1d47ff6c76e0393848ddd16326b4
&solve_id=5&help=1&url=http://megainformatic.ru
&algorithm=http%5Bs%5D%2A%3A%2F%2F%5BA-Za-z0-9-_.%5Dcode_meta_plus.%5BA-Za-z0-9-_%5D%7B2%2C%7D%5B.%5D%2A


Параметр algorithm как раз содержит urlencoded регулярное выражение, вместо знака плюс используется слово code_meta_plus.

Результат вернет все url, которые есть на указанной странице и соответствуют регулярному выражению.

6. Онлайн функции urlencode, urldecode api.php?api_id=5&pwd_code=cecb1d47ff6c76e0393848ddd16326b4
&solve_id=6&help=1&type=encode&data=проверка123


7. Сайт за 1 минуту.

Сайт за минуту
Пример вызова api для создания сайта.

api.php?api_id=5&pwd_code=cecb1d47ff6c76e0393848ddd16326b4
&solve_id=7&help=1&page=1


Пример скрипта - Сайт за 1 минуту, где путём обращения к megainformatic api всего несколькими десятками строк кода можно создать рабочий сайт без необходимости развертывания на собственном хостинге.

Скачать пример скрипта для создания сайта за 1 минуту

После скачивания скрипта и размещения его на localhost или на Вашем хостинге переименуйте файл в open_site.php, чтобы он мог нормально исполняться.



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

Однако выход есть - Вы можете приобрести решение в готовом виде. Эта возможность и форма её реализации пока обдумывается.

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

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



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


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