Skocz do zawartości
Przemcio

Timery

Rekomendowane odpowiedzi

Witam, z racji tej, że moje forum po długotrwałym hacku upadło całkowicie (niby działa, ale kto o nim jeszcze pamięta?), to wystawiam wszystkie moje poradniki z tamtego forum na te. Co zrobią ze swoimi inni, którzy pisali na tamtym forum - ich wola, więc zaczynajmy. W tym poradniku opiszę 3 funkcje timerów - SetTimer, SetTimerEx i KillTimer.

Czym jest timer?

Timer to wywołanie funkcji po określonym przez nas czasie. Funkcja ta musi być publiczna, inaczej nie może zostać ona wywołana przez SetTimer/SetTimerEx. Jak zrobić funkcję publiczną? Opisałem to w wyżej wymienionym poradniku.

SetTimer

SetTimer służy do wywoływania funkcji, które nie mają żadnych argumentów. SetTimer ma 3 argumenty:

funcname[] - w " " wpisujemy nazwę funkcji,

interval - czas po jakim następuje wywołanie funkcji w milisekundach (1 sekunda - 1000 milisekund),

repeating - jeśli damy tutaj 1, to funkcja będzie się powtarzała co określony przez nas czas. Można to zatrzymać za pomocą KillTimer, o którym napiszę niżej.

Przykład użycia:

SetTimer("MojaFunkcja", 3000, 0); //Za 3 sekundy wykona się funkcja o nazwie "MojaFunkcja" 

[...] 

forward MojaFunkcja(); 
public MojaFunkcja() 
{ 
	SendClientMessageToAll(0xFFFFFFFF, "Właśnie minęły 3 sekundy!"); //Wysyłamy wiadomość do wszystkich
	return 1; 
}
UWAGA! Początkujący bardzo często popełniają błąd, mianowicie używają SetTimer do wywoływania funkcji z argumentami, najczęściej playerid. Pamiętaj, że:
SetTimer("MojaFunkcja", 3000, 0); 

forward MojaFunkcja(playerid); 
public MojaFunkcja(playerid) 
{ 
	SendClientMessage(playerid, 0xFFFFFFFF, "Właśnie minęły 3 sekundy!"); 
	return 1; 
}
Takie coś jest błędne! playerid przyjmuje wtedy wartość 0 i zadziała to tylko na gracza o ID 0! Jeśli chcesz zrobić timer, który będzie działał na jednego gracza użyj SetTimerEx, który zaraz opiszę. Ten błąd też często jest popełniany przy próbie zrobienia timera działającego na wszystkich graczy na serwerze, w tym celu używamy pętli:
forward MojaFunkcja(); 
public MojaFunkcja() 
{ 
	for(new i, Max = GetMaxPlayers(); i < Max; i++) 
	{ 
		if(IsPlayerConnected(i)) 
		{ 
			GivePlayerMoney(i, 1000); //Dajemy wszystkim podłączonym graczom $1000
		} 
	} 
	return 1; 
}
Wiem, że powyższy kod można skrócić (usunąć klamry), ale chcę uniknąć pytań od początkujących czemu mi to nie działa. SetTimerEx SetTimerEx służy do tego samego, co SetTimer, jednak ma jedną ważną funkcję - może przekazywać wartości do funkcji, czyli śmiało możemy nim wywoływać funkcje z argumentami. SetTimerEx ma 5 argumentów: funcname[] - w " " wpisujemy nazwę funkcji, interval - czas po jakim następuje wywołanie funkcji w milisekundach (1 sekunda - 1000 milisekund), repeating - jeśli damy tutaj 1, to funkcja będzie się powtarzała co określony przez nas czas. Można to zatrzymać za pomocą KillTimer, o którym napiszę niżej. const format[] - w " " wpisujemy rodzaj danych, który przekazujemy, czyli np. s, i, f. Więcej napiszę niżej, {Float,_}:... - tutaj wpisujemy dane, które chcemy przekazać (np. zmienne). Więcej napiszę niżej. Na pewno zastanawiacie się o co chodzi z dwoma ostatnimi argumentami, już tłumaczę. Najpierw musimy stworzyć funkcję z jakimś argumentem, do której będziemy chcieli się odwołać. Wyżej pisałem o funkcjach z argumentem playerid, więc stwórzmy taką funkcję:
forward MojaFunkcja(playerid); 
public MojaFunkcja(playerid) 
{ 
	GivePlayerMoney(playerid, 1000); //Dajemy $1000 podanemu ID
	SendClientMessage(playerid, oxFFFFFFFF, "Bu!"); //Wysyłamy wiadomość do podanego ID
	return 1; 
}
Teraz chcemy ją wywołać za pomocą SetTimerEx, więc robimy:
//Taki kod dajemy np. do komendy, lub do jakiegoś callbacka, w którym jest playerid
SetTimerEx("MojaFunkcja", 1000, 0, "i", playerid);
Pierwszych trzech argumentów nie będę opisywał, bo zrobiłem to już przy SetTimer, więc zajmiemy się dwoma ostatnimi, czemu w przedostatnim jest 'i'? Bo playerid to integer (liczba całkowita), w ostatnim argumencie dałem playerid, bo taką wartość chcę przekazać do timera. Pamiętaj, że to, co wpisujesz w SetTimerEx nie musi mieć takiej samej nazwy jak argument w Twojej funkcji. Możesz sobie zrobić takie coś:
SetTimerEx("MojaFunkcja", 1000, 0, "i", 3);
I wtedy przekażesz wartość 3 do playerid w funkcji. Teraz zrobimy bardziej złożoną funkcję:
forward MojaFunkcja(playerid, Ilosc, const Tekst[], Float:Z); 
public MojaFunkcja(playerid, Ilosc, const Tekst[], Float:Z) 
{ 
	new
		Koordy[3]; //Tworzymy tablicę
	GetPlayerPos(playerid, Koordy[0], Koordy[1], Koordy[2]); //Pobieramy pozycję gracza
	SetPlayerPos(playerid, Koordy[0], Koordy[1], Z); //Zmieniamy pozycję gracza zachowując przy tym jego X i Y
	GivePlayerMoney(playerid, Ilosc); //Dajemy określoną ilość pieniędzy
	SendClientMessage(playerid, 0xFFFFFFFF, Tekst); //Wysyłamy określoną wiadomość
	return 1; 
}
I SetTimerEx do niej:
SetTimerEx("MojaFunkcja", 1000, 0, "iisf", playerid, 1000, "Bu!", 0.2);
Jak widzicie, w przedostatnim argumencie napisałem iisf, bo po kolei argumenty w naszej funkcji to integer, integer, string i float. Nie umiem dobrze tego wytłumaczyć, ale mam nadzieję, że przynajmniej trochę rozjaśniłem na czym polega SetTimerEx. KillTimer Czas na ostatnią funkcję związaną z timerami - KillTimer, ta funkcja zabija (czyli wyłącza) nasz timer i usuwa pozostałości po nim z pamięci. Ma tylko jeden argument, mianowicie ID timera. Jak zdobyć ID timera? Np. zapisać do zmiennej w taki sposób:
//Tworzymy gdzieś zmienną oczywiście

[...] 

NaszaZmienna = SetTimer(...); //To samo w przypadku SetTimerEx
Potem gdy chcemy zabić timer robimy po prostu:
KillTimer(NaszaZmienna);

Zaleca się używanie KillTimer po każdym użyciu pojedynczego timera (czyli takiego, który w argumencie repeating ma 0), ponieważ te timery nie usuwają się do końca z pamięci, a KillTimer usunie wszystkie pozostałości po tych timerach.

Dziękuję za uwagę.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wydaje mi się, że albo poprzez pętlę, jeżeli timer jest przypisany do zmiennej typu timer[playerid] = SetTimer...; albo po prostu KillTimer(timer) jeżeli jest globalny  :huh:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×