Üdv!
Ezt a tutorialt azért csináltam, mert sokan nincsenek tisztában vele, hogyan épül fel egy sebességmérõ script. Márpedig nem is olyan bonyorult, csak egy kis geometria, meg egy kis scriptelés kell, hogy a sajátodat megcsináld.
Cél:
- Megérteni, hogyan mûködik egy sebességmérõ rendszer.
Nézzük:
CMD:getspeed(playerid, params[]) {
new Float:vVectors[4], string[30];
GetVehicleVelocity(GetPlayerVehicleID(playerid),vVectors[0],vVectors[1],vVectors[2]);
vVectors[3] = floatround(floatsqroot((vVectors[0]^2)+(vVectors[1]^2)+(vVectors[2]^2))*136.666667);
format(string,sizeof(string),\"A jármû sebessége: %i km/h\",vVectors[3]);
SendClientMessage(playerid,0xFFFFFFFF,string);
return 1;
}
Ez a script kiírja az adott sebességet amivel haladsz km/h-ban. Mit is csinál ez a script?
A GetVehicleVelocity függvény megad 3 sebességvektort: az j-t, ami az origóból (játékos) az x vektor mentén fut, a k-t, ami az y, és a l-t, ami a z mentén fut. A végleges sebességvektor legyen m.
A vektorok nagyságának összeadására szolgál az úgynevezett Euklidészi norma. Az Euklidészi norma kimondja, hogy egy n dimenziós térben a k vektor távolsága megegyezik a k vektor n számú \"komponenseinek\" négyzetösszegének négyzetgyökével. Mivel minden vektornak egy komponense van minden dimenzióban, ezért egyértelmû hogy a komponensek száma és a dimenzió megegyezik. A komponensek gyakorlatilag azt mutatják meg, hogy milyen x, ill y, z, etc... tengelybeli pontokkal lehet meghatározni a vektor \"hegyét\".
Példaként tegyük fel, hogy egy két dimenziós vektorunk van, aminek komponensei 5 és 2. Ezért a két dimenziós vektor \"nyilának\" végpontja 5 és 2, egyszerûbben fogalmazva a vektor hegyének helye a koordináta-rendszerben (5;2). Tehát x=5, y=2. Ebben az esetben a végleges m vektor hossza:
|m| = sqrt(5^2+2^2)
ahol sqrt a négyzetgyökvonás, ^ a négyzetre emelés jele. Ezt tekinthetjük úgy is, mint két darab egy dimenziós vektor távolságának összeadását, mely egyik irányban az x irányban 5-öt, míg az y irányban 2-t haladt, majd a vektorkomponensek nyilait \"összekötjük\", így megkapva az m vektort. Ez a magyarázat teljesen azonos a fent említettel, hiszen amikor megkapjuk az (5;2) pontot, gyakorlatilag elmegyünk ötig (1 dimenziós x komponens), elmegyünk 2-ig (1 dimenziós y komponens), majd a kettõt összekötjük a találkozásnál. A kettõ megfogalmazás tehát analogikus. A vektor iránya egyébként lényegtelen, a sebességnél csak a vektor távolsága számít.
A sebességvektor a gyakorlati példában három dimenziós, hiszen egy 3D játékról beszélünk. A három dimenziós vektornak három darab egy dimenziós komponense van, egy az x, egy az y, egy a z irányban. Ahhoz, hogy a sebességet megkapjuk meg kell tudni a vektor normáját.
Tegyük fel, hogy a vektor egyes komponenseinek hossza x irányban 5, y irányban 3, z irányban 0.5, tehát egy olyan vektor hosszát kapjuk meg, aminek a \"hegye\" az (5;3;0.5) koordinátáknál helyezkedik el. Ebbõl egy három dimenziós vektort kaphatunk, és a sebességet megkaphatjuk, ha kiszámítjuk a vektor normáját:
|m| = sqrt((5^2)+(3^2)+(0.5^2)) = 5.85234996 valami hossz/valami idõ.
Elnézést kérek, fogalmam sincs, hogy mibe kapjuk meg az eredményt. Azt viszont tudom, hogyha megszorozzuk 136.66666-tal, megkapjuk a sebességet km/h-ban. Tehát:
sebesség = 5.85234996 * (136 + (2 / 3)) = 799.821161
A test 800 km/h-val halad.
Innentõl már csak kerekíteni kell, és megkapjuk a sebességet egész számban.