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


Фотография

Создание группы и рандомное размещение её юнитов


Лучший Ответ vlad333000 , 03 February 2016 - 13:53

Povstanetz,

_positions = [<позиция_1>,<позиция_2>,...,<позиция_N>];

for "_i" from 1 to (floor random count _positions) do
{
	_index = floor random count _positions;
	_position = _positions select _index;
	_positions deleteAt _index;
	
	<скрипт_создания_юнита>
};
Перейти к сообщению


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

#1 OFFLINE   Povstanetz

Povstanetz

    Рядовой

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

Отправлено 02 February 2016 - 20:14

Добрый день. Помогите пожалуйста "элегантно" решить проблему))

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

Пhобую решить через switch-case, но выходит какая-то муть - бойцы появляются из case по порядку. Прописывая в switch рандом _x= floor(random 5); switch (_x) do ... получаю произвольное создание юнитов в произвольных местах, но с дублированием позиции (например: 2 юнита в одной точке)

мой код:

Скрытый текст

Быть может для элегантности условия выполнения моей задумки нужно всего одна строка)))

Спасибо!


Сообщение отредактировал Povstanetz: 03 February 2016 - 10:40

  • 0

#2 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 02 February 2016 - 21:13

Povstanetz, у вас условием выбора является переменная _x, которая в свою очередь является переменной цикла с параметром for >> на первом цикле выбирается 1 ветка, на 2 - 2 и т. д. - это и есть причина того, что они появляются "по порядку"

Сообщение отредактировал vlad333000: 02 February 2016 - 21:14

  • 0

#3 OFFLINE   Povstanetz

Povstanetz

    Рядовой

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

Отправлено 03 February 2016 - 10:51

vlad333000, когда я делал вариант с switch {_x}, в циле с созданием юнитов я писал for "_i" from 1 to _count step 1 do {

в итоге получается (допустим):

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

 

Пробовал впихивать в каждое условие из цикла тяжелые конструкции типа:

1. создание массивов с координатами и если перед созданием юнита в этой координате есть стрелок, то вновь отправлял в массив (рандомить). не получилось((

2. Создавал максимальное количество юнитов (по количеству координат). И делал проверку после создания юнита на дистанцию от него другого стрелка. При минимальной- удалял его. Пока этот способ тоже не получился, но он (такой способ) напрягает.

 

Возможно как-то убирать case из цикла после его выполнения? 

Или как-то рандомно перемешивать case еще до выполнения цикла с созданием юнитов (тогда их можно будет создать и отправить в рандомные позиции, заранее не известные игроку)?


Сообщение отредактировал Povstanetz: 03 February 2016 - 10:59

  • 0

#4 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 03 February 2016 - 13:53   Лучший Ответ

Povstanetz,
_positions = [<позиция_1>,<позиция_2>,...,<позиция_N>];

for "_i" from 1 to (floor random count _positions) do
{
	_index = floor random count _positions;
	_position = _positions select _index;
	_positions deleteAt _index;
	
	<скрипт_создания_юнита>
};

  • 1

#5 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 03 February 2016 - 13:59

PS Выше небольшой косяк - нужно в цикле с параметрам прибавить 1 к конечному значению или на 0 поставить начальное
Но суть должна быть понятной

Сообщение отредактировал vlad333000: 03 February 2016 - 13:59

  • 0

#6 OFFLINE   Povstanetz

Povstanetz

    Рядовой

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

Отправлено 03 February 2016 - 14:44

PS Выше небольшой косяк - нужно в цикле с параметрам прибавить 1 к конечному значению или на 0 поставить начальное
Но суть должна быть понятной

Спасибо большое! попробую


  • 0

#7 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 03 February 2016 - 16:11

Ни когда не давайте своим переменным имена системных переменных!

_x

это системная переменная.

Если вы решаете использовать её как свою, результат не предсказуем.

 

PS

Где то, что то, мог проглядеть, не тестировал, как вариант, типа направление)

...

_zamoktypes = [
	["LIB_GER_scout_mgunner","LIB_GER_scout_stgunner_opt2","LIB_GER_scout_sniper_opt"],
	[1, 0.66, 0.33]	// определяет вероятность выбора конкретного элемента массива выше
];

_positions = [
	[0, 1, 2, 3],			// индексы позиций, третий элемент этого массива
	[1, 0.75, 0.5, 0.25],	// определяет вероятность выбора конкретного индекса позиции в массиве выше
	[[-22,1.7,0.3], [-22,7.5,0.3], [-20.3,14.3,0], [22,5,0]]	// позиции
];

_count = floor random count (_positions select 0);
if (_count == 0) then {_count = 1;};

for "_i" from 0 to _count do {
	_zamoktype	= _zamoktypes call BIS_fnc_selectRandomWeighted;
	_index		= _positions call BIS_fnc_selectRandomWeighted;

	_positions select 0 deleteAt _index;
	_positions select 1 deleteAt _index;

	_unit = _zamokinsidegrp createUnit [_zamoktype, getpos zamokinside, [], 0, "NONE"];
	_unit attachto [zamokinside, (_positions select 2 select _index)];
	detach _unit; dostop _unit;
};

...

Сообщение отредактировал SteelRat: 03 February 2016 - 17:20

  • 2

#8 OFFLINE   Povstanetz

Povstanetz

    Рядовой

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

Отправлено 03 February 2016 - 21:16

vlad333000, SteelRat,

спасибо большое! Вроде всё получилось.

Также отдельное спасибо за ликбез по "_x" - частенько этим грешу))

и - select x deleteAt

Рандомно ставить группу по SteelRat-овски у меня не получилось  -  к сожалению,

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

 

Скрытый текст

 

ПС: можно еще небольшой вопрос? (немного не по теме создания группы)

Сильно ли будет напрягать сервак такая конструкция при создании группы, учитывая, что групп может быть около 20 по 2-5 юнита?

 

{[_x] execVM "unitposcheck.sqf";} forEach units _grp;
 
unitposcheck.sqf

Сообщение отредактировал Povstanetz: 04 February 2016 - 02:12

  • 0

#9 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 04 February 2016 - 18:25

 

Сильно ли будет напрягать сервак такая конструкция при создании группы, учитывая, что групп может быть около 20 по 2-5 юнита?

Вопрос риторический)

Не будет напрягать до тех пор, пока вы не будете создавать по 20 групп каждые  5 сек.


 

Рандомно ставить группу по SteelRat-овски у меня не получилось  -  к сожалению,

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

Как я уже указывал

 

PS

Где то, что то, мог проглядеть, не тестировал, как вариант, типа направление)

Значит где то ... что то ...

1 не учтено

2 моё предложение нужно гармонично интегрировать в ваш код, ибо это просто часть целого.


  • 0

#10 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 04 February 2016 - 18:35

ЗЫ

Что это за объект?

zamokinside

Для информации, команда attachto не аттачит к строениям. Если конечно ни что не изменилось. Это может быть причиной что ваши боты остаются на созданных позициях.


  • 0

#11 OFFLINE   Povstanetz

Povstanetz

    Рядовой

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

Отправлено 04 February 2016 - 19:51

SteelRat, спасибо еще раз за код. Ты всё по полочкам разжевал для меня и показал, как можно детальней работать с массивами (буду обязательно теперь этим пользоваться! например, чтобы в создаваемой группе не были только одни пулеметчики).

Еще бы мне научится создавать группы из массива (i+1), а не 20 раз писать цикл для 20 групп)))

 

 

 

 

 

Значит где то ... что то ...

1 не учтено

2 моё предложение нужно гармонично интегрировать в ваш код, ибо это просто часть целого.

 

это я и сделал (гармонично интегрировал) в моем выложенном коде выше)

 

 

ЗЫ

Что это за объект?

zamokinside

Для информации, команда attachto не аттачит к строениям. Если конечно ни что не изменилось. Это может быть причиной что ваши боты остаются на созданных позициях.

zamokinside - это невидимая вертолетная площадка. Обычно ими пользуюсь для создания объектов, групп и прочее.

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

Правда, всё равно не особо помогает, даже dostop, при опасности начинают ходить-бродить))


Сообщение отредактировал Povstanetz: 04 February 2016 - 19:51

  • 0

#12 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 05 February 2016 - 18:27

 

Еще бы мне научится создавать группы из массива (i+1), а не 20 раз писать цикл для 20 групп)))

 

BIS_fnc_spawnGroup

/*
	File: spawnGroup.sqf
	Author: Joris-Jan van 't Land, modified by Thomas Ryan

	Description:
	Function which handles the spawning of a dynamic group of characters.
	The composition of the group can be passed to the function.
	Alternatively a number can be passed and the function will spawn that
	amount of characters with a random type.

	Parameter(s):
	_this select 0: the group's starting position (Array)
	_this select 1: the group's side (Side)
	_this select 2: can be three different types:
		- list of character types (Array)
		- amount of characters (Number)
		- CfgGroups entry (Config)
	_this select 3: (optional) list of relative positions (Array)
	_this select 4: (optional) list of ranks (Array)
	_this select 5: (optional) skill range (Array)
	_this select 6: (optional) ammunition count range (Array)
	_this select 7: (optional) randomization controls (Array)
		0: amount of mandatory units (Number)
		1: spawn chance for the remaining units (Number)
	_this select 8: (optional) azimuth (Number)
	_this select 9: (optional) force precise position (Bool, default: true).
	_this select 10: (optional) max. number of vehicles (Number, default: 10e10).

	Returns:
	The group (Group)
*/

PS

Я делал это (часть целого :) )

Прикрепленный файл  NPC.rar   7.19К   14 Количество загрузок:

 

для этого проекта

https://arma3.ru/for...arium-platform/

 

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

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

Цель этих ботов, блудить по карте, и отстреливать встречных, которые им не по душе).

 

Рекомендую ознакомиться с проектом, почерпнёте не мало полезного для себя.


Сообщение отредактировал SteelRat: 05 February 2016 - 19:03

  • 0

#13 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 05 February 2016 - 18:36

 

К сожалению, глобальная координата как-то коряво ставит юнитов (+- 1 метр),

Может по экспериментировать с этим

 

getPosWorld

setPosWorld

 

Вообще, после команды

_unit = _zamokinsidegrp createUnit [_zamoktype, getpos zamokinside, [], 0, "NONE"];

Имеет смысл, почти всегда задать позицию размещения, так это работает.

_unit setPos _position;

 

Правда, всё равно не особо помогает, даже dostop, при опасности начинают ходить-бродить))

_soldier1 disableAI "MOVE";

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

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


Сообщение отредактировал SteelRat: 05 February 2016 - 18:39

  • 0




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