Manapság egyre több helyen találkozom a kérdéssel, “hogyan lehet játékot fejleszteni, hol kezdjem?”
Erre a kérdésre a legtöbb helyen igen rövid választ szoktak kapni és adni ami általában játék motorokra esetleg vaskos könyvekre mutat “kezd ott”. Ebben a cikkben egy olyan választ igyekszem adni ami átfogóbban (de azért nem túl mélyen) bele merül a kérdésbe és egy játék fejlesztésének szükségleteibe.
Egy játék fejlesztése rendkívül összetett feladat, attól függően milyen jellegű játékot szeretnénk fejleszteni és hogy meglévő forrásokat felhasználunk-e vagy inkább mindent a 0-ról kezdünk. Először is lássuk alapvetően miből is áll egy játék a motorháztető alatt, mire van szükség:
- Grafikus motorra: a grafikus motor felel gyakorlatilag egy játékban látottak megjelenítéséjért más szóval “renderelésért”. Mindent amit látunk egy játékban azt egy grafikus motor rendereli számunkra. Egy grafikus motor megírásához komoly matematikai és programozói tudásra van szükség és azon túl szükség van egy úgy nevezett API-ra (Alkalmazás Programozási Interfész) mint például az OpenGL. Ám nem feltétlenül kell saját motort írnunk. Használhatunk kész grafikus motorokat mint például az Ogre3D, Irrlicht, esetleg SFML 2D grafikához.
- Fizikai motorra: a fizikai motor lényegében nem más mint a valós fizika szimulációja. Ha egy játékban azt látjuk például hogy egy hordó felborul, az nem feltétlenül előre “tervezett” esemény, több mint valószínű hogy fizika szimulációt látunk amiért a fizikai motor felel. Nem minden játékban kell használni fizikát ám főleg a AAA kategóriás játékokban ma már szinte mindenhol használnak. Egy fizikai motor megírásához mondanom sem kell, alapos matematikai, geometriai és programozói tudás szükséges ám szerencsére ezt sem kell magunk megírnunk , használhatunk kész fizikai motorokat mint például a Newton, PhysX ODE, Bullet, esetleg Box2D ha 2D játékot fejlesztünk.
- Hálózati motorra: a hálózati motor felel a hálózati kapcsolatért és adat cseréjért amennyiben a játékunk bármilyen formában hálózati kapcsolatot létesít és információt küld vagy fogad. Ha például egy Multiplayer játékban látjuk hogy egy másik játékos lő minket ezt az információt az ő számítógépének küldenie kell a mi számítógépünknek pedig fogadni azt. Ha pedig azt látjuk hogy fogy az életünk mert eltalálnak, a mi számítógépünknek kell küldeni az információt és a többi játékos számítógépének pedig fogadni. Persze technikailag ez nem ilyen egyszerű de szerencsére ezt sem kell mi magunknak megírni, számos hálózati motor közül választhatunk mint például RakNet, SDL_net, de a korábban említett SFML is tartalmaz hálózati motort például, így akár hálózati motorként is használhatjuk.
- Mesterséges Intelligencia motorra (AI): minden játékban szükség van valamilyen szintű mesterséges intelligenciára ami segítségével a játékmenet során a “gép által irányított” elemek önállóan tudjanak döntést hozni, célt kitűzni. Például a sarkon jobbra vagy balra, támad vagy sem ha igen mit, miért, mikor ha nem miért nem illetve mikor nem. Minden játékban más és más jellegű és szintű mesterséges intelligenciára van szükség, aminek a nagy részét nekünk kell megírni, itt sajnos nincs kerülő út. De azért vannak próbálkozások pár alapvető elem lefektetésére mint például a, A* Pathfinding, OpenAI, GrafixiaAI,
- Audio motorra: ahhoz hogy a játékokban zenét és hang effekteket is hallhassunk, audio motorra is szükség van mint például az OpenAL, FMOD, irrKlang, de például a korábban már említett SFML rendelkezik audio motorral is.
- Input API-ra: mivel a játékokat nem csak látni és hallani kell, de irányítani is ezért szükség van egy API-ra ami képes a bemeneti eszközöket kezelni mint billentyűzet, egér esetleg kontroller. Ilyen API például az SDL, OpenInput, de a már korábban többször is említett SFML ilyen API-val is rendelkezik.
- Script nyelvre: erre nem feltétlenül van szükség ám praktikus ha csak a játék motor (a mag) van általános programozási nyelveken írva mint C, C++, Java. A játékmenetet ideálisabb scriptelni olyan nyelveken mint Lua, JavaScript, AngelScript, Python mivel ezek a nyelvek előre lefordított (interpreted) nyelvek és ily módon sokkal rugalmasabbá és gyorsabbá teszik a fejlesztést és hibakeresést mivel nem kell a játékunkat minden egyes apró változtatás, hozzá adott kód után újra és újra lefordítani, elég csak magát a magot egyszer lefordítani a játékmenetet pedig akár valós időben is miközben a játékunk fut, módosíthatjuk, kiegészíthetjük különböző script nyelveken. Ám ehhez először implementálnunk kell a script nyelvet a játékunk motorjába a magba.
It has been found out that this product is made so appropriate and effective for levitra on sale man who is undergoing the influence of impotence. Tadalafil is order levitra online one such medicine that has been found to be a factor is education. If a user takes the medicine without medical guidance, he can face cialis generic pills some minor like stuffy nose, fever, blurred eye vision, diarrehea, dizziness, headache, etc. Kamagra jelly levitra cost is an oral form of pills found loaded with sildenafil citrate as a vital component.
Ahogy láthatjuk egy játék rendkívül összetett program, ha a 0-ról szeretnénk elkészíteni komoly programozói és matematikai tudásra és rengeteg időre lesz szükségünk, és itt konkrét játékról még nincs is szó igazán, csak a feltételekről hogy eltudjuk kezdeni fejleszteni a játékunkat. De ha minket jobban érdekel inkább maga a játék fejlesztés mintsem a motorok programozása nem kell lemondani semmiről, ugyanis számos más módja is van annak hogy ezen az úton tovább lépjünk anélkül hogy saját grafikus, fizikai és egyéb motort írnánk vagy meglévőket implementálnánk egy közös rendszerbe. Ilyen módja például a játékfejlesztésre kihegyezett programozási nyelvek, amikről találhattok egy listát itt:
Ezek olyan programozási nyelvek amiket kifejezetten játékok programozására alakítottak ki, oly módon hogy alapból tartalmazza az alapvető funkciókat amire szükségünk lehet egy játék fejlesztése során mint például: kamera, bemeneti eszközök, képek, spriteok, 3D modellek, animációk, vektor grafika kezelése, árnyékok generálása (lightmapping), hang fájlok kezelése. esetleg hálózat és shaderek kezelése..stb esetenként még konkrét játék elemeket is egyszerűen létrehozhatunk, beállíthatunk mint víz, tükröződés, felhők, időjárás generálása..stb. Mind ezt a programozási nyelv alapból tudja, nincs szükség külső motorokra és API-kra, legalábbis kevesebbre és ily módon kevesebb programozói és matematikai tudással is fejleszthetünk játékot. Hasonló eredményt érhetünk el játék programozó keretrendszerek használatával is mint például a Citrus, Panda3D, JMonkey, Gameplay3D, Allegro, LÖVE, XNA és még hosszasan sorolhatnám. A különbség annyi a játékfejlesztésre szánt nyelvekhez képest hogy ilyen keretrendszerek esetében elterjedtebb programozási vagy script nyelveket használhatunk mint C++, C# és Java és általánosságban véve kevésbé korlátozott a programozói szabadság tekintetében.
Ám ilyen nyelvek és keretrendszerek használata esetén továbbra is jelentős programozói tudásra és gondolkodás módra lesz szükségünk a játékunk fejlesztéséhez ám ez nem mindenkinek felel meg, nem feltétlenül azért mert nem elég okos vagy kitartó, egyszerűen csak nem áll rá az agya erre a sok kódra és inkább vizuálisabb alkat. Ha így van és inkább érdekelne minket a játékmenet kialakítása, a konkrét játék megalkotása mintsem hogy bármit is programozzunk, akkor sincs veszve semmi, ez nem jelenti azt hogy itt vége, programozás nélkül nem fejlesztünk játékot. Szerencsére rengeteg kész és komplett játék motor áll a rendelkezésünkre amikről találtok egy kisebb listát itt:
Ezek a programok tartalmaznak mindent ami csak egy játék fejlesztéséhez szükséges egy beépített szerkesztővel együtt amiben vizuálisan egyszerűn összerakhatjuk a játékunkat, annak világát majd scripteket és egyszerű parancsokat használva pedig kialakíthatjuk a játékmenetet. ly módon tényleg nem kell semmivel foglalkoznunk csak és kizárólag a játékunk világának megalkotásával és a játékmenet kialakításával, abszolút 0 programozói tudás és minimális matematikai tudás szükséges hozzá ám annál több logika persze hogy megértsük, átlássuk logikailag miként is kapcsolódnak össze a dolgok egy játékká, játékmenetté. Csak azért mert minden programozással és programozókkal kezdődik, nem jelenti azt hogy azzal is ér véget, sőt, szinte mindég a programozás csak a kezdet. A legtöbb játék ilyen programokban, scriptekkel születik. Nekünk csak azt kell eldöntenünk a játékfejlesztés mely területe érdekel minket jobban, a motor programozása?, a keretrendszer fejlesztése? vagy inkább csak a játékmenet és a játék világának kialakítása és ennek alapján kell eldöntenünk melyik úton indulunk el. Ha nem rendelkezünk megfelelő matematika, fizika és geometria ismerettel, ne eröltessük a motor programozást. Ha általánosságban a programozást, keretrendszerek használatát túl bonyolultnak találjuk akkor használhatunk kész fejlesztő környezeteket és scripteket és néhány esetben még scripteket sem kell használnunk.
Igen vannak olyan programok amikben scriptek és pogramozás nélkül is fejleszthetünk és ezeket a programokat nem kell lenézni mert ha bele gondolunk ez a jövő. Végeredményben minden stúdió arra törekszik hogy egy játék minél gyorsabban minél kevesebb pénzből elkészülhessen és ennek a legjobb módja ha a fejlesztésből mint “csoportos művelet” kivesszük a programozást és scriptelést és lecseréljük tömbökkel amiket vizuálisan csak össze kell kapcsolnunk vagy konkrét mondatokra és egyszerű célra törő utasításokra mint például “Ha ez a billentyű le van nyomva : ez az objektum pörögjön, ezen a tengelyen, ekkora sebességgel”. Ily módon gyakorlatilag bárkire rá lehet bízni a játékmenet kialakítását és a konkrét játék fejlesztését ami azt vonja maga után hogy egy játék fejlesztése drasztikusan felgyorsul (lásd Call of Duty amiből kapunk minden évben egyet) és a fejlesztést végző embereket könnyű jobb szó híján beszerezni, pótolni mivel kevesebb hozzáértés szükséges és kevesebbet is lehet fizetni a fejlesztőknek mivel a tudásuk, hozzáértésük kevesebbet ér és megint csak könnyű beszerezni. Gyakorlatilag ma ennek vagyunk tanui a gyáriparban és ez a jövője a játék iparnak is.
Erre a legjobb példa az UDK illetve Unreal Engine amiben az Unreal Kismet rendszernek köszönhetően abszolút 0 programozással és scripteléssel is fejleszthetünk játékokat és ily módon a pici pár fős, amatőr indie csapatok ontják magukból az Unreal motoros játékokat de az sem ritka már hogy egyetlen ember (megfelelő grafikus képességekkel) áll elő valamivel ebben a motorban. Ezért a véleményem az hogy ne becsüljünk le valamit csak azért mert programozás és scriptelés nélkül is megvalósíthatjuk benne az ötleteinket illetve ne keseredjünk el ha a programozás és scriptelés nem megy. Persze a legtöbb ilyen programban korlátozottabbak vagyunk mintha programoznánk vagy scriptelnénk de csak addig még a motort és utasításkészletet programozó személy, ki nem egészíti a motort és az utasítás készletet a hiányzó elemekkel.
Ám egy játék fejlesztése itt még koránt sem ért véget, inkább itt kezdődik igazán. Ugyanis egy játék fejlesztéséhez nem csak motorokra, scriptekre és keretrendszerekre van szükség, hanem a konkrét tartalomra is mint épületek, karakterek, fegyverek, autók, és hangok, képek amikből felépül a játék világa és amiken keresztül a játékos megtapasztalhatja a játékmenetet. A játékoknak ezen részeit más programokban készítik.
3D játékokban például 3D modellekre van szükség és textúrákra amik végső soron képek és a 3D modelleket borítják be ezzel megadva a külső részleteket. A mai 3D játékokban minden 3D modellekből és textúrákból áll nem úgy mint a régi klasszikusokban (Doom, Wolfentesin, Duke Nukem 3D) amikben csak a környezet volt 3D minden más 2D sprite volt.
A 3D modelleket ha szükséges animálni is kell hogy például a karakter sétáljon, a fegyver újratöltsön és a játékban ezeket az animációkat kell lejátszani amikor szükséges, ahányszor szükség. Ezt általában egy “csontváz” mozgatásával érik el amihez a 3D modell egyes részei (vertex pontjai) hozzá vannak csatolva és így egy csontvázon keresztül mozgatják a 3D modellt vagy lehet vertex alapú is ami egyszerűen csak magát a vertex pontok aktuális pozícióját változtatja például ajtóknál amikor kinyílnak.
2D játékok esetében pedig úgy nevezett 2D sprite-okra van szükség amik képek akár csak egy textúra de inkább egy tárgyat, karaktert egyéb játék elemeket testesít meg ebben az esetben.
Ezeket a sprite-okat is ha szükséges animálni kell hogy például a karakter sétál, ugrik.stb. Sprite-ok esetében ez már bonyolultabb mivel ahhoz hogy animáljuk gyakorlatilag többször le kell rajzoljuk a mozdulat más és más pontján
Vagy pedig az adott sprite-ot darabokból is összerakhatjuk és használhatunk olyan programokat az animáláshoz mint például a Spriter amiben 3D modellekhez hasonló módon lehet spriteokat animálni egy “csontvázon keresztül”.
A Spriter jelenleg egy egészen új módja a sprite-ok animálásnak és így nagyon sok motor még nem támogatja, de a Spriter képes minden egyes animációt, mozdulatot képre menteni ily módon használható minden motorral a spriter-ben készített animáció. Ám a cél az lenne hogy a Spriter csontváz alapú animációját támogassa minél több játék motor, jelenleg hivatalosan csak a Construct 2 és AGK támogatja, de még ezek sem minden funkciót sajnos.
Ezen túl, 2D játékok esetében a pálya felépítéséhez használhatnak úgy nevezett tilmap-okat is, ez lényegében egy kép akár csak egy sprite vagy textúra 3D játék esetén, ám ebben az esetben konkrét pálya elemeket tartalmaz egyetlen képen felosztva kis csempékre (tiles).
Ilyen “tilemap-ok” lehetőségének használata igazán az adott játék motortól függ. Vannak motorok amik nem képesek ilyen tilemap-okat használni, az ő esetükben minden egyes “csempét” egy külön képként illetve sprite-ként kell használni, importálni.
Egy játékfejlesztésén ezen túl szükség van még hangokra és zenére is és egyéb technikák alkalmazására amiknek a részleteibe már nem mennék bele mivel a cikknek a célja hogy csak nagy vonalakban bemutassa mi kell egy játék fejlesztéséhez és hogyan, mivel lehet elkezdeni.
Ahogy láthatjátok egy játék fejlesztése még a fentebb említett programok esetén programozás nélkül is időigényes feladat ezért is dolgoznak többen egy játékon. Ideális esetben minden ember aki egy játékon dolgozik, specializálódik valamilyen területre. Például a motor programozásra, keretrendszer fejlesztésre, játékmenet scriptelésre, pálya tervezésre, modellezésre, karakter animálásra..stb.
Nagyon ritka az amikor valaki mindenhez ért és még ritkább az hogy tényleg valami érdekeset is tud alkotni egymaga. Csak 2 esetről tudok amikor ez sikerült valakinek. Minecraft és Salvation Prophecy. Mind a 2 játékot egyetlen ember fejlesztette habár a Minecraft mögött már egy csapat áll a hatalmas sikerének köszönhetően, de eredetileg egyetlen ember fejlesztette az egészet ami ugyan bizonyíték rá hogy nem lehetetlen, ám ritka hogy valakinek sikerül. Ezért ha érdekel minket a játékfejlesztés azt ajánlom hogy döntsük el melyik terület érdekel minket jobban, ha kell kóstoljunk bele mindenbe egy kicsit hogy lássuk nem csak az érdeklődés de a képességünk, tehetségünk is megvan hozzá és azon a területen próbáljuk a lehető legtöbben kihozni magunkból ami jobban érdekel, amiben esetleg jobbak vagyunk.
Amennyiben szeretnétek a játékfejlesztés világában komolyabb ismeretekre szert tenni, ajánlom a Budapesti Műszaki és Gazdaságtudományi Egyetem játéktervező és -elemző képzését amit először 2015-ben indítottak és tervek szerint 2016 szeptemberében indul újra. További információért látogassátok meg a hivatalos weboldalt:
Ha nem sikerülne a képzésre felvételt nyerni, akkor sincs veszve minden ugyanis ÁLLÍTÓLAG a Planet Taxi fejlesztői, szintén indítanak játékfejlesztő képzéseket ami során a diákok a Unity Engine használatát sajátíthatják el. Próbáltam hivatalos oldalt, információt találni a képzésről ám csak online magazinok beszámolóira bukkantam. Minden esetre a Planet Taxi facebook oldalán továbbra is említést tesznek a képzésről, ott érdeklődjetek:
https://www.facebook.com/planettaxiunitygame
Továbbá érdemes lehet felkeresni a jatekfejlsztes.hu-t ahol egy aktív indie játékfejlesztő közösséget találtok akiktől tanácsot és segítséget kérhettek, és persze, ezen az oldalon is igyekszem majd ahogy időm engedi némi oktató anyagot felrakni ami ugyan sovány vigasz de remélem az érdeklődők hasznosnak találják majd.
Végezetül csak szeretnék megemlíteni pár programot amit ajánlok mindenki figyelmébe.
- 3D modellezés: Blender, Google Sketchup, Wings3D
- 3D animálás: Blender, Anim8or
- Textúrák, spriteok: Gimp
- Pixelart: mtPaint
- Hang effektek: Audacity
- 2D animáció: Spriter
- 3D modellekből 2D sprite: 3D2Sprite
- 3D pálya és terep modellezés: DeleD
- Textúrázás, UV map: Blender, Unwrap3D
Ajánlott cikkek: