Перейти к содержимому


Фотография

Установка маркера в рандомном месте карты


Лучший Ответ Ave_Ursus , 09 April 2015 - 16:47

Всем большое спасибо, всё заработало. Предложение тов. SteelRat"а очень помогло.

Не создавайте новый маркер, а меняйте позицию уже существующего.

 

В итоге скрипт выглядит так:

private ["_pos","_centerPos"];
_centerPos = getArray(configFile >> "CfgWorlds" >> worldName >> "centerPosition");
_pos = [getMarkerPos "center",100,20000,5,0,25,0] call BIS_fnc_findSafePos;
 "randomMarkerObject" setMarkerPos _pos;
 "randomMarkerObject" setMarkerColor "ColorRed";
 "randomMarkerObject" setMarkerShape "ELLIPSE";
 "randomMarkerObject" setMarkerBrush "Grid";
 "randomMarkerObject" setMarkerSize [100,100];
sleep 1;
 tp_point setPos _pos; //перемещаем вертолётную площадку на позицию маркера
 player setPos [(getPos tp_point select 0) +10, (getPos tp_point select 1) +0, (getPos tp_point select 2) +0.5]; // Закидываем игрока на объект tp_point (верт. площадка);
Перейти к сообщению


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 6

#1 OFFLINE   Ave_Ursus

Ave_Ursus

    Мл.сержант

  • Пользователи
  • 125 сообщений
  • Откуда:spb
  • Отряд:ex AS

Отправлено 06 April 2015 - 11:34

Привет, ребята.

Бьюсь с тривиальной, на мой взгляд, проблемой.

Регулярно нужно ставить в случайном месте карты маркер для дальнейшего размещения в нём войск/телепортации игрока.

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

Пробовал ставить 2мя способами:

 

1 вариант честно скопипащщен с форума:

private ["_pos","_centerPos"];
_centerPos = getArray(configFile >> "CfgWorlds" >> worldName >> "centerPosition");
_pos = [getMarkerPos "center",8200,8200,10,0,25,0] call BIS_fnc_findSafePos;
DMS_Cords = _pos;
// wait with script till pos is found
waitUntil {_pos};
DMS_Main = createMarker ["DMS_Main", DMS_Cords];
DMS_Main setMarkerColor "ColorRed";
DMS_Main setMarkerShape "ELLIPSE";
DMS_Main setMarkerBrush "Grid";
DMS_Main setMarkerSize [100,100];
sleep 4;

2й вариант самодельный - он хуже т.к. может поставить точку в здание или воду

x=round(random 8200); //подставить свои размеры карты, это под Стратис
y=round(random 8200);
randomMarker = createMarker ["Случайная точка",[x,y]];
randomMarker setMarkerColor "ColorRed";
randomMarker setMarkerShape "ELLIPSE";
randomMarker setMarkerBrush "Grid";
randomMarker setMarkerSize [100,100];
sleep 4;

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

 

Условно - запустили скрипт, получили маркер, заспавнили машинку/человечка, следующая итерация.

Спасибо.

 


  • 0

#2 OFFLINE   hipp0cat

hipp0cat

    Ефрейтор

  • Пользователи
  • 82 сообщений
  • Отряд:OSA

Отправлено 06 April 2015 - 13:23

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

DMS_Main = createMarker ["DMS_Main", DMS_Cords];
randomMarker = createMarker ["Случайная точка",[x,y]];

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

Например, для первого варианта:

waitUntil {_pos};
_mark_name = "DMS_Main_"+str(_pos);
DMS_Main = createMarker [_marker_name, DMS_Cords];

Не уверен, что 100% сработает, т.к. нет возможности проверить.


  • 0

#3 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 06 April 2015 - 15:47

Не создавайте новый маркер, а меняйте позицию уже существующего.

 

То есть создайте один маркер например с именем

WpMark

И при наступлении определённых событий задавайте ему новую позицию.


Сообщение отредактировал SteelRat: 06 April 2015 - 15:49

  • 0

#4 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 06 April 2015 - 16:01

 

2й вариант самодельный - он хуже т.к. может поставить точку в здание или воду

Я рекомендую вам освоиться с этой командой

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

возвращающей после исполнения массив содержащий N-ое кол-во позиций отвечающих заданным параметрам.

 

Возможный значения параметра _expression описаны здесь

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

 

По мне эта команда самое оно когда нужно произвести поиск позиций в самых извращённых формах). Полезная команда.


  • 0

#5 OFFLINE   Ave_Ursus

Ave_Ursus

    Мл.сержант

  • Пользователи
  • 125 сообщений
  • Откуда:spb
  • Отряд:ex AS

Отправлено 06 April 2015 - 16:57

Опробовал вариант товарища хиппокэта. Получилось примерно так:

private ["_pos","_centerPos"];
_centerPos = getArray(configFile >> "CfgWorlds" >> worldName >> "centerPosition");  //Взяли центр карты
_pos = [getMarkerPos "center",1200,8200,10,0,25,0] call BIS_fnc_findSafePos;           //запустили поиск позиции в торе от 1.2км до 8.2км от центра, не в воде, не ближе 10м до препятствия, уклон не больше 25% 
waitUntil {_pos}; // Ждём пока найдётся позиция
randomMarkerCoord = _pos;
randomMarkerName = "randomMarker"+str(_pos);
randomMarkerObject = createMarker [randomMarkerName, randomMarkerCoord];
randomMarkerObject setMarkerColor "ColorRed";
randomMarkerObject setMarkerShape "ELLIPSE";
randomMarkerObject setMarkerBrush "Grid";
randomMarkerObject setMarkerSize [100,100];
sleep 4;

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

 

Я рекомендую вам освоиться с этой командой

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

возвращающей после исполнения массив содержащий N-ое кол-во позиций отвечающих заданным параметрам.

 

Спасибо, очень полезная штука. В меморайз.


Сообщение отредактировал Ave_Ursus: 06 April 2015 - 17:20

  • 0

#6 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 07 April 2015 - 18:08

waitUntil {_pos}; // Ждём пока найдётся позиция

Это лишнее. И не корректно оформлено, команда требует в качестве параметра выражение которое вернёт TRUE или FALSE.

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

 

Пока эта строка не завершит свою работу

_pos = [getMarkerPos "center",1200,8200,10,0,25,0] call BIS_fnc_findSafePos; 

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

call

Сообщение отредактировал SteelRat: 07 April 2015 - 18:15

  • 0

#7 OFFLINE   Ave_Ursus

Ave_Ursus

    Мл.сержант

  • Пользователи
  • 125 сообщений
  • Откуда:spb
  • Отряд:ex AS

Отправлено 09 April 2015 - 16:47   Лучший Ответ

Всем большое спасибо, всё заработало. Предложение тов. SteelRat"а очень помогло.

Не создавайте новый маркер, а меняйте позицию уже существующего.

 

В итоге скрипт выглядит так:

private ["_pos","_centerPos"];
_centerPos = getArray(configFile >> "CfgWorlds" >> worldName >> "centerPosition");
_pos = [getMarkerPos "center",100,20000,5,0,25,0] call BIS_fnc_findSafePos;
 "randomMarkerObject" setMarkerPos _pos;
 "randomMarkerObject" setMarkerColor "ColorRed";
 "randomMarkerObject" setMarkerShape "ELLIPSE";
 "randomMarkerObject" setMarkerBrush "Grid";
 "randomMarkerObject" setMarkerSize [100,100];
sleep 1;
 tp_point setPos _pos; //перемещаем вертолётную площадку на позицию маркера
 player setPos [(getPos tp_point select 0) +10, (getPos tp_point select 1) +0, (getPos tp_point select 2) +0.5]; // Закидываем игрока на объект tp_point (верт. площадка);

Сообщение отредактировал Ave_Ursus: 09 April 2015 - 16:48

  • 0




Яндекс.Метрика