Teraz jest Cz 28 mar, 2024 15:13


skrypt pokazujący skład druzyny na mapie

Archiwum działów sekcji Armed Assault
  • Autor
  • Wiadomość
Offline
Avatar użytkownika

kondor

Major

Major

  • Posty: 880
  • Dołączył(a): Pt 11 lut, 2005 04:00
  • Lokalizacja: Berlin (wschodni)

skrypt pokazujący skład druzyny na mapie

PostŚr 17 paź, 2007 22:44

witam.
temat poruszany, ale dotychczas tylko na podstawie juz gotowych markerow, ktorym sie zmienia pozycję.
Aby pokazac na mapie za pomocą małych markerów pozycję członkow druzyny tworzę dynamicznie markery w liczbie rownej ilosci członkow i zmieniam im pozycję. Jednak po śmierci członka (nie chodzi o impotencję) i respawnie pokazywana jest pozycja trupa. Poza tym ilosc osob w druzynie moze byc zmienna, wiec co jakis czas trzeba usuwac markery i od nowa tworzyc w odpowiedniej liczbie.
Moj kod jest taki:
Kod: Zaznacz cały
_nr1 = player;

while{true}do{

   _units = Units _nr1;
   _count = Count _units;
   _marker_array = [];   
   
   for[{_i=0},{_i<_count},{_i=_i+1}]do{
      _name = format["m%1",_i];
      _mrob = createMarker [_name, [0,0]];
      _name setMarkerShape "ICON";
      _name setMarkerColor "ColorBlue";
      _name setMarkerType "Dot";
      _name setMarkerSize [0.2, 0.5];
      _marker_array = _marker_array + [_name];
   };
   
   //player
   _nameP = "mp";
   _mrob = createMarkerLocal [_nameP, [0,0]];
   _nameP setMarkerShapeLocal "ICON";
   _nameP setMarkerColorLocal "ColorGreen";
   _nameP setMarkerTypeLocal "Dot";
   _nameP setMarkerSizeLocal [0.2, 0.5];

   _rob = 0;
   while{_rob<30}do{
      sleep 3;
      _units = Units _nr1;
      _count = count _units;
      for[{_i=0},{_i<_count},{_i=_i+1}]do{
         _n = _marker_array select _i;
         _u = _units select _i;
         _n setMarkerPosLocal getPos _u;
      };
      _nameP setMarkerPosLocal getPos player;
      _rob = _rob + 1;
   };

   for[{_i=0},{_i<_count},{_i=_i+1}]do{
      _n = _marker_array select _i;
      deleteMarkerLocal _n;
   };
   deleteMarkerLocal _nameP;

};//while

if (true) exitWith {};



niestety jest po smierci wskazuje ciala oraz co pewien czas wszystkie markery znikają i pojawią się (no bo je niszcze i tworze z powrotem), a to nieladnie wygląda.
macie jakies pomysly na usprawnienie i naprawienie?
z gory dzieki
Offline
Avatar użytkownika

Kadryl

Major

Major

  • Posty: 883
  • Dołączył(a): Cz 14 wrz, 2006 14:04
  • Lokalizacja: Wa-wa

PostCz 18 paź, 2007 10:21

Jak dobrze zrozumiałem twój skrypt działa tak:
1) deklarujesz i tworzysz markery na mapie
2) przez 3 * 30 = 90 sekund aktualizujesz ich pozycję na mapie dla jednostek
3) likwidujesz wszystkie markery i idziesz do punktu nr 1.

Myślę że można to lekko usprawnić, mianowicie:
1) deklarujesz i tworzysz markery na mapie
2) tworzysz pętle aktualizacji pozycji jednostek na mapie z przerwaniem czasowym
Kod: Zaznacz cały
sleep 3
z której następuje wyjście tylko wtedy (i wyłącznie wtedy) gdy ginie jednostka.
Kod: Zaznacz cały
if (_aktualna_liczba_jedn  < _liczba_jedn) then {goto "punkt nr 3"}

3) likwidujesz wszystkie markery i idziesz do punktu nr 1.

Takie rozwiązanie pozwoli na płyną zmianę pozycji markerów bez ich likwidacji i tworzenia gdy nikt nie ginie. Likwidacja markerów i ich tworzenie będzie tylko w momenci zmiany ilości jednostek.
Offline
Avatar użytkownika

kondor

Major

Major

  • Posty: 880
  • Dołączył(a): Pt 11 lut, 2005 04:00
  • Lokalizacja: Berlin (wschodni)

PostCz 18 paź, 2007 11:04

dzieki Kardyl. warunek trzeba zmienic na !=. bo moze PRZYBYC tez jednostek (jak np jakis gracz dojdzie, a wyłączono AI).
Zrobilem poza tym uruchamianie tego skryptu tylko na serwerze skoro i tak użyłem markerów globalnych (we wczeniej napisanym skrypcie mialem blad, bo usuwalem lokalnie marker globalny :) )
teraz wyglada to tak:
Kod: Zaznacz cały
//---------------
// show group position
//---------------
_nr1 = g1;

while{true}do{

   _units = Units _nr1;
   _count = Count _units;
   _marker_array = [];   
   
   //--| tworzenie |------
   for[{_i=0},{_i<_count},{_i=_i+1}]do{
      _name = format["m%1",_i];
      _mrob = createMarker [_name, [0,0]];
      _name setMarkerShape "ICON";
      _name setMarkerColor "ColorBlue";
      _name setMarkerType "Dot";
      _name setMarkerSize [0.2, 0.5];
      _name setMarkerText (name (_units select _i));
      _marker_array = _marker_array + [_name];
   };

   //--| pokazywanie |------
   while{_count == count(Units _nr1)}do{
      
      sleep 3;      
      for[{_i=0}, {_i<_count}, {_i=_i+1}]do{
         _n = _marker_array select _i;
         _u = _units select _i;
         _n setMarkerPos getPos _u;
      };
   };

   //--| usuwanie |--------
   for[{_i=0},{_i<_count},{_i=_i+1}]do{   
      deleteMarker (_marker_array select _i);
   };

};//while

if (true) exitWith {};



tylko chciałbym zmniejszyć tekst markera, bo moglby byc mniejszy. Da sie to w ogole uczynic?

DODANE:
sprawa jest jednak jeszcze trudniejsza:
otoz warunek sprawdzenia biezacej ilosci osob w druzynie i porownanie go z wczesniejszym czasem nie zadziala jesli obrot tej petli jest nieczestszy niz 2 razy na czas odrodzenia jednostki. Poza tym tuz przed sprawdzeniem 1 osoba moze zginąc i 1 dojsc i wtedy tego nie wykryje.
poza tym okres pomiedzy usunieciem markerow i stworzeniem od poczatku nowych musi byc na tyle dlugi, aby martwa jednostka sie zdążyła odrodzic (zeby ją uwzglednic do tworzenia markera).
chyba po prostu w jakims eventHandlerze "killed", ktory dostaje kazda jednostka dam znac temu skryptowi, zeby posprzątał i czekał respawndelay od ostatniej smierci i stworzyl markery od poczatku
Ostatnio edytowano Cz 18 paź, 2007 12:54 przez kondor, łącznie edytowano 1 raz

Powrót do Armed Assault

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 5 gości

cron