Újabb hosszú idő után eljött az idő, hogy újabb "tanulságos" blog bejegyzést írjak játék fejlesztés téma körében. Ahogy talán a címből kiderül vektorokról fogok mesélni, hogy micsoda és hogy mire lehet használni őket.
  Gondolom hozzám hasonlóan sokan vannak úgy, hogy amit az ember az iskola alatt tanul annak a nagy részét soha nem fogja tudni használni. Ez alól kivétel a vektor,  ha az ember játékfejlesztéssel foglalkozik. Játékfejlesztés egyik szépsége, hogy nagyon sok mindenre megtanít és megmutatja, hogy mire lehet a megtanult dolgokat használni.

Mi a vektor?
  Elég a szócséplésből és inkább térjünk rá a lényegre. A vektort gyakorlatilag 2 dolog alkotja: irány és mennyiség. Vektort gyakorlatban nyíllal szoktuk jelölni, ami egy kezdőpontból egy végpontba mutat és a menyisége pedig a nyílnak a hossza.

Na de mire jó ez a mi esetünkben?
  A játékok általánosságban akkor izgalmasak, hogyha mozognak benne a dolgok és ahogy fizikából megtanultuk, ahol mozgás van ott vektornak is kell lennie. Tehát a vektorok tökéletesek mozgások leírására.

Hogyan programozzuk ezt le?
  Legegyszerűbb dolgunk a a mennyiséggel van mivel ez egy egyszerű szám, amit el kell tárolnunk.
Mozgás esetében a mennyiség lehet például a sebesség.
Irány sem sokkal nehezebb, mivel ehhez érdemes egy egyszerű irány vektort használni, aminek a hossza 1 és a kezdő pontja a koordináta rendszer origója vagyis (0,0), ami miatt csak a végpont koordinátáit(x,y) kell eltárolnunk.

Irány vektor


WTF vektor a vektorban?
  Tudom tudom, de így lehet a legegyszerűbben elmagyarázni, hogy hogyan is kell irányt megadni.
Gyakorlatilag ez nem más mint egy iránytű, ami megmutatja, hogy egy adott játék elem milyen irányba mozog.

Aha, de hogy használom őket együtt?
  Mozgások esetében a mennyiség a sebesség lesz és az irány pedig a test mozgási iránya. Ebben az esetben csak annyi a dolgunk, hogy összeszorozzuk őket. Így pedig megkapjuk a vektort, ami gyakorlatilag elmondja, hogy a test milyen sebsebéggel mozog x és y irányban.

Triviális esetek:
Sebsebég: 300
Felfelé alkarunk haladni, akkor irányvektor: (x:0,y:1). Ezeket összeszorozva(x:0*300,y:1*300), ezt a vektort kapjuk: (x:0,y:300)
Gondolom innen már sejhető, hogy lefelé a vektor: (x:0,y:-300), balra a vektor: (x:-300,y:0) és jobbra a vektor: (x:300,y:0).

Nem triviális esetek:
  Szerintem az átlós mozgások nem triviálisak, mivel több fajta módon is be lehet állítani az irány vektort:
1. Kiszámoljuk az irányvektor végpontját az x tengely és az irányvektor közötti szög alapján. Például: cos(30) = 0.866, sin(30) = 0.5, tehát az irány vektor: (x:0.866,y:0.5)
2. Elforgatunk egy adott irányvektor, hogy az átlósan álljon.
3. Összeadunk két merőleges vektort és a keletkező vektort lezsugorítjuk, hogy a hossza 1 legyen.

Összegezve:
  Lényegében a vektorok a játékfejlesztésben tökéletesek a mozgások leírására és ezért alapvető elemei egy fizikai motornak. Vektorok egyszerűek mivel csak menyiségből és irányból állnak. Használatuk is igen egyszerű, mivel minden nyelven találhatunk vektor könyvtárakat.
  Nekem szerencsém volt mivel StageXL-ben van egy vektor osztály, amivel megtudtam valósítani a vektor irány részét és így már csak a mennyiség része maradt, ami meg triviális feladat.

Kiegészítés:
  Mozgások esetében a sebességet is ábrázolhatjuk vektorral ha a sebességet felbontjuk horizontális és vertikális sebességre. Azért jó, mert ebben az esetben is két értéket kell eltárolni, mint az irányvektor esetében. Nem is beszélve a tényleges vektor megadásához csak össze kell szoroznunk a sebesség - és irány vektort.(Ami vektorok esetében egyszerű dolog)

Egy kis példa:
  DartRocket esetében vektorokat használtam a mozgási és irányrendszerek megoldásához.
DirectionSystem: Irányokkal való munkát segíti és definiál néhány triviális irányt.
MovementSystem: Mozgások leírását és velük való munkát segíti. 

Bónusz: