HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing (https://hx3.de/editing-139/)
-   -   Problem mit Markerkontrolle (https://hx3.de/editing-139/problem-markerkontrolle-16144/)

GER_CJ-187 03.05.2009 02:35

Problem mit Markerkontrolle
 
Problem mit Markerkontrolle

Ich bin gerade dabei, eine Mission zu erstellen, wo man 13 Sektoren einnehmen muss...

Es gibt 3 Parteien, 2 sind Spielbar und die Dritte ist KI (Falschirmspringer für jeden Bereich, die kommen, wenn das örtliche KI Team ausgelöscht wurde)
Die Sektoren sind von der KI besetzt blau, von Seite 1 Grün und von Seite 2 Rot.

Das Spiel endet erst dann, wenn eine Seite alle sektoren hat. :confused:

Jetzt möchte ich aber, dass wenn Seite 1 und Seite 2 zur gleichen Zeit in einem bereich ist, dass dieser Marker dann gelb wird...:naughty:

Wie muss ich die Abfrage schreiben, West und Ost in Marker = Markerfarbe gelb ??? :komisch:

MfG - CJ

Buliwyf 03.05.2009 10:27

Du wirst wohl schwer um den Einsatz von Sensoren herum kommen. Sprich, Du wirst für die Stellungsbereiche jeweils einen Sensor platzieren müssen, der JEDE Seite erfasst und mit dem Du dann per COUNT abfragst, wieviel WEST/OST/NIEMAND in diesem Sensor drin sind/ist. Anhand dessen bestimmst Du dann die Markerfarbe.

Aber warum das Rad neu erfinden? Es gibt Ligamaps, in denen Du derartige Scripte findest. So ganz ohne ist das nämlich nicht. Schon garnicht, wenn das Ganze multiplayertauglich sein soll (Server/Client).

:rolleyes:

Vienna 03.05.2009 12:25

Liste der Anhänge anzeigen (Anzahl: 1)
Im Annahng ein Beispiel für einen Marker. Der färbt sich auf der Karte je nach Anwesenheit der Units:

grau = keine Einheit
grün = West
rot = East
blau = Resistance
gelb = zwei Seiten

Der Auslöser hat die Größe des Markers und der Auslöserbereich deckt sich mit dem Markerbereich. Im Auslöser wird ein Skript aufgerufen, welches die Umfärbung steuert.

Auslöser und Marker können beliebig kopiert werden. Danach einfach Auslöser- und Markernamen ändern (auch beim Skriptaufruf im Auslöser).

Dein KI Team muss der Seite Resistance angehören (Einstellung "freundlich zu niemandem"). Die Spieler haben Seite West und East. Denen solltest du auch KI-Einheiten zur Seite stellen, damit sie eoberte Sektoren besetzen und halten können.

Xeno 03.05.2009 13:28

Vienna, noch ein kleiner Tip :)

Anstatt per Loop über alle Einheiten im Trigger zu iterieren kannst Du die Anzahl einer Seite auch so bekommen:

_w = {side _x == west} count list _a;
_e = {side _x == east} count list _a;
_g = {side _x == resistance} count list _a;

Xeno

Vienna 03.05.2009 16:25

Ja, so geht es auch. Der "count" Befehl ist sehr mächtig und hier auch einfacher zu schreiben. Optimal, wenn man nur eine Seite abfragt.

In meinem Fall ist die "Systembelastung" mit forEach wahrscheinlich etwas geringer, weil das List-Array nur einmal durchlaufen wird.

Von der Schnelligkeit vielleicht noch besser wäre:
Code:

{
  _s = side _x;
  if(_s == west)then{_w = _w + 1};
  if(_s == east)then{_e = _e + 1};
  if(_s == resistance)then{_g = _g + 1}
}forEach list _a;

weil das Auslesen der "side" die meisten Takte benötigen wird.

GER_CJ-187 03.05.2009 16:30

vielen dank, hat mir gut weitergeholfen...

nur werden die Marker wieder schwarz, wenn niemand in diesem bereich ist.
ich wollte es so haben, dass der marker sich die letzte Einheit merkt und die Farbe beibehält, bis wieder eine andere Partei den Marker einnimmt...:ugly:

MfG - Christopher

Xeno 03.05.2009 19:16

Zitat:

Zitat von Vienna (Beitrag 230651)
Ja, so geht es auch. Der "count" Befehl ist sehr mächtig und hier auch einfacher zu schreiben. Optimal, wenn man nur eine Seite abfragt.

In meinem Fall ist die "Systembelastung" mit forEach wahrscheinlich etwas geringer, weil das List-Array nur einmal durchlaufen wird.

Bei einem Trigger der nur einen kleinen Bereich abfragt, wie es bei einer C+H üblich ist, kein Problem mit count :)

Wenn Du bei forEach bleibst... folgender Vorschlag zur "Code Optimierung" (es ist nicht nötig, eine weitere if Bedingung abzufragen, wenn bereits eine eingetreten ist):
Code:

{
    switch (side _x) do {
        case west: {_w = _w + 1};
        case east: {_e = _e + 1};
        case resistance: {_g = _g + 1};
    };
} forEach list _a;

Aber die Abfrage per count ist ebenfalls in Ordnung.

@GER_CJ-187
Schwer zu sagen, warum Dein Marker schwarz wird, Viennas Script macht es jedenfalls nicht.

Spielt sonst noch irgendein setMarker... mit dem Marker herum ?
Mixen von setMarkerxxx ohne local und mit local verursacht auch schon mal gerne Probleme (blinkende Marker, Markerpositonen hüpfen hin und her, etc).

Xeno

GER_CJ-187 03.05.2009 19:38

doch, hier ist der eintrag...

Zitat:

//Markerfarbe aufgrund der Zählung bestimmen
_f = "ColorBlack"; //keine Einheiten im Bereich
if(_w>0 and _e<1 and _g<1)then{_f = "ColorGreenAlpha"}; //grün: nur West im Bereich
if(_e>0 and _w<1 and _g<1)then{_f = "ColorRedAlpha"}; //rot : nur East im Bereich
if(_g>0 and _w<1 and _e<1)then{_f = "ColorBlue"}; //blau: nur Resi im Bereich
if((_w>0 and(_e>0 or _g>0))or(_e>0 and _g>0))then{_f="ColorYellow"}; //gelb: zwei Seiten im Bereich
_m setMarkerColorLocal _f;
hab ihn einfach mal entfernt...

Xeno 03.05.2009 21:34

Oh, hehe, übersehen :)

Xeno

Vienna 03.05.2009 21:49

Liste der Anhänge anzeigen (Anzahl: 1)
Das Streichen der grauen Farbe ergibt das Problem, wenn zwei vorhandene Gegner gleichzeitig sterben, dann bleibt die Farbe auf Gelb stehen.

In der neuen Beispielmission im Angang wird der Marker nur dann schwarz, wenn die letzte Markerfarbe gelb war. Bei Grün, Rot und Blau bleibt die Farbe erhalten.

Das Skript enthält auch die optimierte Version mit "switch".

GER_CJ-187 04.05.2009 01:03

cool danke, spitzen service :daumen::daumen::daumen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:54 Uhr.

Angetrieben durch vBulletin, Entwicklung von Philipp Dörner & Tobias


SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119