Siedem

2010.V.24

Az első Ubuntu linuxos változat

Tisztelettel jelentem, elkészült a játék első linuxos változata! Nem is volt annyira nehéz; a fő akadályt az jelentette, hogy a windows-os változat az OGRE könyvtár 1.7-es változatával készült, míg ubuntu-hoz egyelőre csak 1.6-os változat van előre csomagolva.

Szerencsére találtam megfelelő ubuntu-s csomagot, aminek egyetlen szépséghibája az volt, hogy az ubuntu linux "karmic" (jelenleg fejlesztés alatt álló) változatához készült, amíg nekem (és a világ többi részének, akik a stabil változatot preferálják) a "lucid" változat van a gépemen. A megoldás az volt, hogy leszedtem innen a "forrás" csomagot, szépen lefordítottam, és voilá!: kész a "lucid", 1.7-es ogre csomag. És még működött is!

A következő napirendi pont egy Siedem fordító környezet fellövése volt. Ehhez egy CMake nevű rendszert használtam, azon egyszerű oknál fogva, hogy a cmake működik linuxon, macen és az OGRE is eleve azzal fordul. Ez igazából egyszerűbb volt, mint amire számítottam, és kisvártatva ott ficergett a Siedem a képernyőmön! Szóval, hurrá van. Aki kér ubuntu-s Siedem buildet, az ne maradjon hallgatag. :)

Tagek:
 
Utoljára módosította UPi 2010.V.24 11:24-n; 0 hozzászólás;
Bejegyzés módosítása | PermaLink

2010.V.22

Joystick jee!

Vettem tegnap egy joystickot, és ma szépen hozzáhegesztettem a játékhoz. Működik, lehet vele lőni az űrhajókat, jóval kényelmesebb az egerezésnél.

Szépen rá is futottam egy hibára az OIS-ban (Object Oriented Input System): Amint elkezdtem vízszintes irányban mozgatni a botkormányt, fagyi. Hmm..

A megoldás az volt, hogy leszedtem subversion-nel az OIS jelenlegi development változatát, lefordítottam, és beraktam az előző helyére. Működik, és hurrá! Ezúttal is az open source győzött...

Következő napirendi pont: force feedback és rezgő üzemmőd!

Tagek:
 
Utoljára módosította UPi 2010.V.22 11:19-n; 2 hozzászólás;
Bejegyzés módosítása | PermaLink

2010.V.20

Siedem Repo

Csináltam a Siedemnek egy subversion repository-t az apocalypse-en. A repository a következő címen érhető el:

 svn+ssh://apocalypse.rulez.org/mnt/mp3/siedem/trunk/siedem

Vagy, azt szeretnéd, hogy ne kérdezgesse tőled állandóan a userneved, akkor:

 svn+ssh://user@apocalypse.rulez.org/mnt/mp3/siedem/trunk/siedem

Ha "gyalog" svn klienst használtok, akkor a következő parancsot kell beírni:

 svn checkout svn+ssh://apocalypse.rulez.org/mnt/mp3/siedem/trunk/siedem

A kódba írtam némi Mac OS X támogatást, ami vagy működik, vagy nem (több eset nincs). Természetesen kipróbálni nem tudtam, de remélem, hogy SAdamnak jó kiindulópont lesz.

Tagek:
 
Utoljára módosította UPi 2010.V.21 10:27-n; 8 hozzászólás;
Bejegyzés módosítása | PermaLink

2010.V.18

Célra tartás

A radar után a következő, matematikai jellegű kihívás, amivel a Siedem programozása közben szembesültem, a célkövetés és a célra tartás. Mindkettő tipikus 3D feladat, amire az ember nem is gondol elsőre, amíg egyszercsak bele nem fut.

A célkövetés alatt a következőt értem: van egy űrhajó, adott fordulékonysággal és sebességgel; oldjuk meg, hogy egy adott pontba elrepüljön. Ez azért hasznos, mert a robot űrhajóink majd idővel szeretnének valahova menni, valamit támadni, tesz-vesz, odamegy, igazából mindenhez ez kell, kivéve a céltalan röpködéshez. Amit csinálni kell, az nyilván az, hogy célba kell venni az adott pontot, és utána repülni feléje, amíg ott nem vagyunk; ebből a célbavétel az izgalmas. Több nehézség is felmerül: melyik a legkisebb ív, mi van, ha mozog a célpont, stb. Aztán jönnek a Quaterniók megint, és az ember egyszercsak legyűri, aztán meg álmélkodik, ahogy a képernyőjén a robot úrhajók repkednek a céljuk felé.

A másik, a célra tartás, még izgalmasabb: adva van egy mozgó célpont jelenlegi helye és sebessége, valamint adva van a lövedékünk sebesséve. A feladat: hova kell lőni ahhoz, hogy eltaláljuk? Élünk azzal a feltételezéssel, hogy a célpont ugyanarra repül majd tovább, főleg mivel jobb tippünk ezen a ponton nincsen, szóval valahova elé akarunk lőni. Mint a régi jó Quake-ben: megy az emberünk, eléje küldjük a rakétát, nézzük ahogy repül.

Első blikkre a következő egyenletet kapjuk:

Unknown magic content: 'mathml'

:`vec["shotDirection"] * "weaponspeed" * "t" = vec["hisPosition"] + vec["hisSpeed"] * "t"`

A shotDirection az 1 hosszúságú vektor (normálvektor), amerre lőnünk kell, a T pedig az idő, amíg eltaláljuk majd a csókát. Egy egyenlet – 4 ismeretlen (T és a shotDirection három dimenziója), mi van már ma?? Ja várjunk, mégsem: egyrészt ez egy 3D vektor egyenlet, vagyis valójában három egyenletre bomlik szét, másrészt meg a shotDirection valójában 2 ismeretlen csak, mert a hosszát tudjuk (az 1). Ha kiszámoljuk 2 tengelyét, akkor a harmadik Pythagorasz tétellel kiszámolható.

Összességében ez egy negyedfokú egyenlet, fúúúj! Nem lehet ennél jobbat? Aztán egyszercsak jön az ötlet: számoljuk ki azt a teljesen érdektelen adatot, hogy milyen messze van az a pont, ahol a lövedékünk majd eltalálja az antagonistát!

`||vec["hisPosition"] + vec["hisSpeed"] * t || = t * "laserSpeed"`

Lássuk, mi is ez! A `||vec["vektor"]||` egy vektor hosszát jelöli. Ebből az egyenletből sikerrel eltűnt a shotDirection, vagyis az, amit ténylegesen keresek. Hurrá, érdektelen az egyenlet! Vagyis várjunk csak? Egy ismeretlenünk van (T), és ez, bár nem látszik rajta, valójában egy másodfokú egyenlet. Méghozzá azért, mert a baloldal valójában egy négyzetgyökös kifejezés. Ha az egészet négyzetre emelem, akkor meg egy irdatlan sok tagú valami lesz, ami T-ben másodfokú. (Ha valakit véletlenül érdekelnek a másodfokú tagjai, az számolja ki maga, vagy nézze meg a kódban.)


ŰRISTEN, MI VOLT A MÁSODFOKÚ EGYENLET MEGOLDÓ KÉPLETE?!?
ŰRISTEN, ENNYIRE RÉG VOLT AZ EGYETEM????
Ja várjunk.. persze...
`(-b +- root()(b^2 - 4 a c)) / (2a)`
Ha egyszer gyerekem lesz, ez lesz neki az estimese, egy életen át, minden nap.

Kész vagyunk? Kész vagyunk! Ugyanis T-t behelyettesítve az első, gagyi egyenletünkbe, szépen megkapjuk, hogy hol lesz az ellen, amikor majd eltaláljuk, vagyis durr neki oda, most most MOST! Megyek aludni...

Búcsúzóul a kód, kicsit egyszerűsítve az olvashatóság kedvéért:

 a = hisSpeed.x * hisSpeed.x
    + hisSpeed.y * hisSpeed.y
    + hisSpeed.z * hisSpeed.z
    - laserSpeed * laserSpeed;   // remélhetően negatív
b = ( hisSpeed.x * offset.x + hisSpeed.y * offset.y + hisSpeed.z * offset.z ) * 2; c = offset.x * offset.x + offset.y * offset.y + offset.z * offset.z; det = sqrt(b * b - 4 * a * c); t1 = (-2 * b + det ) / (2 * a); t2 = (-2 * b - det ) / (2 * a); 

Mi van, ha két T jön ki, ami másodfokú egyenletben elő is tud fordulni? Hát, lehet hogy az egyik negatív T lesz, vagyis mi lett volna, ha x másodperccel ezelőtt hátrafelé lövök. Azt ki is hagyhatjuk akár, a másik T viszont finom...

Tagek:
 
Utoljára módosította UPi 2010.V.18 10:18-n; 19 hozzászólás;
Bejegyzés módosítása | PermaLink

Tagek: