07.09.2009, 00:06 | #1 (permalink) |
Registriert seit: 26.03.2008
Beiträge: 2.822
|
Luftabwehr Radar
Soo ... wollte mal wieder ein nettes Feature skripten, aber da hab ich ein kleines Problem
Wollte das Luftabwehr Radar funktionstüchtig machen. Alle Flugzeuge im Radius von 1 km sollen auf der Karte markiert werden. Habe folgendes probiert: Code:
_radar = _this select 0; _enemyside = _this select 1; _i = 0; While {(alive _radar)} do { _air = _radar nearObjects ["AIR",1000]; hint format ["%1",_air]; _plane = _air select _i; _type = typeOf _plane; _max = (count _air) - 1; _i = _i + 1; { _m = createMarkerLocal ["planemarker", position _x]; _m setMarkerTypeLocal "Warning"; _m setMarkerTextLocal _type; } foreach _air; If (_i > _max) then {_i = 0}; sleep 1; deleteMarkerLocal _m; }; Code:
_handle = [this] execVM "radar.sqf"; Außerdem funktioniert die Löschung des Markers nicht :/
__________________
|
07.09.2009, 00:10 | #2 (permalink) |
Registriert seit: 02.04.2003
Ort: San Francisco
Beiträge: 1.919
|
Dir fehlt die for-Schleife.
Die while-Schleife läuft solange der Radar lebt; dann fehlt halt noch die Schleife, die für jedes Luftfahrzeug einmal den Marker setzt. Also im Prinzip in Pseudocode while (alive) { alle_Flugzeuge auslesen for alle_Flugzeuge do { marker erstellen } } |
07.09.2009, 00:31 | #3 (permalink) |
Registriert seit: 26.03.2008
Beiträge: 2.822
|
for ... foreach ... alles das selbe
Code:
_radar = _this select 0; _enemyside = _this select 1; _i = 0; While {(alive _radar)} do { _air = _radar nearObjects ["AIR",1000]; hint format ["%1",_air]; _plane = _air select _i; _type = typeOf _plane; _max = (count _air) - 1; for [{_i = 0},{_i <= _max},{_i = _i + 1}] do { _m = createMarkerLocal ["planemarker", position _plane]; _m setMarkerTypeLocal "Warning"; _m setMarkerTextLocal _type; }; _i = _i + 1; If (_i > _max) then {_i = 0}; sleep 1; deleteMarkerLocal _m; };
__________________
|
07.09.2009, 00:51 | #4 (permalink) |
Registriert seit: 02.04.2003
Ort: San Francisco
Beiträge: 1.919
|
Na ja, also oben dein Script war gelinde gesagt verwirrend, da war vieles durcheinander geworfen.
Das aktuelle sieht schon strukturierter und durchdachter aus, trotzdem ist hier noch vieles falsch. 1.) _plane verweist immer auf das selbe Flugzeug! Das gehört in die for-Schleife, denn hier läuft die Variable _i und nicht außerhalb. 2.) Die Markernamen müssen natürlich noch dynamisch angepasst werden. Momentan wird jeder Marker mit _m referenziert, d.h., nach einem Ablauf der while-Schleife ist immer nur noch der letzte Marker unter _m abelegt! Also wird auch nur dieser eine gelöscht! Fix das erstmal, dann schauen wir weiter Geändert von TeRp (07.09.2009 um 00:53 Uhr). |
07.09.2009, 01:35 | #5 (permalink) |
Registriert seit: 26.03.2008
Beiträge: 2.822
|
1. Argh stimmt, hast Recht. Gehört ja in die Forschleife ^^
2. Wie mach ich denn so einen dynamischen Namen? ^^ Steh grad aufm Schlauch. Ist ja auch schon halb 2 Code:
_radar = _this select 0; _enemyside = _this select 1; _i = 0; While {(alive _radar)} do { _air = nearestObjects [_radar,["AIR"],1000]; hint format ["%1",_air]; _max = (count _air) - 1; for [{_i = 0},{_i <= _max},{_i = _i + 1}] do { _plane = _air select _i; _type = typeOf _plane; _m = createMarkerLocal ["Marker", position _plane]; _m setMarkerTypeLocal "Warning"; _m setMarkerTextLocal _type; }; sleep 1; deleteMarkerLocal _m; }; Lol ... gerade beim Testen hat sich wohl der KA-52 Pilot überlegt, dass das Radar doch keine so gute Idee ist. Er hat dann gewendet und ist mit Fullspeed in das Radar reingeflogen und hats zerstört. Lol. Der hatte nicht mal einen Wegpunkt und das Radar ist sogar Leer Und da soll mal einer sagen, die KI ist in ArmA 2 nicht gut. Die denkt sogar mit.
__________________
|
08.09.2009, 22:18 | #7 (permalink) |
Registriert seit: 26.03.2008
Beiträge: 2.822
|
In den meisten Fällen ja lol.
Aber es funktioniert jetzt. Feindliche Truppen werden auf der Karte mit einem Marker markiert Dieser bewegt sich dann im 1 Sekunden Takt immer an die aktuelle Position des Feindes. Baue evtl. noch ein, dass die eigenen verbündeten Lufteinheiten auch auf der Karte mit grünen Markierungen dargestellt werden.
__________________
|
08.09.2009, 23:14 | #8 (permalink) |
Registriert seit: 31.05.2009
Beiträge: 321
|
hast du schon ne angabe, obs sich um jäger, bomber oder helis handelt drin?
__________________
Kickstart fighter launch Throttle set to full Speed king race to win Afterburners roaring Ghostlike counterstrike Takes them by surprise |
09.09.2009, 00:27 | #10 (permalink) |
Registriert seit: 31.05.2009
Beiträge: 321
|
achso ja, das geht natürlich auch..
ich dachte, du lässt auf der karte nur rote und grüne "bleeps", also punkte, erscheinen^^
__________________
Kickstart fighter launch Throttle set to full Speed king race to win Afterburners roaring Ghostlike counterstrike Takes them by surprise |
17.09.2009, 21:57 | #13 (permalink) |
Registriert seit: 31.05.2009
Beiträge: 321
|
ich würd mal sagen, so wie es in den warfare-missionen auch gelöst ist. also das nur die eigene seite marker, die für truppenteile stehen, sehen kann
__________________
Kickstart fighter launch Throttle set to full Speed king race to win Afterburners roaring Ghostlike counterstrike Takes them by surprise |
18.10.2009, 22:33 | #15 (permalink) |
Registriert seit: 26.03.2008
Beiträge: 2.822
|
Code:
// ******************************************** // Script File for ArmA2 // Made by: Cyborg11 // Version: 1.0 // Usage: // _handle = [radarname, enemyside, radius, minheight, maxheight] execVM "radar.sqf"; // Example: // _handle = [this,east,1500,30,600] execVM "radar.sqf"; // ******************************************** _radar = _this select 0; _enemyside = _this select 1; _radius = _this select 2; _minheight = _this select 3; _maxheight = _this select 4; _i = 0; _markers = []; While {(alive _radar)} do { _air = nearestObjects [_radar,["AIR"],_radius]; _max = (count _air) - 1; for [{_i = 0},{_i <= _max},{_i = _i + 1}] do { _plane = _air select _i; _type = typeOf _plane; _m = createMarkerLocal [format ["%1_%2", _type, _plane], position _plane]; _height = (getPosASL _plane) select 2; If (((side _plane) == _enemyside && _enemyside == east) && ((_height > _minheight) && (_height < _maxheight))) then { _m setMarkerTypeLocal "o_air"; _m setMarkerColorLocal "ColorRed"; _m setMarkerTextLocal (format ["%1",_type]); }; If (((side _plane) == _enemyside && _enemyside == west) && ((_height > _minheight) && (_height < _maxheight))) then { _m setMarkerTypeLocal "b_air"; _m setMarkerColorLocal "ColorRed"; _m setMarkerTextLocal (format ["%1",_type]); }; _markers = _markers + [_m]; }; sleep 1; {deleteMarkerLocal _x} foreach _markers; }; Also wäre im Moment eher was für Coop. Test für 2 Seiten schaut so aus: Code:
// ******************************************** // Script File for ArmA2 // Made by: Cyborg11 // Version: 1.0 // Usage: // _handle = [radarname, enemyside, radius, minheight, maxheight] execVM "radar.sqf"; // Example: // _handle = [this,east,1500,30,600] execVM "radar.sqf"; // ******************************************** _radar = _this select 0; _ownside = _this select 1; _radius = _this select 2; _minheight = _this select 3; _maxheight = _this select 4; _i = 0; _markers = []; While {(alive _radar)} do { _air = nearestObjects [_radar,["AIR"],_radius]; _max = (count _air) - 1; for [{_i = 0},{_i <= _max},{_i = _i + 1}] do { _plane = _air select _i; _type = typeOf _plane; _m = createMarkerLocal [format ["%1_%2", _type, _plane], position _plane]; _height = (getPosASL _plane) select 2; If ((_height > _minheight) && (_height < _maxheight)) then { If (_ownside == west && (side _plane) == _ownside) then { _m setMarkerTypeLocal "b_air"; _m setMarkerColorLocal "ColorGreen"; _m setMarkerTextLocal (format ["%1",_type]); } else { _m setMarkerTypeLocal "o_air"; _m setMarkerColorLocal "ColorRed"; _m setMarkerTextLocal (format ["%1",_type]); }; If (_ownside == east && (side _plane) == _ownside) then { _m setMarkerTypeLocal "o_air"; _m setMarkerColorLocal "ColorGreen"; _m setMarkerTextLocal (format ["%1",_type]); } else { _m setMarkerTypeLocal "b_air"; _m setMarkerColorLocal "ColorRed"; _m setMarkerTextLocal (format ["%1",_type]); }; }; _markers = _markers + [_m]; }; sleep 1; {deleteMarkerLocal _x} foreach _markers; };
__________________
|
18.10.2009, 23:02 | #16 (permalink) |
Registriert seit: 18.10.2009
Beiträge: 30
|
Great Dude! Ich hoffe hiermit klappen die Gehversuche auf meiner Seite besser. Das mit der zweiten Schleife hatte ich auch schon nachgebaut.
UPDATE: Supercool. Wollte noch einen Kreis auf die Map zeichen (dachte DrawMapEllipse macht das ^^) aber das ging dann schief weil ich irgendwie eine referenz auf die map brauche. Das ist zuviel des guten gerade bei so wenig offizieller Dokumentaion. Geändert von baumeister (18.10.2009 um 23:39 Uhr). |
24.01.2011, 21:15 | #19 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Hier ein Radar welches unbekannte Flugobjekte blau, feindliche rot und eigene grün anzeigt.
Dazu auch im Anhang eine Beispielmission. Code:
// Radar zeigt Flugobjekte [Vienna, 24.01.2011] // Unbekannte Flugobjekte sind blau, eigene grün, feindliche rot. // Aufruf: [Radarobjekt, Radarradius, minimale Flugobjekthöhe] execVM "Radar.sqf" // Beispiel für Auslöser: temp = [player,2000,10] execVM "Radar.sqf" private ["_radar","_radius","_hoehe","_marker","_m","_c","_t"]; _radar = _this select 0; _radius = _this select 1; _hoehe = _this select 2; while {alive _radar} do { //Map offen? if (visibleMap) then { _marker = []; //Durchlauf aller Flugobjekte im Radarbereich { if (getPos _x select 2 > _hoehe) then { //Marker für Flugobjekte erstellen _m = createMarkerLocal [str _x, position _x]; _m setMarkerTypeLocal "b_air"; if(player countUnknown[_x]==1)then{_t=" ?";_c="ColorBlue"} else{_t=typeOf _x;if(player countFriendly[_x]==1)then{_c="ColorGreen"} else{_c="ColorRed"}}; _m setMarkerTextLocal str _t; _m setMarkerColorLocal _c; _marker = _marker + [_m] } } forEach nearestObjects [_radar,["AIR"],_radius]; sleep 2; //alle Flugobjektmarker löschen {deleteMarkerLocal _x} foreach _marker } else { sleep 2 } } |
03.02.2011, 23:47 | #20 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
In dieser Version wird der Radarbereich durch eine blinkende Kreislinie angezeigt (nicht ident mit dem zweiten Skript in obiger Beispielmission, das den Radarbereich als blinkende Fläche anzeigt).
Code:
// Lokales Radar zeigt Flugobjekte [Vienna, 03.02.2011] // Unbekannte Flugobjekte sind blau, freundliche grün, feindliche rot. // Aufruf: [Radarobjekt, Radarradius, minimale Flugobjekthöhe] execVM "Radar.sqf" // Beispiel für Auslöser: temp = [player,2000,10] execVM "Radar.sqf" private ["_radar","_radius","_hoehe","_r","_marker","_m","_c","_t"]; _radar = _this select 0; _radius = _this select 1; _hoehe = _this select 2; while {alive _radar} do { //Map offen? if (visibleMap) then { //Durchlauf aller Flugobjekte im Radarbereich _marker = []; { if (getPos _x select 2 > _hoehe) then { //Marker für Flugobjekte erstellen _m = createMarkerLocal [str _x, position _x]; _m setMarkerTypeLocal "b_air"; if(player countUnknown[_x]==1)then{_t=" ?";_c="ColorBlue"} else{_t=typeOf _x;if(player countFriendly[_x]==1)then{_c="ColorGreen"} else{_c="ColorRed"}}; _m setMarkerTextLocal str _t; _m setMarkerColorLocal _c; _marker = _marker + [_m] } } forEach nearestObjects [_radar,["AIR"],_radius]; sleep 2.7; //Marker für Radarreichweite erstellen _r = createMarkerLocal ["FlugobjektRadar4711", position _radar]; _r setMarkerShapeLocal "ELLIPSE"; _r setMarkerBrushLocal "BORDER"; _r setMarkerSizeLocal [_radius,_radius]; _r setMarkerColorLocal "ColorOrange"; sleep 0.3; //Reichweitenmarker löschen deleteMarkerLocal _r; //alle Flugobjektmarker löschen {deleteMarkerLocal _x} foreach _marker } else { sleep 2 } } |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|
Ähnliche Themen | ||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
Radar/Aircontroller | Al Simmons | Mod und Addon Ecke | 5 | 15.06.2006 19:50 |