Popular Post Lukasz 336 Odesláno: 12. Květen, 2016 Popular Post Share Odesláno: 12. Květen, 2016 [**] Rychlost vozidla Zdravím, v tomto návodu se zaměříme na vytváření jednoduchého tachometru a věcí kolem. Vše bude spíše z teoretické stránky věci.Odkaz na původní topic (zdroj): http://ewolutions.cz/index.php?/topic/1843-rychlost-vozidla/ Obtížnost: ÚvodNa fóru se nachází jistě dost návodů a scriptů, které obsahují téma „Tachometr“. Vše ale vzniklo před, troufám si říct, několika lety, a tak nevyužívají nových možností, které SA:MP (0.3z+) nabízí. Nebudeme se zde zabývat vzhledem samotného tachometru (to už je individuální). VektoryPro výpočet rychlosti budeme používat funkci VectorSize. Ke zjištění rychlosti použijeme funkci GetVehicleVelocity, která vrátí rychlost vozidla na jednotlivých osách. Z těchto hodnot poté musíme zjistit jednu hodnotu. Budeme tedy vypočítávat velikost vektoru se souřadnicemi X, Y, Z. Výpočet velikosti: Nyní se budeme pohybovat kvůli vizualici v rovině. Tento vektor, se souřadnicemi X, Y má nějakou velikost označenou červenou čárou. Z obrázku asi každý pochopí, že na výpočet můžeme použít Pythagorovu větu. Výpočet tedy bude: √(x^2 + y^2) Výpočet velikosti v prostoru je potom obdobný, pouze přidáme další souřadnici. Dostáváme následující: √(x^2 + y^2 + z^2) Starý výpočet: Jak jsem již předesílal, dnešní SA:MP umožňuje lepšízpůsoby, ale ještě si ukážeme, jak se pořád vypočítává velikost vektoru. new Float:vx, Float:vy, Float:vz; GetVehicleVelocity(vehicleid, vx, vy, vz); vz = floatsqroot(vx * vx + vy * vy + vz * vz); // ve vz nyní máme velikost /* viděl jsem také floatsqroot(floatpower(vx, 2) + floatpower(vy, 2) + floatpower(vz, 2)); a další verze s floatabs a dalšími zbytečnostmi. */ Způsob je to správný, jen je zastaralý a lze využít rychlejší řešení. Výpočet, který není za opicema Na funkci VectorSize asi není nic moc co vysvětlovat, protože název hovoří za vše. Výpočet velikosti vektoru tedy bude následující. new Float:vx, Float:vy, Float:vz GetVehicleVelocity(vehicleid, vx, vy, vz); vz = VectorSize(vx, vy, vz); // ve vz nyní máme velikost Jdeme scriptovat?Nyní se můžeme zaměrit na samotný script. Budeme vycházet z toho, že máme deklarované pole PlayerTextů o velikosti MAX_PLAYERS. Nějak takto:new PlayerText:pSpeed[MAX_PLAYERS];Samotná pozice, vzhled a barva již bude na vás. Dále budeme potřebovat veřejnou funkci, která bude mít jako parametr playerid (budeme updatovat rychlost každého hráče zvlášť). forward updateSpeed(playerid); public updateSpeed(playerid) { if(IsPlayerInAnyVehicle(playerid)) // pokud je hráč v nějakém vozidle... { // zde proběhne update new str[9]; // 9 znaků stačí (km/h → 4, 123 → 3, mezera → 1) format(str, sizeof(str), "%d km/h", getSpeed(GetPlayerVehicleID(playerid))); PlayerTextDrawSetString(playerid, pSpeed[playerid], str); } } Také nastavíme timer (například v OnPlayerConnect heh) SetTimerEx("updateSpeed", interval, true, "d", playerid); Nezapomeneme podle potřeby ukončovat timer, abychom nepřehltili server. Jako poslední krok tu máme samotnou funkci getSpeed. Jako parametry nám poslouží id vozidla, ale můžete si to zas dle potřeby předělat (zde pracujeme jen s vozidly). stock getSpeed(vehicleid) { new Float:vx, Float:vy, Float:vz; GetVehicleVelocity(vehicleid, vx, vy, vz); return floatround(VectorSize(vx, vy, vz) * 180); } Funkcí floatround zaokrouhlíme velikost vektoru na celá čísla. Celé to násobíme 180 abychom dostali „reálné“ rychlosti.Vozidla se v GTA pohybují nereálnou rychlostí a vynásobením tímto číslem se můžeme alespoň přiblížit k reálným. Pro každé vozidlo je toto číslo jiné, tudíž se používá hodnota okolo 180 jako takové univerzální. Návod označen jako platný Ten to návod byl označen jako platný.Návod může být kdykoli označen jako nevhodný či neplatný 5 Link to comment Share on other sites More sharing options...
Globální moderátor Hip 191 Odesláno: 12. Květen, 2016 Globální moderátor Share Odesláno: 12. Květen, 2016 vzhledem k tomu, že to dává nereálné rychlosti, tak by se sem hodila i fce na reálnou rychlost. Chceš si ji udělat nebo si to mám udělat sám? Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 12. Květen, 2016 Hlavní moderátor Share Odesláno: 12. Květen, 2016 vzhledem k tomu, že to dává nereálné rychlosti, tak by se sem hodila i fce na reálnou rychlost. Chceš si ji udělat nebo si to mám udělat sám? Vozidla se v GTA pohybují nereálnou rychlostí a vynásobením tímto číslem se můžeme alespoň přiblížit k reálným. Pro každé vozidlo je toto číslo jiné, tudíž se používá hodnota okolo 180 jako takové univerzální. ... Link to comment Share on other sites More sharing options...
Globální moderátor Hip 191 Odesláno: 13. Květen, 2016 Globální moderátor Share Odesláno: 13. Květen, 2016 Hip, on 12 May 2016 - 19:59, said: vzhledem k tomu, že to dává nereálné rychlosti, tak by se sem hodila i fce na reálnou rychlost. Chceš si ji udělat nebo si to mám udělat sám? Lukasz said Vozidla se v GTA pohybují nereálnou rychlostí a vynásobením tímto číslem se můžeme alespoň přiblížit k reálným. Pro každé vozidlo je toto číslo jiné, tudíž se používá hodnota okolo 180 jako takové univerzální. ... GetVehicleVelocity(vehicleid, vx, vy, vz); Evidentně vrací jakési divné hodnoty. Jestliže odhadneme jak veliký je na souřadné ose jeden metr, tak zjistíme reálnou rychlost. Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 13. Květen, 2016 Hlavní moderátor Share Odesláno: 13. Květen, 2016 Však on to tam násobí tou 180 za účelem získání (téměř) reálných hodnot. Link to comment Share on other sites More sharing options...
Globální moderátor Hip 191 Odesláno: 13. Květen, 2016 Globální moderátor Share Odesláno: 13. Květen, 2016 GetVehicleVelocity(vehicleid, vx, vy, vz); Evidentně vrací jakési divné hodnoty. Jestliže odhadneme jak veliký je na souřadné ose jeden metr, tak zjistíme reálnou rychlost. to ano, ale pro každé vozidlo ukazuje údajně jiné. Vlastní fcí se tento defect odstraní Link to comment Share on other sites More sharing options...
Lukasz 336 Odesláno: 13. Květen, 2016 Author Share Odesláno: 13. Květen, 2016 Číslo cca 180 (používají se i 181.5, 181 a obdobná čísla) se zjistilo z výpočtu ujeté dráhy in-game za jednotky času a následným dopočítáváním. Pro každé vozidlo tedy existuje jiné číslo, ale právě přibližně 180 s mírnými odchylkami vyhovuje. Taky si musíš uvědomit rozdíl mezi vlastní funkcí a GetVehicleVelocity. Ta tvoje vlastní funkce by vracela průměrnou rychlost za uběhlý čas, kdežto GetVehicleVelocity vrací aktuální rychlost. Která funkce ve výsledku asi bude přesnější, že? Pak tu máme ještě možnost zjišťovat pro každé vozidlo tu "správnou" hodnotu. To je stupidita a ztráta času, ale jestli chceš, tak tam rovnou započítej i rychlost větru a váhu nákladu v kufru, protože to bude zase nepřesné. Násobením jedním číslem je tedy asi nejjednodušší a dostačujícím řešením. Link to comment Share on other sites More sharing options...
Globální moderátor Hip 191 Odesláno: 13. Květen, 2016 Globální moderátor Share Odesláno: 13. Květen, 2016 Taky si musíš uvědomit rozdíl mezi vlastní funkcí a GetVehicleVelocity. Ta tvoje vlastní funkce by vracela průměrnou rychlost za uběhlý čas, kdežto GetVehicleVelocity vrací aktuální rychlost. Která funkce ve výsledku asi bude přesnější, že? GetVeihcleVelocity taky závisí na čase. Pokud si uděláš vlastní počítanou za třeba 20ms tak to bude celkem přesné... forward GetSpeed(vehicleid) { new speed; new Float:x1;Float:y1;Float:z1; new Float:x2;Float:y2;Float:z2; GetVehiclePos(vehicleid,x1,y1,z1); SetTimer(GetVehiclePos(vehicleid,x2,y2,z2),20,false); speed = floatsqroot((x2-x1)^2+(y2-y1)^2+(z2-z1)^2)*50; //vzdálenost za sekundu return speed; //metry za sekundu } Link to comment Share on other sites More sharing options...
Lukasz 336 Odesláno: 13. Květen, 2016 Author Share Odesláno: 13. Květen, 2016 Tak znovu, GetVehicleVelocity vrací AKTUÁLNÍ rychlost na osách x, y a z. To tvoje PRŮMĚRNOU. Sice je 20ms velmi krátká doba, ale i tak získáme špatné hodnoty (například při portnutí). Chtělo by to další ošetření (a korekci tvého kódu) a pořád by to nebylo přesné. Bohatě tedy postačí GetVehicleVelocity (o které se nemusíš tolik starat a není tak náročné jako tvoje) pro vrácení přibližné "reálné" hodnoty, která stejně slouží pro zobrazení v nějakém textdrawu (čti for fun). Link to comment Share on other sites More sharing options...
DNLS 31 Odesláno: 14. Květen, 2016 Share Odesláno: 14. Květen, 2016 Hezký, lepší než servery na kterých "jezdíš maximálně 30tkou" a nebo jezdíš neuvěřitelnou rychlostí. Link to comment Share on other sites More sharing options...
ATomas 290 Odesláno: 14. Květen, 2016 Share Odesláno: 14. Květen, 2016 Tak znovu, GetVehicleVelocity vrací AKTUÁLNÍ rychlost na osách x, y a z. To tvoje PRŮMĚRNOU. Sice je 20ms velmi krátká doba, ale i tak získáme špatné hodnoty (například při portnutí). Chtělo by to další ošetření (a korekci tvého kódu) a pořád by to nebylo přesné. Bohatě tedy postačí GetVehicleVelocity (o které se nemusíš tolik starat a není tak náročné jako tvoje) pro vrácení přibližné "reálné" hodnoty, která stejně slouží pro zobrazení v nějakém textdrawu (čti for fun). Akorat co je aktualni rychlost ? Z definice: derivace funkce v bode, ovsem derivace funkce v bode je limita dvou rozdilnych bodu jdouci k nekonecnu. Hlavni problem proc hodnota z Velocity prohlasujeme za nerealna jsou ten, ze jsme zvykli merit rychlost v jednotkach vzdalenost/cas. Ovsem Velocity vraci prave jejich derivaci (aktualni) rychlosti v bode. To je ten duvod proc z toho tezko vybouchas nejake realne hodnoty. Link to comment Share on other sites More sharing options...
Globální moderátor Hip 191 Odesláno: 16. Květen, 2016 Globální moderátor Share Odesláno: 16. Květen, 2016 Akorat co je aktualni rychlost ? Z definice: derivace funkce v bode, ovsem derivace funkce v bode je limita dvou rozdilnych bodu jdouci k nekonecnu. Hlavni problem proc hodnota z Velocity prohlasujeme za nerealna jsou ten, ze jsme zvykli merit rychlost v jednotkach vzdalenost/cas. Ovsem Velocity vraci prave jejich derivaci (aktualni) rychlosti v bode. To je ten duvod proc z toho tezko vybouchas nejake realne hodnoty. jo tak tohle to vrací. Děkuji. --- Mimochodem, pořád to moje háže lepší, reálnější čísla. I kdyby jsi tam hodil 10ms pro ještě větší přesnost a aktualizoval třeba každou sekundu, tak to bude IMHO lepší. Link to comment Share on other sites More sharing options...
Lukasz 336 Odesláno: 16. Květen, 2016 Author Share Odesláno: 16. Květen, 2016 (upraveno) A taky o dost narocnejsi btw uz asi trikrat jsem tu psal, co to vraci Edited 16. Květen, 2016 by Lukasz Link to comment Share on other sites More sharing options...
Globální moderátor Hip 191 Odesláno: 16. Květen, 2016 Globální moderátor Share Odesláno: 16. Květen, 2016 A taky o dost narocnejsi btw uz asi trikrat jsem tu psal, co to vraci tak asi až od atomase jsem to pochopil promiň - záleží jak se použije Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now