Nowe jednostki w losowych miejscach

Edytor Arma (Arma, Arma2, Arma2OA)

Moderatorzy: kondor, Inkwizytor

Awatar użytkownika
Sejtan
Posty: 112
Rejestracja: 03 kwietnia 2007, 20:54
ID Steam: sejtan24
Numer GG: 6538171
Lokalizacja: Starogard Gdański

Nowe jednostki w losowych miejscach

Post autor: Sejtan »

Witam :] Chciałem sobie napisać prosty skrypcik kreujący nowe jednostki w losowych miejscach. Niby nic trudnego... a jednak mam problem z tym random... :|

Kod: Zaznacz cały

_p =  [p1, p2, p3, p4, p5, p6];
_grp = createGroup east;
_unit = _grp createUnit ["Ins_Soldier_Pilot", position (random _p), [], 0, "FORM"];   
[_unit] join _grp;
Jak napiszę, że _p = p1 i wywale to random oraz nawias działa jak trzeba, ale oczywiście _unit tworzy się tylko w punkcie p1, a nie od p1 do p6. Jakieś sugestie?
Awatar użytkownika
kondor
Posty: 1526
Rejestracja: 13 marca 2007, 11:50
ID Steam: Przemek_kondor
Kontakt:

Re: Nowe jednostki w losowych miejscach

Post autor: kondor »

Tak, random zwraca liczbę i jego argumentem jest liczba: http://community.bistudio.com/wiki/random
To czego potrzebujesz, to:

Kod: Zaznacz cały

_p select (floor (random (count _p)))
zamiast

Kod: Zaznacz cały

random _p
albo coś w tym stylu jeśli się machnąłem - dla tych co się "machają" jest też funkcja http://community.bistudio.com/wiki/BIS_fnc_selectRandom, ale wymaga wstawienia modułu funkcji.
Poza tym już to było - poszukaj.
Awatar użytkownika
Sejtan
Posty: 112
Rejestracja: 03 kwietnia 2007, 20:54
ID Steam: sejtan24
Numer GG: 6538171
Lokalizacja: Starogard Gdański

Re: Nowe jednostki w losowych miejscach

Post autor: Sejtan »

Poradziłem sobie z problemem dzięki JaFrankowi. Oto cały skrypt odpowiadający za tworzenie jednostki w losowym miejscu i przemieszczanie się jej również w losowe miejsca:

Kod: Zaznacz cały

_pos = [p1, p2, p3, p4, p5, p6]; 
_des = [d1, d2, d3, d4, d5, d6]; 
_grp = createGroup east; 

while {true} do 
{ 
_liczba1 = round(random 5); 
_liczba2 = round(random 5); 
_element1 = (_pos select _liczba1); 
_element2 = (_des select _liczba2); 
_heli = createVehicle ["Mi17_Ins", position _element1, [], 0, "FLY"]; 

_unit1 = _grp createUnit ["Ins_Soldier_Pilot", position _element1, [], 0, "FORM"]; 
_unit2 = _grp createUnit ["Ins_Soldier_Pilot", position _element1, [], 0, "FORM"]; 
_unit3 = _grp createUnit ["Ins_Soldier_Pilot", position _element1, [], 0, "FORM"]; 
_unit4 = _grp createUnit ["Ins_Soldier_Pilot", position _element1, [], 0, "FORM"]; 
    
[_unit1] join _grp; 
[_unit2] join _grp; 
[_unit3] join _grp; 
[_unit4] join _grp; 

_unit1 moveInDriver _heli; 
_unit2 moveInGunner _heli; 
_unit3 moveInCargo _heli; 
_unit4 moveInCargo _heli; 

_unit1 doMove position _element2; 
sleep 500; 

deleteVehicle _heli; 
deleteVehicle _unit1; 
deleteVehicle _unit2; 
deleteVehicle _unit3; 
deleteVehicle _unit4; 
sleep 5; 
};
Teoretycznie mało przydatne, ale w praktyce w misjach dodaje smaczku, szczególnie jak się misję rozgrywa wiele razy... no i łatwo to przerobić np na losowy ruch pojazdów, nie tylko powietrznych. Sposób z wykożystaniem funkcji działał, ale wydaje mi się że nie tak dobrze jak ten opisany powyżej. Tak czy inaczej thx :)
Awatar użytkownika
kondor
Posty: 1526
Rejestracja: 13 marca 2007, 11:50
ID Steam: Przemek_kondor
Kontakt:

Re: Nowe jednostki w losowych miejscach

Post autor: kondor »

To, co podałem (oraz funkcja BISu) jest krótsze i bardziej elastyczne, bo liczy długość tablicy i się nie wywali jak odejmiesz lub dodasz element.
Poza tym, kod który napisałeś da się zapisać 4 razy krócej używając np pętli for.

[EDIT]
Już widać błąd tego podejścia - liczysz random 5, a masz 6 elementów...
Awatar użytkownika
Sejtan
Posty: 112
Rejestracja: 03 kwietnia 2007, 20:54
ID Steam: sejtan24
Numer GG: 6538171
Lokalizacja: Starogard Gdański

Re: Nowe jednostki w losowych miejscach

Post autor: Sejtan »

kondor pisze:To, co podałem (oraz funkcja BISu) jest krótsze i bardziej elastyczne, bo liczy długość tablicy i się nie wywali jak odejmiesz lub dodasz element. Poza tym, kod który napisałeś da się zapisać 4 razy krócej używając np pętli for...
Tak myślałem, że da się prościej... niestety nie jestem aż tak biegły w skryptach. Może jakiś przykład z tą pentelką?
Awatar użytkownika
kondor
Posty: 1526
Rejestracja: 13 marca 2007, 11:50
ID Steam: Przemek_kondor
Kontakt:

Re: Nowe jednostki w losowych miejscach

Post autor: kondor »

Przesadziłem może ze 4-krotnym spakowaniem, ale to byłoby mniej więcej tak:

Kod: Zaznacz cały

...
_heli = createVehicle ["Mi17_Ins", position _element1, [], 0, "FLY"]; 

for "_i" from 0 to 3 do 
{
  _liczba1 = floor (random count _pos);
  _liczba2 = floor (random count _des);
  _element1 = (_pos select _liczba1);
  _element2 = (_des select _liczba2); 

  _unit = _grp createUnit ["Ins_Soldier_Pilot", position _element1, [], 0, "FORM"]; 
  [_unit] join _grp;
  switch (_i) 
  {
     case 0: _unit moveInDriver _heli;
     case 1: _unit moveInGunner _heli;
     default: _unit moveInCargo _heli;
  };

  _grp doMove position _element2;
};

sleep 500;

deleteVehicle _heli;
{ deleteVehicle _x } forEach (units _grp);
sleep 5;
Awatar użytkownika
JaFranek
Posty: 5
Rejestracja: 15 września 2011, 16:31
ID Steam:
Numer GG: 2135026

Re: Nowe jednostki w losowych miejscach

Post autor: JaFranek »

kondor pisze:Już widać błąd tego podejścia - liczysz random 5, a masz 6 elementów...
Mylisz się bo tam jest podane round a nie floor.
Awatar użytkownika
kondor
Posty: 1526
Rejestracja: 13 marca 2007, 11:50
ID Steam: Przemek_kondor
Kontakt:

Re: Nowe jednostki w losowych miejscach

Post autor: kondor »

Tak, przeczytałem random zamiast round.
Poprawiłem poprzedni kod, chociaż i tak nie mam jak przetestować, więc może nie działać.
Awatar użytkownika
Sejtan
Posty: 112
Rejestracja: 03 kwietnia 2007, 20:54
ID Steam: sejtan24
Numer GG: 6538171
Lokalizacja: Starogard Gdański

Re: Nowe jednostki w losowych miejscach

Post autor: Sejtan »

kondor pisze:Tak, przeczytałem random zamiast round.
Każdemu się zdarza... właśnie dlatego nie wiem czemu pisałem:

Kod: Zaznacz cały

deleteVehicle _heli; 
deleteVehicle _unit1; 
deleteVehicle _unit2; 
deleteVehicle _unit3; 
deleteVehicle _unit4;

zamiast, dla uproszczenia:

Kod: Zaznacz cały

 {deleteVehicle _x} forEach (units _grp);
:|
Poprawiłem poprzedni kod, chociaż i tak nie mam jak przetestować, więc może nie działać.
No i niestety nie działa, ale nie ważne. Mam prośbę... Mógłbyś króciutko opisać jak ta pętla działa, bądź jak powinna działać?

Kod: Zaznacz cały

for "_i" from 0 to 3 do 
{
  _liczba1 = floor (random count _pos);
  _liczba2 = floor (random count _des);
  _element1 = (_pos select _liczba1);
  _element2 = (_des select _liczba2); 

  _unit = _grp createUnit ["Ins_Soldier_Pilot", position _element1, [], 0, "FORM"]; 
  [_unit] join _grp;
  switch (_i) 
  {
     case 0: _unit moveInDriver _heli;
     case 1: _unit moveInGunner _heli;
     default: _unit moveInCargo _heli;
  };

  _grp doMove position _element2;
};
Tzn. Nie rozumiem tego niestety...
sposób while {warunek} do albo if (condition) then {code} else {code} lub if (condition) then [ {code},{code} ] jako tako rozumiem, a powyższego sposobu niestety nie :oops:
Może jak to ogarnę sam poprawie skrypcik żeby działał :)
Awatar użytkownika
kondor
Posty: 1526
Rejestracja: 13 marca 2007, 11:50
ID Steam: Przemek_kondor
Kontakt:

Re: Nowe jednostki w losowych miejscach

Post autor: kondor »

http://community.bistudio.com/wiki/for_var
Pętla powinna się wykonać 4 razy - _i będzie w każdym obrocie przyjmować wartości kolejno 0, 1, 2 i 3
Czyli stworzy 4 jednostki i wyda im rozkazy.
_i jest wykorzystane tylko przy sprawdzeniu gdzie wsadzić nowo utworzonego wojaka (switch)
Awatar użytkownika
Sejtan
Posty: 112
Rejestracja: 03 kwietnia 2007, 20:54
ID Steam: sejtan24
Numer GG: 6538171
Lokalizacja: Starogard Gdański

Re: Nowe jednostki w losowych miejscach

Post autor: Sejtan »

No i już działa, ale bez while się nie obeszło :)

Kod: Zaznacz cały

_pos = [p1, p2, p3, p4, p5, p6];
_des = [d1, d2, d3, d4, d5, d6];
_grp = createGroup east;

while {true} do
{
	_liczba1 = floor (random count _pos);
	_liczba2 = floor (random count _des);
	_element1 = (_pos select _liczba1);
	_element2 = (_des select _liczba2);
	_heli = createVehicle ["Mi17_Ins", position _element1, [], 0, "FLY"]; 
	_heli setPosATL [getPosATL _element1 select 0, getPosATL _element1 select 1, (random 500)];
	
	for "_i" from 0 to 4 do 
	{
	 _unit = _grp createUnit ["Ins_Soldier_Pilot", position xyz, [], 0, "FORM"];
	 [_unit] join _grp;
		switch (_i) do
		{
			case 0: 
			{
			_unit moveInDriver _heli;
			};
			case 1:
			{
			_unit moveInTurret [_heli,[0]];
			};
			case 2:
			{
			_unit moveInTurret [_heli,[1]];
			};
			default
			{
			_unit moveInCargo _heli;
			};
		};
	 {_x doMove position _element2 && _x setSpeedMode "FULL" && _x flyInHeight (random 500)} forEach (units _grp);
	};
	sleep 500;
	deleteVehicle _heli;
	{deleteVehicle _x} forEach (units _grp);
};
Błąd tkwił w switch'u, a kod odpowiadający za stworzenie śmigła i tak musiałem umieścić pod while... inaczej jednostka tworzyła się tylko raz, a sama załoga co 500 sekund sleep 500;. Thx :)
ODPOWIEDZ

Wróć do „Edycja oraz tworzenie misji, skrypty oraz programowanie”