Эта тема создана для размещения сообщений и обсуждения использования 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).
Сообщение отредактировано dmi-shef: 14 September 2013 — 09:28
Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX.
Компилируем программу, устанавливаем ее в FSX. Запускаем свободный полет из Североморска-1, взлетаем и видим такр «Киев» на рейде на своем месте.
Прикрепленные изображения
Сообщение отредактировано dmi-shef: 16 September 2013 — 01:59
Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX.
Подобным образом можно устанавливать любые стационарные объекты как на земле, так и в воздухе, например, аэростаты на привязи или «колдун».
Можно организовать сезонную смену объектов, устанавливая объект с соответствующей сезонной текстурой по условию наступления соответствующего сезона чтением значения переменной Simulation variables, показаны на скрине.
Для оптимизации производительности FSX можно установить условие видимости стационарного объекта по дальности от точки, в которой находится камера, а также видимость объекта в зависимости от погоды.
Можно устанавливать статические объекты и по другим условиям.
Похоже, что возможности SimConnect для этой задачи существенно превосходят типовые инструменты SDK и позволяют реализовать практически любые замыслы автора.
Прикрепленные изображения
Сообщение отредактировано dmi-shef: 16 September 2013 — 01:59
Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 этой темы http://www.avsim.su/…-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.
Программа готова.
Сообщение отредактировано dmi-shef: 14 September 2013 — 09:27
Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 этой темы http://www.avsim.su/…-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.
Сообщение отредактировано dmi-shef: 14 September 2013 — 09:28
Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-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 – если функция завершилась неуспешно.
Сообщение отредактировано dmi-shef: 16 September 2013 — 01:58
Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-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;
}
Сообщение отредактировано dmi-shef: 16 September 2013 — 01:59
Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-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;
}
Сообщение отредактировано dmi-shef: 16 September 2013 — 02:00
Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX.
Разберем установку объектов группы 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, запускаемся и видим наши автобусы.
Прикрепленные изображения
Сообщение отредактировано dmi-shef: 16 September 2013 — 02:00
Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX.
Нажимаем кнопку X (я использовал событие из примера SDK), автобусы ЗиЛ-155 и ЛАЗ-697 Турист начинают движение в первую точку маршрута и далее по шоссе до конца маршрута.
Прикрепленные изображения
Сообщение отредактировано dmi-shef: 16 September 2013 — 02:00
Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX.
Как видно из примера, в организации движения объектов группы 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 – если функция завершилась неуспешно.
Сообщение отредактировано dmi-shef: 16 September 2013 — 02:01
Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX.
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 объектов.
Сообщение отредактировано dmi-shef: 16 September 2013 — 02:01
Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX.
Оператор 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).
Это позволяет с получением вызова объекта присвоить ему действия, определенные программой, в частности, маршрут и начало движения по нему с получением команды.
Сообщение отредактировано dmi-shef: 16 September 2013 — 02:01
Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX.
API функция SimConnect_AICreateSimulatedObject используется для создания любых стационарных и движущихся AI объектов (не самолетов). Например, с ее помощью можно установить на железную дорогу поезд и заставить его двигаться по железной дороге.
Прикрепленные изображения
Сообщение отредактировано dmi-shef: 16 September 2013 — 02:02
Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX.
Важным свойством траффика, созданного с помощью SimConnect, является его присутствие в любом режиме работы FSX — в режиме свободного полета, в режиме миссий, в режиме диспетчера и режиме сетевых полетов.
Также он не исчезает при увеличении скорости игры даже при 64-кратном ее повышении, что позволяет ускорять выполнение каких-то монотонных периодов полета без потери траффика.
Интересной особенностью этого траффика является остановка AI объектов при чрезмерном приближении к нему пользовательского самолета во избежание столкновения. Этим свойством я пользуюсь для остановки AI объектов в случаях, когда надо сделать скриншот, или увеличить дистанцию от данного AI объекта до впереди идущего объекта.
Например, для данного скриншота я приблизился к поезду и он остановился.
Прикрепленные изображения
Сообщение отредактировано dmi-shef: 16 September 2013 — 02:02
Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX.
Перейдем к флотским делам — посмотрим установку кораблей (это тоже 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. Видим наши корабли на рейде Североморска.
Прикрепленные изображения
Сообщение отредактировано dmi-shef: 16 September 2013 — 02:02
Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX.
Нажимаем кнопку X, которую как и в примере SDK мы использовали для начала движения объектов, отправляем нашу КПУГ двухкорабельного состава в плавание.
Прикрепленные изображения
Сообщение отредактировано dmi-shef: 16 September 2013 — 02:02
Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX.
Формирование маршрутов в 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 текстовых файлов с координатами маршрутов.
Вид маршрутов показан на скрине.
Прикрепленные изображения
Сообщение отредактировано dmi-shef: 16 September 2013 — 02:03
Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX.
Компилируем программу, устанавливаем ее в FSX и получаем наши корабли, идущие в ордере в восточной части Средиземного моря.
Прикрепленные изображения
Сообщение отредактировано dmi-shef: 16 September 2013 — 02:03
Для начинающих!
========================
Продолжение записок по API функциям SimConnect SDK, начало см. пост #22 по этой ссылке http://www.avsim.su/…-2#entry2510573
Описание API функций для записи пользовательских значений переменным Simulation Variables и другим параметрам объектов FSX.
Полетаем над ордером, посмотрим на корабли.
Впереди идут в ближнем охранении бпк «Маршал Тимошенко» (на переднем плане) и бпк «Петропавловск».
Прикрепленные изображения
Сообщение отредактировано dmi-shef: 16 September 2013 — 02:04