Jump to content

Archived

This topic is now archived and is closed to further replies.

dmi-shef

SimConnect для траффика

Recommended Posts

Эта тема создана для размещения сообщений и обсуждения использования SimConnect для создания всех видов траффика FSX - авиационного, наземного, морского, траффика людей, животных, птиц и других подвижных объектов окружающего мира.

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

 

 

 

Для начинающих!
========================
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX .

С помощью SimConnect можно не только читать текущие значения переменных Simulation Variables, но и присваивать им данные для различных объектов FSX – пользовательским самолетам и вертолетам, AI самолетам, управляемым ATC и не управляемым АТС, наземной техникой, кораблями и другими объектами. Пользовательские значения можно присваивать и другим параметрам объектов FSX, не входящих в перечень Simulation Variables.
Присвоение и изменение исходных и текущих данных объектам FSX при запуске FSX и во время его работы позволяет создавать реалистичную обстановку для пользовательского самолета, диспетчера и в окружающей обстановке.
Для понимания организации присвоения значений переменным Simulation Variables разберем несколько примеров, переходя от простых к более сложным. Сначала научимся с помощью SimConnect устанавливать объект в сцену FSX.
Объектами в FSX являются самолеты, вертолеты, корабли, наземная техника и другие, которые имеют формат геометрической модели .mdl и описываются по правилам SimObject.
Объекты FSX с позиции SimConnect подразделяются на следующие типы (классификация объектов введена мною, в описании SDK ее нет):
группа A - пользовательские самолеты и вертолеты;
группа B - траффиковые самолеты (контролируемые AI), летающие под управлением УВД;
группа C - траффиковые самолеты (контролируемые AI), летающие по ПВП и не управляемые УВД;
группа D - траффиковые объекты (контролируемые AI), но не самолеты; к ним относятся наземная техника, корабли, суда и катера, животные и т.д.;
группа E - другие объекты, не контролируемые AI и не перемещающиеся (стационарные).

В группу А пользовательских самолетов и вертолетов могут быть включены и другие объекты, например, корабли или автомобили, если они снабжены виртуальной кабиной или панелями 2Д кабины и соответствующими органами управления.
В группу D траффиковых объектов, контролируемых AI, но не самолетов, могут включаться любые перемещающиеся объекты, в том числе люди, морские и сухопутные животные, птицы, рыбы.
В группу E стационарных объектов могут включаться любые из объектов FSX, в том числе пользовательские самолеты, если для установки стационарного объекта нет более подходящей простой модели. С точки зрения производительности FSX это не всегда рационально, однако SimConnect предоставляет пользователю такую возможность, что расширяет рамки инструментов по созданию сценариев.

Начнем с установки стационарных объектов (объектов группы E).

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 этой темы http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573

Установка стационарных объектов (группы E)

Установка стационарных объектов производится с помощью структуры SIMCONNECT_DATA_INITPOSITION и API функции SimConnect_AICreateSimulatedObject. Их описание дано ниже.
Структура SIMCONNECT_DATA_INITPOSITION определяет исходную позицию объекта и его исходные параметры (для стационарного объекта они будут постоянными).
Общая организация установки стационарных объектов такова (в пример включен тяжелый авианесущий крейсер проекта 1143).
1. Присваиваем идентификаторы стационарным объектам с указанием их типа.
2. Описываем перечисление стационарных объектов static enum DATA_REQUEST_ID1 {};
3. Создаем функцию установки позиций и параметров стационарных объектов (инициализации параметров структуры SIMCONNECT_DATA_INITPOSITION) и связи имени стационарного объекта FSX и пользовательского имени стационарного объекта. Имя функции определяем сами, например, setUpSimObjects();
4. Включаем созданную функцию setUpSimObjects() в одно из условий функции обратной связи, например, void CALLBACK ShtDispatchProcAIObjects(SIMCONNECT_RECV *pData, DWORD cbData, void *pContext) {};
Т.к. стационарный объект, как правило, должен быть загружен сразу после загрузки FSX, то нашу функцию включаем в условие SIM_START. Однако можно ее включить и в другие условия, например наступления определенного дня или часа. Это позволит обеспечить видимость объекта только в определенный период, а значит обеспечить его видимость в соответствии с сезоном или временем суток.
4. Создаем уже известную нам функцию описания запросов и обращения к функции обратной связи с именем, например, ShtEvent(), из которой будет вызываться функция обратной связи ShtDispatchProcAIObjects(), а через нее функция установки позиции стационарного объекта.
5. Включаем в главную функцию программы main функцию открытия сеанса SimConnect, нашу функцию ShtEvent и функцию закрытия SimConnect.
Программа готова.

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 этой темы http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX .

Структура SIMCONNECT_DATA_INITPOSITION

Эта структура используется для инициализации, т.е. определения исходной позиции пользовательского самолета, AI самолета или другого, не контролируемого искусственным интеллектом (AI) объекта FSX, а также для установки стационарных объектов.
Синтаксис:
struct SIMCONNECT_DATA_INITPOSITION{
double Latitude;
double Longitude;
double Altitude;
double Pitch;
double Bank;
double Heading;
DWORD OnGround;
DWORD Airspeed;
};
Параметры:
Latitude – широта в градусах;
Longitude – долгота в градусах;
Altitude – высота в футах;
Pitch – тангаж в градусах;
Bank – крен в градусах;
Heading – пеленг (курс) в градусах;
OnGround – параметр, определяющий нахождение объекта на земле или в воздухе. Для объекта на земле устанавливается 1, для объекта в воздухе – 0;
Airspeed – скорость объекта в узлах или одно из следующих значений:
INITPOSITION_AIRSPEED_CRUISE -1 устанавливает крейсерскую скорость;
INITPOSITION_AIRSPEED_KEEP -2 поддерживает текущую скорость.

Для использования структуры SIMCONNECT_DATA_INITPOSITION надо присвоить ей пользовательское имя, например:
SIMCONNECT_DATA_INITPOSITION ShtStation;

Затем каждому параметру структуры следует присвоить значение, например:

ShtInit.Altitude = 0.0; // Высота, фут
ShtInit.Latitude = 69 + (05.45/60); // Convert from 69 05.45 N
ShtInit.Longitude = 33 + (23.73/60); // Convert from 33 23.73 E
ShtInit.Pitch = 0.0; // Тангаж в градусах
ShtInit.Bank = 0.0; // Крен в градусах
ShtInit.Heading = 240.0; // Направление (курс)
ShtInit.OnGround = 1; // Объект на земле
ShtInit.Airspeed = 0; // Скорость в узлах

Особенностью параметров широты и долготы является их формат. Формат в целом понятен из примера.
Для северной широты и восточной долготы перед значением градусов можно указывать знак +, но можно и не указывать, т.к. по умолчанию широта считается северной, а долгота восточной. А вот перед минутами обязательно указывается знак широты (долготы), а сами минуты – целая и дробная часть, указывается в скобках/60.

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX .

API функция SimConnect_AICreateSimulatedObject

Эта функция используется для установки в FSX объектов, контролируемых AI, но не самолетов. К таким объектам относятся наземная техника, корабли, суда и катера и другие объекты, которые могут перемещаться в FSX (люди, животные, птицы и т.п.). Эту функцию можно использовать и для AI самолетов, но только для установки их в качестве стационарных объектов.
Синтаксис:
HRESULT SimConnect_AICreateSimulatedObject(
HANDLE hSimConnect,
const char* szContainerTitle,
SIMCONNECT_DATA_INITPOSITION InitPos,
SIMCONNECT_DATA_REQUEST_ID RequestID
);

Параметры:
hSimConnect – указатель на объект SimConnect;

szContainerTitle – строка, обозначающая имя объекта. Имя объекта должно точно соответствовать имени, указанному в строке title файла конфигурации объекта sim.cfg.
Например:
для Ground Vehicles – Automobile, FuelTruck, VEH_air_bagcart1 и т.д.;
для Boats – cargoA, cargoA_hoop, cargoB и т.д.4
для Miscellaneous – HumpbackWhale и т.д.

InitPos – специфический параметр, инициализирующий исходную позицию AI объекта, описанную структурой SIMCONNECT_DATA_INITPOSITION. Принимает одно значение – Init.

RequestID – специфический ID запроса клиентских данных, описанных структурой static enum DATA_REQUEST_ID1 {}; Внутри фигурных скобок через запятую производится перечисление ID запросов AI объектов (не самолетов), например:
static enum DATA_REQUEST_ID1 {
REQUEST_BALLOON1,
REQUEST_BELL,
REQUEST_MOONEY,
REQUEST_DOUGLAS,
REQUEST_TRUCK,
REQUEST_WHALE,
};
В этом примере запросы MONEY и DOUGLAS хотя и запрашивают самолеты, но в данном случае их модели используются как объекты, а не самолеты.

Возвращаемое значение.
Функция возвращает переменную типа HRESULT. Она может иметь два значения:
S_OK – если функция завершилась успешно.
E_FAIL – если функция завершилась неуспешно.

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX .

Пример установки стационарного объекта – такр проекта 1143.1 Киев на рейд Североморска

Данный пример написан на основе примеров SDK исключительно для иллюстрации возможностей API функций, а не для показа правильной организации программы.
Пример работает при компилировании исполняющего приложения Win32 в формате .exe. Для библиотек DLL организация запроса и чтения переменных Simulation Variables иная, хотя использует тот же набор API функций, перечислений и структур.
Установим тяжелый авианесущий крейсер проекта 1143.1 "Киев" на бочку №2 рейда Североморск.

// Описание заголовочных файлов

#include <windows.h>
...
#include "SimConnect.h"

int quit = 0;
// ----- Идентификаторы AI объектов, не управляемых УВД ------------
DWORD ShipKievID = SIMCONNECT_OBJECT_ID_USER; //такр проекта 1143.1 Киев

// ----- Структура запросов AI объектов, не управляемых УВД ------------
static enum DATA_REQUEST_ID1 {
REQUEST_KIEV, // Запрос AI такр проекта 1143.1 Киев
};

// === Функция установки начальных позиций объектов, не управляемых AI ========
void setUpSimObjects()
{
SIMCONNECT_DATA_INITPOSITION ShtInit;
HRESULT ShtHr;

// Устанавливаем такр проекта 1143.1 Киев в начальную позицию и связь его имени клиента с его именем в FSX Североморск
ShtInit.Altitude = 0.0;
ShtInit.Latitude = 69 + (05.45/60);
ShtInit.Longitude = 33 + (23.73/60);
ShtInit.Pitch = 0.0;
ShtInit.Bank = 0.0;
ShtInit.Heading = 240.0;
ShtInit.OnGround = 1;
ShtInit.Airspeed = 0;

// Связываем имя такр Киев в FSX с именем запроса
ShtHr = SimConnect_AICreateSimulatedObject(hSimConnect, "ht_kiev", ShtInit, REQUEST_KIEV);

}

// ===== Функция обратной связи ==============

void CALLBACK ShtDispatchProcAIObjects(SIMCONNECT_RECV *pData, DWORD cbData, void *pContext)
{
HRESULT ShtHr;

switch(pData->dwID) // Доступ к атрибуту через указатель pData на объект dwID, т.е. объект с ID, указанным ниже
{
case SIMCONNECT_RECV_ID_EVENT: // Перечисление для возвращения ID события
{
SIMCONNECT_RECV_EVENT *evt = (SIMCONNECT_RECV_EVENT*)pData; // Структура для возвращения ID события

switch(evt->uEventID) // Доступ к атрибуту evt через указатель на объект uEventID
{
case EVENT_SHT_SIM: // Здесь указатель на ID -> EVENT_SHT_SIM
std::cout << "\nEvent EVENT_SHT_SIM" << evt->dwData << "\n";
break;

case EVENT_SHT_SIM_START: // Здесь указатель на ID -> EVENT_SHT_SIM_START
std::cout << "\nEvent EVENT_SHT_SIM_START" << evt->dwData << "\n";
setUpSimObjects(); // Включаем установку объекта FSX
break;
}
}
break;
}


case SIMCONNECT_RECV_ID_QUIT: // Получение флага выхода из ключа switch
{
quit = 1;
break;
}
default:
break;
} // завершение switch pData->dwID
}


// ============ Функция получения запроса о событии в FSX ===========================

void ShtEvent()
{
HRESULT ShtHr;

ShtHr = SimConnect_SubscribeToSystemEvent(hSimConnect, EVENT_SHT_SIM, "Sim");
ShtHr = SimConnect_SubscribeToSystemEvent(hSimConnect, EVENT_SHT_SIM_START, "SimStart");
ShtHr = SimConnect_SubscribeToSystemEvent(hSimConnect, EVENT_SHT_SIM_STOP, "SimStop");

while (0 == quit)
{
SimConnect_CallDispatch(hSimConnect, ShtDispatchProcReadTXT, NULL); // Включаем в функцию обратной связи нашу функцию (ShtDispatchProcReadTXT) о событиях в FSX
Sleep (1);
}

}

// Главная программа С++
//--------------------------------
int __cdecl _tmain(int argc, _TCHAR* argv[])
{
ShtSimCntOpen();
ShtEvent();
ShtSimCntClose();

std::system("Pause"); // Предотвращение закрытия консольного окна
return 0;
}

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX.

Компилируем программу, устанавливаем ее в FSX. Запускаем свободный полет из Североморска-1, взлетаем и видим такр "Киев" на рейде на своем месте.

post-1097-0-72672200-1357490650_thumb.jpg

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX.

Подобным образом можно устанавливать любые стационарные объекты как на земле, так и в воздухе, например, аэростаты на привязи или "колдун".
Можно организовать сезонную смену объектов, устанавливая объект с соответствующей сезонной текстурой по условию наступления соответствующего сезона чтением значения переменной Simulation variables, показаны на скрине.
Для оптимизации производительности FSX можно установить условие видимости стационарного объекта по дальности от точки, в которой находится камера, а также видимость объекта в зависимости от погоды.
Можно устанавливать статические объекты и по другим условиям.
Похоже, что возможности SimConnect для этой задачи существенно превосходят типовые инструменты SDK и позволяют реализовать практически любые замыслы автора.

post-1097-0-35235800-1357491486_thumb.jpg

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX.

Установленные стационарные объекты можно удалить в процессе выполнения программы с помощью API функции SimConnect_AIRemoveObject.
Можно этот делать автоматически по выполнению одного из условий, а можно и по нажатию кнопки.
Описание API функции SimConnect_AIRemoveObject.

Данная функция используется для удаления объектов, созданных одной из API функций SimConnect, например, SimConnect_AICreateSimulatedObject. При этом следует учитывать, что клиентское приложение может удалить только те объекты, которые созданы данным клиентом. Иными словами, нельзя удалить объекты на другом компьютере.
Синтаксис:
HRESULT SimConnect_AIRemoveObject(
HANDLE hSimConnect,
SIMCONNECT_OBJECT_ID ObjectID,
SIMCONNECT_DATA_REQUEST_ID RequestID
);
Параметры:
hSimConnect – указатель на объект SimConnect;
ObjectID – идентификатор объекта FSX (определенный в структуре SIMCONNECT_RECV_ASSIGNED_OBJECT_ID).
RequestID – идентификатор запроса объекта, указанный в перечислении DATA_REQUEST_ID {}.
Возвращаемое значение.
Функция возвращает переменную типа HRESULT. Она может иметь два значения:
S_OK – если функция завершилась успешно.
E_FAIL – если функция завершилась неуспешно.

Пример удаления стационарного такр "Киев" с помощью API функции SimConnect_AIRemoveObject при нажатии кнопки Z (функции обработки нажатия кнопки Z приведены в предыдущем примере).

// ----- Идентификаторы AI объектов, не управляемых УВД ------------
DWORD Ship11431KievID; // такр проекта 1143.1 Киев
// ----- Запросы ID объектов ----------------------------
static enum DATA_REQUEST_ID_SIMOBJECTS {
REQUEST_1143_KIEV, // Вызов AI такр проекта 1143.1 Киев
};
void CALLBACK ShtDispatchProcObjectsAI(SIMCONNECT_RECV* pData, DWORD cbData, void *pContext)
{
HRESULT ShtHr;
switch(pData->dwID) // Доступ к атрибуту через указатель pData на объект dwID, т.е. объект с ID, указанным ниже
{
case SIMCONNECT_RECV_ID_EVENT: // Перечисление для возвращения ID события
{
SIMCONNECT_RECV_EVENT *evt = (SIMCONNECT_RECV_EVENT*)pData; // Структура для возвращения ID события
switch(evt->uEventID) // Доступ к атрибуту evt через указатель на объект uEventID
{
case EVENT_Z:
if (objectsCreated = true)
{
ShtHr = SimConnect_AIRemoveObject(hSimConnect, Ship11431KievID, REQUEST_1143_KIEV); // Удаляем запрашиваемый объект
}
break;
case SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID:
{
SIMCONNECT_RECV_ASSIGNED_OBJECT_ID *pObjData = (SIMCONNECT_RECV_ASSIGNED_OBJECT_ID*)pData;
switch( pObjData ->dwRequestID) // Связываем идентификаторы запроса и имени объекта
{
case REQUEST_1143_KIEV:
Ship11431KievID = pObjData->dwObjectID;
break;
default:
break;
}
default:
break;
}

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по [url="http://www.avsim.su/wiki/API"]API[/url] функциям SimConnect [url="http://www.avsim.su/wiki/SDK"]SDK[/url], начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание [url="http://www.avsim.su/wiki/API"]API[/url] функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов [url="http://www.avsim.su/wiki/FSX"]FSX[/url].

Разберем установку объектов группы D (трафиковых объектов, контролируемых AI, кроме самолетов) и управление их движением на основе примеров SDK.
1. Определить идентификатор объекта типа DWORD, например: DWORD BusZIL155ID; // автобус ЗиЛ-155
2. Описать перечисление для запросов объектов static enum DATA_REQUEST_ID {}; Если в программе уже есть подобное перечисление, например, для стационарных объектов, то дополняем его объектами группы D. Если такого перечисления нет, то создаем такое перечисление, например:
static enum DATA_REQUEST_ID {
REQUEST_BUS_ZIL155,
};
3. Описать перечисление для определения путевых точек маршрута:
static enum DEFINITION_ID {
DEFINITION_WAYPOINT,
};
4. Создать объект группы D и установить его в исходную позицию. Это делается точно так же, как и для объектов группы Е с помощью структуры SIMCONNECT_DATA_INITPOSITION и API функции SimConnect_AICreateSimulatedObject.
5. Создать маршрут движения объекта, для чего определить массив точек маршрута с помощью структуры SIMCONNECT_DATA_WAYPOINT, описать каждую точку и присвоить маршрут AI объекту с помощью API функции SimConnect_SetDataOnSimObject.
6. В функции обратной связи CALLBACK DispatchProc () произвести назначение имен объектов указателям запрашиваемых объектов, например:
case SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID: // Назначение имен объектов указателям запрашиваемых объектов
{
SIMCONNECT_RECV_ASSIGNED_OBJECT_ID *pObjData = (SIMCONNECT_RECV_ASSIGNED_OBJECT_ID*)pData;

switch( pObjData ->dwRequestID)
{
case REQUEST_BUS_ZIL155:
BusZIL155ID = pObjData->dwObjectID;
break;
}
7. Организовать присвоение маршрута объекта и его запуск по путевым точкам с помощью какого-либо события, например, по нажатию кнопки на клавиатуре. Как это делается, было описано в предыдущих постах.
Программа готова.

Для примера, поставим в программу четыре автобуса:
DWORD BusZIL155ID; // автобус ЗиЛ-155
DWORD BusLAZ695GreenID; // автобус ЛАЗ-695 зеленый
DWORD BusLAZ695EBlueID; // автобус ЛАЗ-695Е синий
DWORD BusLAZ697TouristRedID; // автобус ЛАЗ-697 Турист красный
Установку автобусов на исходные позиции будем производить по системному событию EVENT_SHT_SIM_START, а запуск автобусов по маршруту будем производить по EVENT_Z.
Исходные позиции автобусов назначим на привокзальной площади одного из аэропортов. На маршрут запустим два из них - ЗиЛ-155 и красный ЛаЗ-697 Турист.
Маршрут для обоих автобусов назначим один из шести точек - от привокзальной площади до выезда на трассу:
Для этого в программе установки стационарных объектов введем новую пользовательскую функцию:
void ShtAddRoutesObjectsAI()
{
HRESULT ShtHr;
SIMCONNECT_DATA_WAYPOINT ShtBusAlmaAtaMainBeforeAirport[6]; // waypoint list Алма-Ата_Главная привокзальная площадь

// ----- Маршрут сухопутный: Алма-Ата_Главная привокзальная площадь -----
ShtBusAlmaAtaMainBeforeAirport[0].Flags = SIMCONNECT_WAYPOINT_SPEED_REQUESTED | SIMCONNECT_WAYPOINT_REVERSE;
ShtBusAlmaAtaMainBeforeAirport[0].Altitude = 0;
ShtBusAlmaAtaMainBeforeAirport[0].Latitude = 43 + (20.87295/60);
ShtBusAlmaAtaMainBeforeAirport[0].Longitude = 77 + (00.6237166/60);
ShtBusAlmaAtaMainBeforeAirport[0].ktsSpeed = 15;

ShtBusAlmaAtaMainBeforeAirport[1].Flags = SIMCONNECT_WAYPOINT_SPEED_REQUESTED;
ShtBusAlmaAtaMainBeforeAirport[1].Altitude = 0;
ShtBusAlmaAtaMainBeforeAirport[1].Latitude = 43 + (20.82871666/60);
ShtBusAlmaAtaMainBeforeAirport[1].Longitude = 77 + (00.54746666/60);
ShtBusAlmaAtaMainBeforeAirport[1].ktsSpeed = 25;

ShtBusAlmaAtaMainBeforeAirport[2].Flags = SIMCONNECT_WAYPOINT_SPEED_REQUESTED;
ShtBusAlmaAtaMainBeforeAirport[2].Altitude = 0;
ShtBusAlmaAtaMainBeforeAirport[2].Latitude = 43 + (20.69425/60);
ShtBusAlmaAtaMainBeforeAirport[2].Longitude = 77 + (00.126716666/60);
ShtBusAlmaAtaMainBeforeAirport[2].ktsSpeed = 35;

ShtBusAlmaAtaMainBeforeAirport[3].Flags = SIMCONNECT_WAYPOINT_SPEED_REQUESTED;
ShtBusAlmaAtaMainBeforeAirport[3].Altitude = 0;
ShtBusAlmaAtaMainBeforeAirport[3].Latitude = 43 + (20.650133333/60);
ShtBusAlmaAtaMainBeforeAirport[3].Longitude = 77 + (00.013366666/60);
ShtBusAlmaAtaMainBeforeAirport[3].ktsSpeed = 35;

ShtBusAlmaAtaMainBeforeAirport[4].Flags = SIMCONNECT_WAYPOINT_SPEED_REQUESTED;
ShtBusAlmaAtaMainBeforeAirport[4].Altitude = 0;
ShtBusAlmaAtaMainBeforeAirport[4].Latitude = 43 + (20.63295/60);
ShtBusAlmaAtaMainBeforeAirport[4].Longitude = 76 + (59.93578333/60);
ShtBusAlmaAtaMainBeforeAirport[4].ktsSpeed = 35;

ShtBusAlmaAtaMainBeforeAirport[5].Flags = SIMCONNECT_WAYPOINT_SPEED_REQUESTED;
ShtBusAlmaAtaMainBeforeAirport[5].Altitude = 0;
ShtBusAlmaAtaMainBeforeAirport[5].Latitude = 43 + (20.5938166666/60);
ShtBusAlmaAtaMainBeforeAirport[5].Longitude = 76 + (59.7276166666/60);
ShtBusAlmaAtaMainBeforeAirport[5].ktsSpeed = 25;

// ----- Присоединение маршрутов к объектам FSX -----
ShtHr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_WAYPOINT, BusZIL155ID, 0, ARRAYSIZE(ShtBusAlmaAtaMainBeforeAirport), sizeof(ShtBusAlmaAtaMainBeforeAirport[0]), ShtBusAlmaAtaMainBeforeAirport);
ShtHr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_WAYPOINT, BusLAZ697TouristRedID, 0, ARRAYSIZE(ShtBusAlmaAtaMainBeforeAirport), sizeof(ShtBusAlmaAtaMainBeforeAirport[0]), ShtBusAlmaAtaMainBeforeAirport);
}
Компилируем программу, ставим ее в FSX, запускаемся и видим наши автобусы.

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по [url="http://www.avsim.su/wiki/API"]API[/url] функциям SimConnect [url="http://www.avsim.su/wiki/SDK"]SDK[/url], начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание [url="http://www.avsim.su/wiki/API"]API[/url] функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов [url="http://www.avsim.su/wiki/FSX"]FSX[/url].

Нажимаем кнопку X (я использовал событие из примера SDK), автобусы ЗиЛ-155 и ЛАЗ-697 Турист начинают движение в первую точку маршрута и далее по шоссе до конца маршрута.

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по [url="http://www.avsim.su/wiki/API"]API[/url] функциям SimConnect [url="http://www.avsim.su/wiki/SDK"]SDK[/url], начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание [url="http://www.avsim.su/wiki/API"]API[/url] функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов [url="http://www.avsim.su/wiki/FSX"]FSX[/url].

Как видно из примера, в организации движения объектов группы D, не самолетов, имеют значение три новых фактора: структура SIMCONNECT_DATA_WAYPOINT, API функция SimConnect_SetDataOnSimObject и оператор SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID.
Разберем их действие.

API функция SimConnect_SetDataOnSimObject

Эта функция используется для установки и изменения данных объекта FSX.
Синтакис:
HRESULT SimConnect_SetDataOnSimObject(
HANDLE hSimConnect,
SIMCONNECT_DATA_DEFINITION_ID DefineID,
SIMCONNECT_OBJECT_ID ObjectID,
SIMCONNECT_DATA_SET_FLAG Flags,
DWORD ArrayCount,
DWORD cbUnitSize,
void* pDataSet
);
Параметры:
hSimConnect – указатель на объект SimCinnect.
DefineID – специфический ID клиента, данные которого определяются. Этот ID устанавливается статическим перечислением static enum DEFINITION_ID {}; Внутри фигурных скобок через запятую перечисляются имена перечислений, например:
static enum DEFINITION_ID {
DEFINITION_WAYPOINT, // Имя ID для путевых точек
DEFINITION_THROTTLE // Имя ID для РУД
};
ObjectID – специфический ID объекта FSX, для которого определяются данные. Этот ID может быть или SIMCONNECT_OBJECT_ID_USER для пользовательского самолета, или одним из значений, установленных структурой SIMCONNECT_RECV_SIMCONNECT_DATA_BYTYPE. Значение параметра ObjectID определяется после получения обратного вызова от функции SimConnect_RequestDataOnSimObjectType.
Flags – флаг. Может быть установлено два значения:
NULL – по умолчанию;
SIMCONNECT_DATA_SET_FLAG_TAGGED – данные устанавливаются в tagget формате, т.е в паре ID/value.
ArrayCount – определяет количество элементов в массиве данных. Если установлен ноль, то это означает, что в массиве один элемент. Этот параметр должен быть инициализирован до его передачи в FSX!
cbUnitSize – определяет размер каждого элемента в массиве данных объекта в байтах.
pDataSet – указатель на который будут записаны данные. Если данные не в формате tagged, то этот параметр должен указывать на блок данных. Если данные формата tagged, то этот параметр должен указывать на первый параметр тэга (DatumID) данных ( указатель имеет размер всегда 4 байта). Имея это уникальный параметр, указывающий на DatumID, сервер всегда найдет нужные данные, используя параметр cbUnitSize.

Функция возвращает переменную типа HRESULT. Она может иметь два значения:
S_OK – если функция завершилась успешно.
E_FAIL – если функция завершилась неуспешно.

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по [url="http://www.avsim.su/wiki/API"]API[/url] функциям SimConnect [url="http://www.avsim.su/wiki/SDK"]SDK[/url], начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание [url="http://www.avsim.su/wiki/API"]API[/url] функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов [url="http://www.avsim.su/wiki/FSX"]FSX[/url].

SIMCONNECT_DATA_WAYPOINT

Эта структура используется для хранения всей необходимой информации о путевой точке waypoint.
Синтаксис:
struct SIMCONNECT_DATA_WAYPOINT{
double Latitude;
double Longitude;
double Altitude;
unsigned long Flags;
double ktsSpeed;
double percentThrottle;
};
Параметры структуры:
Latitude – широта точки в градусах;
Longitude – долгота путевой точки в градусах;
Altitude – высота путевой точки в футах;
Flags – специфический флаг установки для этой точки. Могут быть установлены следующие значения для флага, определенные перечислением SIMCONNECT_WAYPOINTS_FLAGS:

SIMCONNECT_WAYPOINT_SPEED_REQUESTED = 0x04,
SIMCONNECT_WAYPOINT_THROTTLE_REQUESTED = 0x08,
SIMCONNECT_WAYPOINT_COMPUTE_VERTICAL_SPEED = 0x10,
SIMCONNECT_WAYPOINT_ALTITUDE_IS_AGL = 0x20,
SIMCONNECT_WAYPOINT_ON_GROUND = 0x00100000,
SIMCONNECT_WAYPOINT_REVERSE = 0x00200000,
SIMCONNECT_WAYPOINT_WRAP_TO_FIRST = 0x00400000,
Первое значение флага SIMCONNECT_WAYPOINT_SPEED_REQUESTED указывает, что будет установлена скорость, с которой объект FSX пройдет данную точку.
Второе значение флага SIMCONNECT_WAYPOINT_THROTTLE_REQUESTED указывает, что будет установлено значение РУД объекта FSX в процентах при прохождении данной точки.
Третье значение флага SIMCONNECT_WAYPOINT_COMPUTE_VERTICAL_SPEED указывает, что будет устанавлено значение вертикальной скорости, которую получит объект при прохождении данной точки.
Четвертое значение флага SIMCONNECT_WAYPOINT_ALTITUDE_IS_AGL указывает, что будет установлено значение высоты над поверхностью земли в данной точке, на которой объект пройдет данную точку.
Пятое значение флага SIMCONNECT_WAYPOINT_ON_GROUND указывает, что объект FSX находится на земле.
Шестое значение флага SIMCONNECT_WAYPOINT_REVERSE указывает, что объект FSX поворачивает назад в данной точке. Устанавливается только для первой точки маршрута.
Седьмое значение флага SIMCONNECT_WAYPOINT_WRAP_TO_FIRST указывает на то, что следующей точкой будет первая точка маршрута. Устанавливается только для последней точки маршрута.
Флагу может устанавливаться несколько значений, разделенных символом |.
Пример установки флага:
Flags = SIMCONNECT_WAYPOINT_ON_GROUND | SIMCONNECT_WAYPOINT_REVERSE;
В примере установлено, что объект FSX находится на земле и в данной точке он поворачивает назад, т.е. данная точка является первой на маршруте.

ktsSpeed – скорость в узлах, с которой объект FSX проходит данную точку. Если эта скорость установлена, хоть 0, то флагу должно быть установлено значение SIMCONNECT_WAYPOINT_SPEED_REQUESTED.
percentThrottle – процент положения РУД. Если установлен хотя бы 0%, то флагу должно быть присвоено значение SIMCONNECT_THROTTLE_REQUESTED.

Примечания.
Структура SIMCONNECT_DATA_WAYPOINT может использоваться с API функциями SimConnect_Add_ToDataDefinition и SimConnect_SetDataOnSimObject. Количество путевых точек маршрута не ограничивается.
Если фактическая скорость объекта FSX меньше, чем скорость, установленная для прохода данной путевой точки, то объект повернет в следующую точку на некотором расстоянии от данной точки, т.е. фактический путь объекта не будет соответствовать установленному маршруту. Это надо учитывать при организации движения AI объектов.

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по [url="http://www.avsim.su/wiki/API"]API[/url] функциям SimConnect [url="http://www.avsim.su/wiki/SDK"]SDK[/url], начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание [url="http://www.avsim.su/wiki/API"]API[/url] функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов [url="http://www.avsim.su/wiki/FSX"]FSX[/url].

Оператор SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID используется в функции обратной связи в качестве значения для параметра case в переключателе передачи указателя объекта на вызываемый объект.

case SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID: // Назначение имен объектов указателям запрашиваемых объектов
{
SIMCONNECT_RECV_ASSIGNED_OBJECT_ID *pObjData = (SIMCONNECT_RECV_ASSIGNED_OBJECT_ID*)pData;
switch( pObjData ->dwRequestID)
{
case REQUEST_BUS_ZIL155:
BusZIL155ID = pObjData->dwObjectID;
break;

default:
break;
}
break;

В данной операции производится связывание идентификатора вызова объекта (REQUEST_BUS_ZIL155) с идентификатором самого объекта (BusZIL155ID).
Это позволяет с получением вызова объекта присвоить ему действия, определенные программой, в частности, маршрут и начало движения по нему с получением команды.

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по [url="http://www.avsim.su/wiki/API"]API[/url] функциям SimConnect [url="http://www.avsim.su/wiki/SDK"]SDK[/url], начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание [url="http://www.avsim.su/wiki/API"]API[/url] функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов [url="http://www.avsim.su/wiki/FSX"]FSX[/url].

API функция SimConnect_AICreateSimulatedObject используется для создания любых стационарных и движущихся AI объектов (не самолетов). Например, с ее помощью можно установить на железную дорогу поезд и заставить его двигаться по железной дороге.

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по [url="http://www.avsim.su/wiki/API"]API[/url] функциям SimConnect [url="http://www.avsim.su/wiki/SDK"]SDK[/url], начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание [url="http://www.avsim.su/wiki/API"]API[/url] функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов [url="http://www.avsim.su/wiki/FSX"]FSX[/url].

Важным свойством траффика, созданного с помощью SimConnect, является его присутствие в любом режиме работы FSX - в режиме свободного полета, в режиме миссий, в режиме диспетчера и режиме сетевых полетов.
Также он не исчезает при увеличении скорости игры даже при 64-кратном ее повышении, что позволяет ускорять выполнение каких-то монотонных периодов полета без потери траффика.
Интересной особенностью этого траффика является остановка AI объектов при чрезмерном приближении к нему пользовательского самолета во избежание столкновения. Этим свойством я пользуюсь для остановки AI объектов в случаях, когда надо сделать скриншот, или увеличить дистанцию от данного AI объекта до впереди идущего объекта.
Например, для данного скриншота я приблизился к поезду и он остановился.

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по [url="http://www.avsim.su/wiki/API"]API[/url] функциям SimConnect [url="http://www.avsim.su/wiki/SDK"]SDK[/url], начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание [url="http://www.avsim.su/wiki/API"]API[/url] функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов [url="http://www.avsim.su/wiki/FSX"]FSX[/url].

Перейдем к флотским делам - посмотрим установку кораблей (это тоже AI объекты группы D) и управление ими.
Их установка и управление в целом не отличаются от рассмотренных выше для наземных объектов:
- для установки применяются структура SIMCONNECT_DATA_INITPOSITION и API функция SimConnect_AICreateSimulatedObject;
- для удаления корабля используется API функция SimConnect_AIRemoveObject;
- для создания маршрута используется структура SIMCONNECT_DATA_WAYPOINT, для направления по нему корабля используются API функция SimConnect_SetDataOnSimObject и оператор SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID.
Запуск кораблей, также как и наземных объектов, на маршруты производится по какому-либо событию, например, по нажатию кнопки. Для этого надо организовать подписку на это событие и включить его в функцию обратной связи, или как ее часто называют - обратного вызова.

Для примера поставим на рейд Североморска в дополнение к такр проекта 1143 "Киев" еще два корабля - большие противолодочные корабли проекта 1134А "Кронштадт" и "Исаков":

DWORD Ship11431KievID; // такр проекта 1143.1 Киев
DWORD Ship1134AKronshtadtID; // бпк проекта 1134А Кронштадт
DWORD Ship1134AIsakovID; // бпк проекта 1134А Исаков

Создадим для кораблей маршрут выхода с рейда Североморск до выхода из Кольского залива:
SIMCONNECT_DATA_WAYPOINT ShtShipKolaGulfSeveromorsk[5];

// ----- Маршрут кораблей: Североморск - выход из Кольского залива -----
ShtShipKolaGulfSeveromorsk[0].Flags = SIMCONNECT_WAYPOINT_SPEED_REQUESTED;
ShtShipKolaGulfSeveromorsk[0].Altitude = 0;
ShtShipKolaGulfSeveromorsk[0].Latitude = 69 + (05.940166666/60);
ShtShipKolaGulfSeveromorsk[0].Longitude = 33 + (24.295833333/60);
ShtShipKolaGulfSeveromorsk[0].ktsSpeed = 12;

ShtShipKolaGulfSeveromorsk[1].Flags = SIMCONNECT_WAYPOINT_SPEED_REQUESTED;
ShtShipKolaGulfSeveromorsk[1].Altitude = 0;
ShtShipKolaGulfSeveromorsk[1].Latitude = 69 + (06.887833333/60);
ShtShipKolaGulfSeveromorsk[1].Longitude = 33 + (25.964833333/60);
ShtShipKolaGulfSeveromorsk[1].ktsSpeed = 12;

ShtShipKolaGulfSeveromorsk[2].Flags = SIMCONNECT_WAYPOINT_SPEED_REQUESTED;
ShtShipKolaGulfSeveromorsk[2].Altitude = 0;
ShtShipKolaGulfSeveromorsk[2].Latitude = 69 + (07.675666666/60);
ShtShipKolaGulfSeveromorsk[2].Longitude = 33 + (28.911333333/60);
ShtShipKolaGulfSeveromorsk[2].ktsSpeed = 14;

ShtShipKolaGulfSeveromorsk[3].Flags = SIMCONNECT_WAYPOINT_SPEED_REQUESTED;
ShtShipKolaGulfSeveromorsk[3].Altitude = 0;
ShtShipKolaGulfSeveromorsk[3].Latitude = 69 + (10.033300000/60);
ShtShipKolaGulfSeveromorsk[3].Longitude = 33 + (33.227833333/60);
ShtShipKolaGulfSeveromorsk[3].ktsSpeed = 14;

ShtShipKolaGulfSeveromorsk[4].Flags = SIMCONNECT_WAYPOINT_SPEED_REQUESTED;
ShtShipKolaGulfSeveromorsk[4].Altitude = 0;
ShtShipKolaGulfSeveromorsk[4].Latitude = 69 + (17.753333333/60);
ShtShipKolaGulfSeveromorsk[4].Longitude = 33 + (31.811066666/60);
ShtShipKolaGulfSeveromorsk[4].ktsSpeed = 14;

Отправим в плавание корабельную поисково-ударную группу в составе двух бпк - "Кронштадт" и "Исаков". Для этого подключим к ним маршрут:
ShtHr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_WAYPOINT, Ship1134AKronshtadtID, 0, ARRAYSIZE(ShtShipKolaGulfSeveromorsk), sizeof(ShtShipKolaGulfSeveromorsk[0]), ShtShipKolaGulfSeveromorsk);
ShtHr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_WAYPOINT, Ship1134AIsakovID, 0, ARRAYSIZE(ShtShipKolaGulfSeveromorsk), sizeof(ShtShipKolaGulfSeveromorsk[0]), ShtShipKolaGulfSeveromorsk);

Также не забываем про функцию обратной связи, в которой описываем передачу указателей на вызываемые корабли:

case SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID:
{
SIMCONNECT_RECV_ASSIGNED_OBJECT_ID *pObjData = (SIMCONNECT_RECV_ASSIGNED_OBJECT_ID*)pData;

switch( pObjData ->dwRequestID)
{
case REQUEST_1134A_KRONSHTADT:
Ship1134AKronshtadtID = pObjData->dwObjectID;
break;

case REQUEST_1134A_ISAKOV:
Ship1134AIsakovID = pObjData->dwObjectID;
break;

default:
break;

}
break;
}

Компилируем программу, устанавливаем ее в FSX, запускаемся в Североморске-1. Видим наши корабли на рейде Североморска.

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по [url="http://www.avsim.su/wiki/API"]API[/url] функциям SimConnect [url="http://www.avsim.su/wiki/SDK"]SDK[/url], начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание [url="http://www.avsim.su/wiki/API"]API[/url] функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов [url="http://www.avsim.su/wiki/FSX"]FSX[/url].

Нажимаем кнопку X, которую как и в примере SDK мы использовали для начала движения объектов, отправляем нашу КПУГ двухкорабельного состава в плавание.

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по [url="http://www.avsim.su/wiki/API"]API[/url] функциям SimConnect [url="http://www.avsim.su/wiki/SDK"]SDK[/url], начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание [url="http://www.avsim.su/wiki/API"]API[/url] функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов [url="http://www.avsim.su/wiki/FSX"]FSX[/url].

Формирование маршрутов в SimConnect - довольно нудная задача. Сначала надо снять координаты точек, желательно в самом FSX, иначе есть вероятность движения AI объекта не по дороге или корабля по берегу (точнее, корабль упрется в берег и остановится). Для точного снятия координат приходится использовать SBuilderX или FSX Planner, сконнектированные с FSX. Затем координаты перевести в нужный формат и прописать в каждой путевой точке маршрута в программе С++.
При работе с кораблями для открытого моря эту задачу можно упростить, если воспользоваться приемом от AIbtc (программа создания траффика кораблей для FSX).
Запустим Google Eagle (Гугл Земля). Установим нужный район моря и проложим нужный нам маршрут, используя штатную функцию маршрутов.
Затем запишем местоположение созданного маршрута в формате kml. В результате получим текстовый файл, в котором будут записаны координаты точек маршрута в формате 33.39217476242254 (градусы и доли градусов).
Остается перенести эти координаты в нашу программу в формате, приведенном ниже:

ShtShipSredizemnoeMore09[0].Flags = SIMCONNECT_WAYPOINT_SPEED_REQUESTED;
ShtShipSredizemnoeMore09[0].Altitude = 0;
ShtShipSredizemnoeMore09[0].Latitude = 33 + (0.39217476242254);
ShtShipSredizemnoeMore09[0].Longitude = 33 + (0.76158880371356);
ShtShipSredizemnoeMore09[0].ktsSpeed = 27;
Но можно писать и просто градусы и доли, т.е. так, как есть в файле kml (33.39217476242254).
При большом количестве кораблей этот прием существенно экономит время и позволяет наглядно отобразить маршруты кораблей.

Для примера воспроизведем действия объединенной авианосной противолодочной группы Северного, Черноморского и Тихоокеанского флотов СССР в Средиземном море в марте 1979 года.
Тогда была проведена уникальная противолодочная операция, точнее сразу несколько противолодочных операций, на всей акватории Средиземного моря от восточной части до Гибралтара с участием такр "Киев", такр "Минск".
Добавим к ним еще несколько кораблей:
пкр "Москва", пкр "Ленинград", бпк "Комсомолец Украины" Черноморского флота;
бпк "Адмирал Макаров", бпк "Маршал Тимошенко", бпк "Огневой" Северного флота;
бпк "Ташкент" и бпк "Петропавловск" Тихоокеанского флота.
Всего в сцену установим 10 кораблей, идущих в ордере на дистанциях 10-12 кабельтовых.
Для этого в Google Eagle создадим 10 маршрутов, в каждом маршруте определим по три точки. Сохраним маршруты в формате kml, получим 10 текстовых файлов с координатами маршрутов.
Вид маршрутов показан на скрине.

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по [url="http://www.avsim.su/wiki/API"]API[/url] функциям SimConnect [url="http://www.avsim.su/wiki/SDK"]SDK[/url], начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание [url="http://www.avsim.su/wiki/API"]API[/url] функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов [url="http://www.avsim.su/wiki/FSX"]FSX[/url].

Компилируем программу, устанавливаем ее в FSX и получаем наши корабли, идущие в ордере в восточной части Средиземного моря.

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по [url="http://www.avsim.su/wiki/API"]API[/url] функциям SimConnect [url="http://www.avsim.su/wiki/SDK"]SDK[/url], начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание [url="http://www.avsim.su/wiki/API"]API[/url] функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов [url="http://www.avsim.su/wiki/FSX"]FSX[/url].

Полетаем над ордером, посмотрим на корабли.
Впереди идут в ближнем охранении бпк "Маршал Тимошенко" (на переднем плане) и бпк "Петропавловск".

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по [url="http://www.avsim.su/wiki/API"]API[/url] функциям SimConnect [url="http://www.avsim.su/wiki/SDK"]SDK[/url], начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание [url="http://www.avsim.su/wiki/API"]API[/url] функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов [url="http://www.avsim.su/wiki/FSX"]FSX[/url].

В центре ордера - основные силы: такр "Минск" (на переднем плане), такр "Киев", пкр "Москва", пкр "Ленинград".

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по [url="http://www.avsim.su/wiki/API"]API[/url] функциям SimConnect [url="http://www.avsim.su/wiki/SDK"]SDK[/url], начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание [url="http://www.avsim.su/wiki/API"]API[/url] функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов [url="http://www.avsim.su/wiki/FSX"]FSX[/url].

Круговое охранение осуществляют остальные корабли.

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по [url="http://www.avsim.su/wiki/API"]API[/url] функциям SimConnect [url="http://www.avsim.su/wiki/SDK"]SDK[/url], начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание [url="http://www.avsim.su/wiki/API"]API[/url] функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов [url="http://www.avsim.su/wiki/FSX"]FSX[/url].

Флот действует не только в надводной, но и в подводной среде. Поэтому без подводных лодок в авиационном симуляторе не обойтись.
Подводные лодки должны иметь категорию Boat, как и все корабли, суда, катера и морские животные в FSX.
Установка подводных лодок не отличается от установки надводных кораблей - применяем те же две структуры SIMCONNECT_DATA_INITPOSITION и SIMCONNECT_DATA_WAYPOINT и те же две [url="http://www.avsim.su/wiki/API"]API[/url] функции SimConnect_AICreateSimulatedObject и SimConnect_SetDataOnSimObject. Не забываем про оператор SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID.
Однако погрузить подводную лодку таким способом не удастся, нужны другие приемы. О них как-нибудь поговорим, надеюсь.

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по [url="http://www.avsim.su/wiki/API"]API[/url] функциям SimConnect [url="http://www.avsim.su/wiki/SDK"]SDK[/url], начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание [url="http://www.avsim.su/wiki/API"]API[/url] функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов [url="http://www.avsim.su/wiki/FSX"]FSX[/url].

Перейдем теперь к траффиковым самолетам группы C - это AI самолеты, летающие под управлением искусственного интеллекта AI, но не управляемые службой УВД. Такие самолеты можно отнести к самолетам, летающим по правилам визуальных полетов.
Строго говоря, термин самолеты здесь применен достаточно условно. На самом деле к AI объектам группы C относятся любые летательные аппараты - самолеты, вертолеты, дельтапланы, парапланы, планеры, дирижабли и т.д. Однако для полетов в рамках группы C все они должны иметь категорию Airplane (в файле конфигурации AI объекта).
Установка AI самолетов группы C аналогична установке описанных выше объектов FSX группы D - применяем две структуры, две API функции и оператор обратного вызова:
- также применяем две структуры SIMCONNECT_DATA_INITPOSITION (создаем исходную позицию) и SIMCONNECT_DATA_WAYPOINT (создаем маршрут):
- вместо API функции SimConnect_AICreateSimulatedObject для создания AI объекта применяем API функцию SimConnect_AICreateNonATCAircraft;
- для присоединения маршрута к AI самолету применяем API функцию SimConnect_SetDataOnSimObject;
- для вызова AI самолета не забываем про оператор SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID.

Для примера установим самолет Як-38 палубной авиации, но для начала на аэродроме. Пусть это будет Североморск-3.
Описываем его идентификатор:
DWORD AircraftYak38ID01; // самолет Як-38 A1000
Описываем его запрос в перечислении запросов:
REQUEST_YAK38_01, // Вызов AI самолет Як-38 A1000
Описываем имя маршрута:
SIMCONNECT_DATA_WAYPOINT ShtAircraftfSeveromorsk3Zone[11]; // waypoint list Североморск3 - барражирование в зоне аэродрома
Описываем все путевые точки маршрута (привожу только начальную на земле; ставим флаг - самолет на земле для тех точек, через которые производится руление):
ShtAircraftfSeveromorsk3Zone[0].Flags = SIMCONNECT_WAYPOINT_ON_GROUND | SIMCONNECT_WAYPOINT_SPEED_REQUESTED;
ShtAircraftfSeveromorsk3Zone[0].Altitude = 0;
ShtAircraftfSeveromorsk3Zone[0].Latitude = 68 + ((51 + (12.205/60))/60);
ShtAircraftfSeveromorsk3Zone[0].Longitude = 33 + ((42 + (34.789/60))/60);
ShtAircraftfSeveromorsk3Zone[0].ktsSpeed = 10;
.....
Присоединяем маршрут к самолету:
ShtHr = SimConnect_SetDataOnSimObject(hSimConnect, DEFINITION_WAYPOINT, AircraftYak38ID01, 0, ARRAYSIZE(ShtAircraftfSeveromorsk3Zone), sizeof(ShtAircraftfSeveromorsk3Zone[0]), ShtAircraftfSeveromorsk3Zone);
Устанавливаем Як-38 на стоянку: // самолет Як-38, Североморск-3, стоянка 14
ShtInitPosition.Altitude = 0.0;
ShtInitPosition.Latitude = 68 + ((51 + (11.681/60))/60); // градусы + минуты/60 + секунды/60
ShtInitPosition.Longitude = 33 + ((42 + (37.621/60))/60);
ShtInitPosition.Pitch = 0.0;
ShtInitPosition.Bank = 0.0;
ShtInitPosition.Heading = 297.0;
ShtInitPosition.OnGround = 1;
ShtInitPosition.Airspeed = 0;
ShtHr = SimConnect_AICreateNonATCAircraft(hSimConnect, "AI Yak-38", "A1000", ShtInitPosition, REQUEST_YAK38_01);
Описываем указатель Як-38 в функции обратного вызова:

case REQUEST_YAK38_01:
AircraftYak38ID01 = pObjData->dwObjectID;
break;

Компилируем программу, ставим в FSX, запускаемся на аэродроме Североморск-3.
Видим наш самолет на стоянке.

Share this post


Link to post
Share on other sites

Для начинающих!
========================
Продолжение записок по [url="http://www.avsim.su/wiki/API"]API[/url] функциям SimConnect [url="http://www.avsim.su/wiki/SDK"]SDK[/url], начало см. пост #22 по этой ссылке http://www.avsim.su/forum/topic/132128-simconnect-%D0%BE%D0%B1%D1%89%D0%B0%D1%8F-%D1%85%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0/page-2#entry2510573
Описание [url="http://www.avsim.su/wiki/API"]API[/url] функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов [url="http://www.avsim.su/wiki/FSX"]FSX[/url].

Запускаем траффик. Наш самолет производит руление на ВПП.

Share this post


Link to post
Share on other sites

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...