Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

[ROZWIĄZANE] Wytłumaczenie Pętli


  • Zamknięty Temat jest zamknięty
4 odpowiedzi w tym temacie

#1 Kogut

    Wszechpomocny

  • Użytkownik

Reputacja: 48
Pomocny

  • Postów:317
  • GG:
  • Lokalizacja:warszawa
Offline

Napisano 10.12.2012 19:03

Witam
Może mi ktoś wytłumaczyć kiedy te 10 hp jest dodawane w tej pętli

public hpBack(){
for ( new i = 1 ; i < 33 ; i++ ){
if( !is_user_alive( i ) || !bKlasa[ i ] ){
continue;
}

diablo_add_hp( i , 10 );
}
}

i do tego jest taki set_task

set_task( 10.0 , "hpBack" , .flags = "b" );

  • +
  • -
  • 0

#2 K!113r

    Teraz to chyba Sławek kek

  • Power User

Reputacja: 387
Wszechpomocny

  • Postów:868
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Piotrków Tryb.
Offline

Napisano 10.12.2012 19:34

Co do pętli
Tworzona jest zmienna "i", która przyjmuje wartość 1 (jest to indeks pierwszego gracza, możliwe indeksy graczy to 1-32), następnie podany jest warunek, który musi zostać spełniony aby pętla mogła wykonać dany kod (mogła wykonać iterację), na końcu podane masz, że po wykonaniu się kodu pętli zmienna "i" zostanie zwiększona o 1, jest to postinkrementacja (http://amxx.pl/topic/2790-a-czy-a/ ).
Dany kod pętli przebiega po wszystkich indeksach graczy (jak już wspomniałem od 1-32, można byłoby to zrobić optymalniej to maksymalnej ilości slotów, gdyż nie ma sensu sprawdzać indeksów powyżej np. 20 na 20 slotowym serwerze), najpierw sprawdzany jest warunek czy gracz o danym indeksie nie żyje lub nie ma klasy (o czym informuje nas znak wykrzyknika (!), który oznacze negację. Warunek is_user_alive() - gracz jest żywy, warunek !is_user_alive() - gracz jest nieżywy), jeżeli warunek jest spełniony to dalszy kod funkcji jest pomijany, zmienna zwiększana o 1 i kod wykonuje się znowu dla zwiększonej zmiennej "i" (najpierw przechodzi przez główny warunek pętli i<33, jeżeli jeszcze spełnia to wykonuje się znowu kod pętli, jeżeli nie to pętla kończy swe działanie, zmienna "i" zostaje już usunięta ze stosu i na tym kończy swe działanie ta wywołana funkcja). Teraz tylko krótkie dokończenie opisu, ponieważ wcześniej stanęliśmy na warunku

if( !is_user_alive( i ) || !bKlasa[ i ] )

i rozpatrujemy go, że warunek nie został spełniony (czyli gracz żyje lub ma daną klasę), po czymwykonuje się funkcja diablo_add_hp(), która zapewne dodaje hp o daną ilość danemu graczowi o indeksie "i".

Co to tasku, task po jego wywołaniu, wywołuje funkcję hpBack() nieskończoną ilość razy (flaga "b" - wykonuje się nieskończoną ilość razy http://amxx.pl/dokum...szukaj/set_task ) co 10 sekund, aż do momentu usunięcia tasku funkcją remove_task()

ten task równie można zapisać tak:

set_task( 10.0 , "hpBack" , _, _, _, "b" );


W takim duecie, dodawanie hp odbywa się u wszystkich co 10 sekund (warunkiem jest fakt, że gracz musi być żywy lub mieć daną klasę)

Nie wiem jakie jest założenie tego kodu, ale ja bym zmienił na

if( !bKlasa[ i ] && !is_user_alive( i ) )


Bo przy warunku jakim posiadasz, gdy gracz nie będzie żywy, a będzie miał daną klasę, będzie spróbowane dodanie mu hp (martwemu nie można dać hp :D, no chyba, że w danej funkcji natywnej przed dodaniem hp sprawdzane jest czy gracz jest żywy).
W moim warunku, aby gracz dostał hp gracz musi żyć i mieć daną klasę (do tego przestawienie elementów warunku, spowodowane tym że warunki czytane są od lewej, czyli u mnie pierwszy warunek składa się ze zmiennej w pluginie, a drugi jest funkcją natywną, gdzie musi być ona wywołana, pobrana i przyrównana (operacji jest trochę więcej i wykonuje się to ciu dłużej), lecz przestawienie elementów warunku jest czystą optymlizacją).
sebul (10.12.2012 20:10):
Warunek jest dobrze napisany, jeśli gracz nie będzie żył lub jeśli nie będzie miał klasy to nie doda mu hp.

  • +
  • -
  • 2

DarkGL to mój autorytet.

skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować


#3 speedkill

    Godlike

  • Przyjaciel

Reputacja: 1 592
Godlike

  • Postów:2 733
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Prudnik
Offline

Napisano 10.12.2012 19:40

Gracz dostaje 10 hp, gdy jest żywy oraz posiada klasę ;)
  • +
  • -
  • 1

If you can dream it, you can do it.


#4 Kogut

    Wszechpomocny

  • Autor tematu
  • Użytkownik

Reputacja: 48
Pomocny

  • Postów:317
  • GG:
  • Lokalizacja:warszawa
Offline

Napisano 10.12.2012 20:06

Ok już rozumiem wszystko dzięki wielkie, K!113r jesteś niesamowity :crazy:
Duży plus
  • +
  • -
  • 0

#5 speedkill

    Godlike

  • Przyjaciel

Reputacja: 1 592
Godlike

  • Postów:2 733
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Prudnik
Offline

Napisano 10.12.2012 20:07

Wiadomość wygenerowana automatycznie


Ten temat został zamknięty przez moderatora.

Powód: Pomoc udzielona

Jeśli się z tym nie zgadzasz, Dołączona grafika raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.


Z pozdrowieniami,
Zespół AMXX.PL
  • +
  • -
  • 0

If you can dream it, you can do it.





Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych