PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Random Distance


killshot
15.11.2013, 08:39
Hey,

ich würde eine Gruppe gerne innerhalb eines zufälligen Radius zum SpawnMarker erstellen lassen. Gibt es da eine Möglichkeit, die mit dem Script hier kompatibel ist? In etwa wie das Rotmarkierte, nur in funktionierend sozusagen ^^


if (!isServer) exitWith {};

_grp1patr = [markerPos "Wald" + (Random 100), EAST, ["TK_Commander_EP1", "TK_Soldier_EP1", "TK_Soldier_MG_EP1", "TK_Soldier_GL_EP1", "TK_Soldier_Medic_EP1", "TK_Soldier_AR_EP1"]] call BIS_fnc_spawnGroup;
[_grp1patr,"area2","Spawned","Combat","delete:",30] execVM "scripts\upsmon.sqf";
Ich konnte da leider nichts Brauchbares ergooglen..

Danke und Gruß

[GNC]JamesRyan
15.11.2013, 09:58
Ja das ist doch so ok warum sollte das nicht gehen? Allerdings dachte ich, der Befehl heißt getMarkerPos "markerName"...naja, jedenfalls machst du darum einmal runde Klammern und kannst dann random 100 gerne benutzen, allerdings erzeugt dir das beliebige Kommazahlen, daher kannst du, musst du aber nicht, mit round ceil oder floor runden.

killshot
15.11.2013, 10:58
Danke schonmal!

Ob MarkerPos oder GetMarkerPos scheint nicht relevant zu sein, funktioniert zumindest augenscheinlich beides gleichwertig.

Ich hab jetzt nochmal

...[(markerPos "Wald" + random 100),...
...[(getMarkerPos "Wald" + random 100),...
...[(markerPos "Wald") + random 100,...
...[(getMarkerPos "Wald") + random 100,...

probiert, aber das Script läuft bei allen Varianten nicht durch, sprich es werden keine Einheiten gespawnt, geschweige denn in zufälliger Distanz zum Marker :D

[GNC]JamesRyan
15.11.2013, 18:11
Zunächst: Wenn du mit Skripten arbeitest, IMMER mit -showScripterrors starten, nur dann werden dir Compilerfehler angezeigt, sonst suchst du zu Tode. Ich denke ,es liegt nur an den falschen Klammern. Markerpos erwartet 1 Parameter, du hast danach aber noch einen, daher probier mal (getMarkerPos "Wald") + random 100. Geht das nicht, probier ichs nachher selbst

Edit: Sorry sehe erst jetzt, dass du 4 Varianten probiert hast.

Ich habe leider völlig geschlafen. Das skript möchte ja eine POSITION. Das ist aber vom Typ position, also ein 2D-Array mit [x,y]-Koordinate.

Natürlich ist es daher nicht möglich, auf markerPos "wald" irgendwie + 100 zu rechnen, was du machen musst ist folgendes:

(markerpos "Wald" select 0) + random 1oo // für x-Koord.
(markerpos "Wald" select 1) + random 100 // für y-Koord.

Das wären jetzt aber 2 Zahlenwerte, das Skript erwartet aber den Datentyp POSITION, also wieder das ganze in ein Array schreiben (daher am besten AUßERHALB deines Funktionsaufrufes als Hilfsvariable anlegen...

[[(markerPos "Wald" select 0) + random 100, (markerPos "Wald" select 1) + random 100)], ...]

Vienna
15.11.2013, 22:29
Eine Funktion welche eine zufällige Position im Bereich einer Position zurückgibt:

//Funktion: Rückgabe einer Position mit Bereich des 2. Parameters um die Position im 1. Parameter
//Aufrufbeispiel: ([Eine Position,Bereich um die Position] call Funktion_Bereich);
Funktion_Bereich =
{
[
((_this select 0)select 0) - (_this select 1)/2 + random(_this select 1),
((_this select 0)select 1) - (_this select 1)/2 + random(_this select 1)
]
};

//Testaufruf welche den Spieler um seinen Standort herum im Bereich von 100m versetzt:
player setPos ([position player,100] call Funktion_Bereich);

Von der Position wird vorerst die Hälfte es Bereichs abgezogen und dann der zufällige Bereich dieser Position wieder hinzugefügt.

killshot
16.11.2013, 05:31
Danke nochmals für Eure Hilfe, auch wenn das wie staubtrockener Zement für mein Gehirn ist!

Zumindest Viennas Lösung konnte ich schonmal zum Laufen bringen.


if (!isServer) then exitWith {};

_grp1patr = [getMarkerPos "Wald", EAST, ["TK_Commander_EP1", "TK_Soldier_EP1", "TK_Soldier_MG_EP1", "TK_Soldier_GL_EP1", "TK_Soldier_Medic_EP1"]] call BIS_fnc_spawnGroup;
[_grp1patr,"area2","Spawned","Combat","delete:",30] execVM "scripts\upsmon.sqf";

//Viennas Random-Distance-Funktion
Funktion_Bereich =
{
[
((_this select 0)select 0) - (_this select 1)/2 + random(_this select 1),
((_this select 0)select 1) - (_this select 1)/2 + random(_this select 1)
]
};

//(leader _grp1patr) setPos ([MarkerPos "Wald",100] call Funktion_Bereich);
{_x setPos ([MarkerPos "Wald",100] call Funktion_Bereich)} foreach units _grp1patr;
Wobei jetzt natürlich entweder nur der Leader oder aber jede einzelne Einheit der Gruppe ihre eigene Zufallsposition zugewiesen bekommt.

Das sind aber beides auf jeden Fall gute Lösungen, da die Gruppe sich relativ zügig zum Leader begibt oder aber es im zweiten Fall auch gut aussieht, wenn die Gruppe erstmal verstreut spawned.

Gibt es da auch einen Weg, der gesamten Gruppe den selben Zufallspunkt zuweisen zu lassen?


Was JamesRyan gesagt hat, leuchtet mir zwar irgendwie ein, aber ich habe leider keine Ahnung, wie ich das bewerkstellige.

Das sah dann in etwa so aus


if (!isServer) exitWith {};

_array = [[(markerPos "Wald" select 0) + random 100, (markerPos "Wald" select 1) + random 100]];

_grp1patr = [getPos _array, EAST, ["TK_Commander_EP1", "TK_Soldier_EP1", "TK_Soldier_MG_EP1", "TK_Soldier_GL_EP1", "TK_Soldier_Medic_EP1"]] call BIS_fnc_spawnGroup;
[_grp1patr,"area2","Spawned","Combat","delete:",30] execVM "scripts\upsmon.sqf";
oder



if (!isServer) exitWith {};

_array setVariable [[(markerPos "Wald" select 0) + random 100, (markerPos "Wald" select 1) + random 100]];

_grp1patr = [getPos _array, EAST, ["TK_Commander_EP1", "TK_Soldier_EP1", "TK_Soldier_MG_EP1", "TK_Soldier_GL_EP1", "TK_Soldier_Medic_EP1"]] call BIS_fnc_spawnGroup;
[_grp1patr,"area2","Spawned","Combat","delete:",30] execVM "scripts\upsmon.sqf";
Damit schieße ich wahrscheinlich um Unlängen am Ziel vorbei :D

Gruß

[GNC]JamesRyan
16.11.2013, 09:28
Wenn Viennas Lösung funktioniert, ist doch gut ;) Ist ja meine Lösung nur mit einem gemittelten Abstand.

Noch ein wort zu deinem letzten Code: So kann es nicht funktionieren. _array ist bei dir schon vom Typ Position, warum dann noch ein getpos davor? Geht sowieso nicht ,da getPos ein SPIELOBJEKT erwartet, _array aber eine lokale Variable ist. Einfach getpos weglassen und der Code. Allerdings hast du auch zu viele eckige Klammern. Eine Position ist vom Typ pos = [x,y], also bitte keine zwei Eckigen Klammern. Dann sollte auch das gehen. SetVariable macht da allerdings gar keinen Sinn, gleich streichen ^^

killshot
16.11.2013, 09:44
War auch auf gar keinen Fall mit nem scharfen Unterton von mir gemeint :D

Ganz im Gegenteil, deine Lösung find ich sehr interessant und das ist auch eigentlich eher das, was ich gesucht hatte!

Hab es dann jetzt auch nach deinem letzten Post gerade, zu meiner Überraschung, im ersten Versuch zum Laufen gebracht!


if (!isServer) exitWith {};

_randomDistance = [(markerPos "group" select 0) + random 100, (markerPos "group" select 1) + random 100];

_grp1patr = [_randomDistance, EAST, ["TK_Commander_EP1", "TK_Soldier_EP1", "TK_Soldier_MG_EP1", "TK_Soldier_GL_EP1", "TK_Soldier_Medic_EP1", "TK_Soldier_AR_EP1"]] call BIS_fnc_spawnGroup;
[_grp1patr,"area2","Spawned","Combat","delete:",30] execVM "scripts\upsmon.sqf";


Richtig geil! :)

Also großen Dank nochmal an euch beide!

killshot
16.11.2013, 10:18
Finale Version (sonst spawnen die Gruppen nur NordWest/SüdOst etc. vom Marker). Also doch eine Mischung aus beiden Antworten.

if (!isServer) exitWith {};


_randomDistance = [(markerPos "group" select 0) - 100/2 + random 100, (markerPos "group" select 1) - 100/2 + random 100];

_grp1patr = [_randomDistance, EAST, ["TK_Commander_EP1", "TK_Soldier_EP1", "TK_Soldier_MG_EP1", "TK_Soldier_GL_EP1", "TK_Soldier_Medic_EP1"]] call BIS_fnc_spawnGroup;
[_grp1patr,"area2","Spawned","Combat","delete:",30] execVM "scripts\upsmon.sqf";Problem zu 100% gelöst! Danke euch!

[GNC]JamesRyan
16.11.2013, 10:39
Natürlich, wir hatten ja nur random (eine Zahl), was nix anderes als immer + rechnet. Möchtest du eine Variable Distanz in beide Richtung, ist meine Lösung hier immer einen cos davorzusetzen, denn der cos nimmt nur werte zwischen -1 und 1 an, also genau eine Vorzeichenmöglichkeit. So kann man gut mit cos(random 360) beliebige Werte erzeugen, die gleichzeitig auch einen Nachfaktor bbeliebig skalieren, also z.B: (cos(random 360)*random 100) sollte alle Werte zwischen -100 und + 100 annehmen

Vienna
16.11.2013, 12:57
Bei [GNC]JamesRyans Variante erfolgt die Plazierung um den Mittelpunkt eines Kreises, bei meiner Variante um den Mittelpunkt eines Quadrates.

Hier nochmals beide Varianten zur Übersicht.

Kreisförmig

//Funktion: Rückgabe einer Position mit Bereich des 2. Parameters um die Position im 1. Parameter
//Aufrufbeispiel: [Eine Position,Bereich um die Position] call Funktion_Bereich
Funktion_Bereich =
{
[
((_this select 0)select 0) + cos(random 360)*(random (_this select 1)/2),
((_this select 0)select 1) + cos(random 360)*(random (_this select 1)/2)
]
};


Quadratisch

//Funktion: Rückgabe einer Position mit Bereich des 2. Parameters um die Position im 1. Parameter
//Aufrufbeispiel: [Eine Position,Bereich um die Position] call Funktion_Bereich
Funktion_Bereich =
{
[
((_this select 0)select 0)-(_this select 1)/2+random(_this select 1),
((_this select 0)select 1)-(_this select 1)/2+random(_this select 1)
]
};


Testaufruf zur Funktion, welche den Spieler um einen Marker-Mittelpunkt im Bereich von 100m im Sekundentakt versetzt.

temp = [player, getMarkerPos "MarkerName"] spawn
{
while{true}do
{
_this select 0 setPos ([_this select 1,100] call Funktion_Bereich);
sleep 1
}
};