hogyan kell a bulelt felrázni, károsítja-e az egységet


Válasz 1:

Csak arra vagyok kíváncsi, hogy adjak néhány példát a különböző típusú játékokra. A másik már említette, mennyire érdekes ez a típusú probléma valójában.

A „Bullet Hell” műfajhoz hasonló, mint a függőleges / vízszintes lövöldözős játékok, például a Geometry Wars vagy a Touhou játékok. Maga a játék úgy lett megtervezve, hogy olyan sok golyó töltse ki a képernyőt, és maga a játék valós időben fut, 60 FPS-t fenntartva. Ennél a fajta játéknál nem szép, ha az ütközés logikája az egyes golyókra kerül. Mivel egyszerre több száz golyó létezik, és ha minden golyó megvizsgálja önmagát, nincs elég idő arra, hogy maga a cpu ellenőrizze az összes golyót. Ebben az esetben jobb, ha az ütközés észlelési logikáját minden olyan fontos objektumra helyezi, amelyre az ütközés hatással lesz, például a játékosra (vagy az ellenségre). Ha akkor csak a játékost ellenőrizzük, akkor jelentősen csökkentjük az ütközések ellenőrzésének számát. Bármilyen módszert is használtunk itt, rendben van, ha csökkentjük az idő bonyolultságát.

Vannak más játékok is, amelyek kifinomult ütközési ellenőrzéseket igényelnek. Például Angry Birds. A képernyőn látható összes objektum kölcsönhatásba léphet egymással. A madarak megüthetik a dobozt, a doboz más dobozt, oszlopokat, vagy felrobbanhat stb. Ebben a példában a játék a fizika szimulációjának egyik alfaja. Mert minden tárgyat ellenőriznünk kell, és nincs más út. Ezután ki kell dolgoznunk egy ellenőrző architektúrát vagy modelleket az összes objektum hatékony feldolgozásához. A különösen hatékony algoritmus AABB (Axis Aligned Bounding Box) néven ismert. Mivel ez egy szokásos algoritmus (például sugárzás az FPS-ben), általában léteznek könyvtárak erre, hogy elkerüljék a kerék újrafeltalálását. Például a Box2D egy ilyen könyvtár. Vannak olyan esetek is, amikor meghatározott adatszerkezeteket kellett használnia egy algoritmushoz. A Quadtree objektum ilyen példa a 2D térbeli adatstruktúrára. Ez lehetővé teszi az objektumok gyorsabb keresését és indexelését az ütközési ellenőrzések során.

Ezután ráadásul nem minden játéknak volt szüksége komplex logikára. Nem kell bazukát használnunk, hogy szöget tegyünk. Mint például néhány harci játékban, legyen az 2D vagy 3D, a karakter golyókat is lőhet. Képzelje el, hogy Ryu Hadoukent csinál, egyelőre csak 3 objektum létezik. Az ilyen helyzetekhez elegendő egy egyszerű fedvényhatároló doboz ellenőrzése.

Vannak olyan játékok is, amelyek nem használnak fizikai lövedékeket, de mégis szükségük van egy ütközésérzékelő motorra. Például a Dota 2-ben rendkívül nehéz olyan teljes fizikai modelleket létrehozni, ahol minden objektum valós időben kölcsönhatásba léphet többjátékos környezetben. Ebben az esetben gyakran a lövedékeknek nem kell reálisaknak lenniük, és be kell tartaniuk a fizikai törvényeket. A Dota 2 szabványos nyilai nem egyenes vonalat követnek, hanem a célt követik. Ez egy kissé „könnyebben” feldolgozhatóvá teszi a számításokat, mert garantáltan ütközött már a kezdetektől, mert követni fogja a célt. Több olyan „lebutított” eset is létezik, hogy kevésbé reális legyen, például a normál lövedékek nem ütköznek össze, több Effektus-terület is halmozódik, mert csak a határokat ellenőrzi. Tehát, ha nem lehet komplex logikát folytatni, megváltoztathatja a játékmenetét. Amíg az ok és a viselkedés következetes, addig a játékos rendben van. Akár jellemzőnek is tekinthető.

Végül, mivel játékról van szó, megalkothatjuk a saját szabályunkat. Gyakrabban az ellenőrzött golyókat nem kell ellenőrizni minden egyes képponton, részecskén vagy textúrán. Vegyünk példát a klasszikus Mario Bros-ról. Amikor azt ellenőrizték, hogy Mario ütközik-e tárgyakkal, nem ellenőrizték pixel tökéletességgel. Csak egy egyszerű téglalap határokat használnak, de ez nem jelenik meg a képernyőn. Ugyanez vonatkozik az FPS-re is. Nincsenek valós idejű golyóutak. Csak speciális effektusok és animációk léteznek, de a tényleges ütközésellenőrzést a sugárzott sugárzás segítségével végezték, amely nem fizikai golyó. Vegyünk példát, mint például egy gépfegyver kilövésére, nem lőttünk száz golyót egyszerre, hanem egy sugárzást hajtottunk végre, majd úgy alkalmazzuk a hatást, mintha száz golyóból származna. Ez csökkenti az ütközések ellenőrzésének számát is. A Bombs is ugyanúgy működik, nem oszlatja el a tényleges töredékeket.

Alapvetően egyszerűsítjük a dolgokat, amikor csak lehet, és csökkentjük a bonyolultságot.


Válasz 2:

A rövid válasz: A játékkódban az nem számít, hogy ki ellenőrzi a találatot, de kulcsfontosságú, hogy hol ellenőrzik ezt a kódot.

A hosszú válasz:

Attól függ, hogy a játék hogyan dönti el, hogy ki végez ellenőrzést. Például egyes játékoknál a szerver elvégzi ezt az ellenőrzést, amelyet „találatérzékelésnek” hívnak, amelyet mások már megvitattak ebben a válaszláncban (pl. Sam Lazarus sugárzott vitája).

A kliens oldalon végzett HD azt jelenti, hogy „a leggyorsabb kapcsolat nyer”. Tegyük fel, hogy az A és a B játékos egyaránt fejlövést mutat egymással az X időpontban. Az a csomag, amely a „Megöltem a másik játékost” információt küldi, különböző sebességgel éri el a szervert. A játéknak el kell döntenie, hogy igen

  1. Először a leggyorsabb csomagokat engedik meg.
  2. Engedélyeznek egy olyan időszakot, amelyre „nem mindegy, ki ér el először”.

Tehát a két eredmény egyike: vagy az egyik játékos lemegy, vagy mindkét játékos lemegy.

Ha ez szerver oldalon történik, akkor valószínűleg az összes játékos elküldi az információt, hogy „ebben a helyzetben lőttem az irányba”. Ezután a szerver felveszi az információkat, és elvégzi az összes, „mi történt ekkor történt” összesítést, és eldönti, majd nagy mennyiségű „a jelenlegi helyzet jelenleg” információt küld vissza a játékosnak. Képzelje el, hogy ez másodpercenként 10, 30 vagy 60 alkalommal fordul elő.

Az eredmény itt függ a játéktól, a szerverhez való csatlakozás sebességétől és a hardveren, amelyen a játék szerver fut, így nincs egyértelmű és egyszerű válasz. Ha a játék kellően optimalizált, akkor lehetséges, hogy kettős KO-t láthatunk, ha a játék ezt megengedi, de ez a játéktól függ.

A legrövidebb válasz elérése: attól függ, hogy a játék miként látja a találatok felismerését.


Válasz 3:

A játéktól függ. Ezt „találatészlelésnek” nevezik, és ennek módja nagy hatással lehet a játékra.

A találatok észlelésének két típusa van; kliens és szerver oldal. Ezen belül az ügyféloldali találatfelismerés történhet a lövő vagy a célpont részéről, bár nem jut eszembe olyan példa, ahol a céloldali találatérzékelést alkalmaznák (valószínűleg azért, mert a hackerek visszaélhetnek ezzel, valamint késleltetési problémákat okozhatnak).

A kliens oldali találatok felismerése a legnépszerűbb a játékok között. Ebben a helyzetben, amikor fegyvert lő, a számítógép kiszámítja a golyó pályáját és meghatározza, hogy eltalál-e egy ellenséget. Ha mégis megtörténik, akkor a játék elküldi ezeket az információkat a szervernek azzal a mondattal, hogy „ennyi kárért eltaláltam ezt az ellenséget”.

Az ügyféloldali találatfelismerés előnye, hogy kevesebb terhet ró a szerverre. Ha 10 játékosod van egy szerveren, ez másodpercenként több ezer golyót lőhet ki. Ezeknek a számításoknak az ügyféloldalra helyezése megakadályozza a kiszolgáló túlterhelését és lemaradását.

Hátránya, hogy késleltetés van a szerver és az ügyfél között. Lehet, hogy ellenséget lát a végén, és lelövi őket, de a késés miatt az ellenség valójában nem volt ott. Az ellenség végén a fedél mögött lőnek. Kétféleképpen lehet ezt kezelni; késleltetett kompenzáció a játékkódban, vagy a szerveroldali találatérzékelés.

A kiszolgálóoldali találatok felismerése nagy késleltetésű helyzetekben is problematikus lehet, mert előfordulhat, hogy lát valakit és lő, de a találatok nem regisztrálódnak, mert a kiszolgáló elképzelése arról, hogy hol van az ellenség, nem jelenik meg a játékban a késés miatt. Ez azt jelentheti, hogy ténylegesen vezetnie kell a felvételeket a szerver késésének kompenzálására.

A legtöbb játék nagyon összetett netkóddal rendelkezik, amely segít elkerülni ezeket a problémákat. Egyes játékok, például a Battlefield 1, még a lejátszó kapcsolati sebességétől függően válthatnak a találatok észlelésének különböző típusai között.


Válasz 4:

Ez nagyon jó kérdés! Sikerült öntudatlanul eltalálnia egy olyan témát, amely nemcsak a játéktervezés, hanem általában a programozás szempontjából is központi szerepet játszik. A kérdésedre az a válasz, hogy teljes mértékben attól függ, hogy a fejlesztő hogyan döntött a játék felépítéséről, de merüljünk el ennél mélyebben.

A legtöbb játékmotorban a logikai folyamat úgy van felépítve, hogy amikor golyót lőnek ki, sugárvetést hajtanak végre. A sugár leadása azt jelenti, hogy egy vonal húzódik a tűzpontból, és ellenőrizzük, hogy ütköznek-e valamilyen modellek az adott vonallal vagy sugárral. Ütközés észlelésekor jelet küld minden olyan modellnek, amellyel a sugár ütközik, és ők felelnek a logika biztosításáért a velük ütköző golyó kezelésére. (Például egy fal nem tehet semmit, míg a játékos károkat okoz.)

Más játékokban azonban a golyó tényleges repülési útját modellezik, és a golyókat a gravitáció befolyásolja, és utazási idejük van. Ennek kezelése érdekében maga a golyó felelős annak eldöntéséért, hogy hogyan mozog, majd a golyó kölcsönhatásának logikája erősebben kapcsolódhat a golyóhoz.

Végső soron ez egy olyan kérdés, amely nagyon gyakran felmerül az általános programozás során, és feltett egy kérdést, amelyet sok fejlesztő rendszeresen feltett magának: , és a rendszerem mely eleméhez kell kapcsolódni. " Ez gyakran összetett építészeti döntés, és egyike a sok kihívásnak, ami miatt a programozás kevésbé tudomány, és inkább művészet.


Válasz 5:

Hosszú ideje írtam bármilyen kódot a videojátékokhoz, így a technika állása változhatott (és valószínűleg megváltozott is), de a valós idejű játék elsődleges célja nem változott: olyan gyorsnak kell lennie, mint lehetséges.

Ennek megvalósításához egy golyót úgy modelleztem, hogy egyenes vonalban halad. A legtöbb harctéri helyzetben ez ésszerű közelítés. Ha hosszú távú mesterlövész modellt próbált modellezni, akkor lehet, hogy számolnia kell a szélsebességgel és az eséssel, de ezek minimális tényezők, és sokkal gyorsabb processzorok nélkül (amelyek ma vannak) nem volt praktikus, legalábbis az én nap.

Az emberi test azonban összetett forma, ezért szakaszosan lebontottam. Az első szakaszban hengerként modelleztem a lejátszót. A játékos helyzetében egy függőleges vonal, egy magasság és egy sugár szükséges. Innentől kezdve egyszerűen meg kell találni a távolságot a játékos középpontjától a golyó vonaláig. A geometriai hallgatók emlékezni fognak arra, hogy a távolságot mindig derékszögben mérik, hogy a lehető legkisebb távolságot érjék el. Ezt a távolságot ezután összehasonlítjuk az ábra sugarával. Ha a távolság nagyobb, mint a sugár, a golyó kihagyta a játékost, és nem kell további lépéseket tenni.

Ha a távolság kisebb, mint a sugár, akkor tovább kell lépnie a 2. szakaszba, amelyben az egyes testrészek hengerként (vagy gömbként vannak ábrázolva a fej esetében) nem feltételezhető, hogy a golyó eltalálta valami a testen; ártalmatlanul haladhatott el például a lábak között. Ellenőrizze az egyes testrészek távolságát a golyó és a henger vonalától, és eltalálja, ha ez a távolság kisebb, mint a henger sugara. (Vagy a gömb sugara a fej esetében)

Először ellenőrizném a fejét, feltételezve, hogy egy fejlövés végzetes lesz, és nem kellene pazarolnom a feldolgozást azzal a céllal, hogy kiderítsem, ugyanez a golyó behatol-e például egy karba is.

Tudom, hogy ez némileg leegyszerűsítve van: például szándékosan hagytam ki az ütés ellenőrzésének folyamatát, csak azért, mert a tisztaságra törekedtem. Van azonban még egy pontom, amelyet meg akartam tenni, mert megemlítettem, hogy a sebesség az elsődleges cél.

Ezekben a számításokban a legtöbb feldolgozási időt egy négyzetgyök kiszámítása jelenti. A klasszikus 2D távolság képlet háromdimenziós analógjához továbbra is négyzetgyök kell. Annak érdekében, hogy leborotváljak ezt az időt, egyszerűen nem tettem meg ezt az utolsó lépést, és a távolságok négyzetét hasonlítottam össze, nem pedig magukat a távolságokat. Ugyanazok az eredmények, csak gyorsabban.

Tudomásul veszem, hogy nem válaszoltam meg teljesen az eredeti kérdést, de ha írsz egy objektumot a számítások elvégzéséhez, és átadsz neki egy golyóobjektumot és egy célobjektumot, mindkét esetben ugyanazokat az eredményeket kaphatod.


Válasz 6:

Az ókorban egy karakter olyan fájlra épült vagy épül fel, amely rendelkezik a karakter összes attribútumával. A legtöbbször olyan szintű, mint például az egészségi állapot, de megsebesülhet, vagy egy bizonyos százalékban, és még mindig életben lehet. Tehát ha egy golyó eltalálja, nem mindig jelenti azt, hogy halott vagy. Mivel a játék szerzőjének feladata annak meghatározása, hogy a golyó által a szív területére vagy más területekre eltalált játékos meghatározza-e a kár mértékét és típusát, ez nem minden játék esetében azonos. Gondolom, a golyó vagy bármilyen más tárgy, bomba, gránát stb. Különböző szintű egészséget nyújt, attól függően, hogy hol üt meg, ez is változhat. A játékban minden tárgynak van jelentősége, mozog vagy nem mozog. Mennyire közel állsz hozzá, az X, YZ státuszod a játékban. Az X, Y, Z pontok minden képkocka-passznál. Mindezeket a dolgokat folyamatosan elemzik. (Valós idő). Most látja, miért nem olyan egyszerű a játék elkészítése, mint a szövegszerkesztő. A játék ellenségeit vagy játékosait, legyen az jó vagy rossz fiú, folyamatosan ellenőrzik és valós időben megjelenítik egyes játékok egészségi állapotát. Néhány játékon akár halott, akár életben van, mint például a PacMan. Más játékok esetén halott vagy életben lévő 1-10 vagy 1-100 skálán stb. Más tárgyak, bár a való életben már jóval korábban megbuktak volna, például autók, csónakok, tartályok stb., Sőt fegyverek is megsemmisülhetnek vagy megsebesülhetnek. Egy igazán jó játéknak lehet fegyvere, amely elakad, túlmelegszik, lelassul, kevésbé erős lézer és így tovább, miközben használják és visszaélnek vele. Minél bonyolultabban készíti el az objektumot, annál inkább a játéknak kell szentelnie a játékot játszó számítógép erejét, így meg kell őriznie az egyensúlyt.

MOST ne feledje, hogy soha nem terveztem és írtam játékot vagy játék szoftvert. Csak a játékból veszek példákat annak tanulmányozásához, hogy a szerző hogyan építette fel a játékot.

Sok évvel ezelőtt a DOS-hoz írt Chuck Yeager repülési szimulátor a játékmappában számos konfigurációs fájlt tartalmazott. Az egyik játékban mindegyik játéknál megtalálhatóak voltak az egyes síkok jellemzői, egyszerű szöveges formátumban, a játék mappájában. Könnyedén módosíthatja őket egy hexaszerkesztővel. Megterveztük és meg tudtuk tervezni a játékot, hogy repülővel induljon, és amint magasságot szerez, hátramenetben repül. Most nem valósíthatod meg ezt valódi repülővel. De nagyon szórakoztató volt és nagyon nehéz nagy távolságokat repülni, de szórakoztató volt! Azt hiszem, bizonyos játékokban a konfigurációs fájlokat is megváltoztathatja, hogy a karaktered elpusztíthatatlan legyen. Az ellenségek tehát nem ölhettek meg, bármennyire is lelőtték. Ez sokkal szórakoztatóbb volt, de aztán a szerzők hamar rájöttek arra a hibára, és az összes fájlt kódolták, hogy ne találja meg, milyen értékeken változtasson, hogy elpusztíthatatlanná vagy elviselhetetlenné váljon.


Válasz 7:

Sam Lazarus ezt elég jól elmagyarázta (Jól sikerült Sam!), Azonban az, hogy egy ilyen szerelőt hogyan hajtanak végre, nagyban függ a játéktól.

A sugárpásztázás az egyik főbb áramlási megközelítés, amely megoldást talál erre. Ez a megvalósítás sok régebbi játékban történt, amelyek sokkal korlátozottabbak voltak a számítások terén a játék során. Ennek néhány további ismétlése a „sláger dobozok” felvétele a késés ellensúlyozására a többjátékos játékokban, és ütközéses objektumként duplázva (Kalap le annak a személynek, aki kitalálta ezt!). Azonban az idő múlásával a fejlesztők egyre több érdekes módszert találtak ki ennek megoldására.

Láttam, hogy az egyik a találatkeresés megközelítést alkalmazza, ahol a találat észlelése után számítást végzett a golyócsökkenés meghatározására. Meglepő módon a számítás egyszerű volt, egy 3D-s játékban a rendelkezésre álló dimenziók X, Y és Z. Ebben az esetben, amikor a beolvasás találatot észlelt, a definiált változónak „az összegnek a távolság növekményenként történő csökkenésére” kell lennie, és levonja a Z a megadott változóból.

Ebben az esetben a programozók a következő változókat vehetik figyelembe az élmény javítása érdekében: Bullet origó helye, Hit objektum helye, Távolság, Magasság és Idő. A találatellenőrzés megközelítése általában csak egy pontként regisztrálódik. Ebben az esetben azonban a felsorolásjelet további változók elszámolásával valósítják meg. Egyesek beépíthetnek egy olyan környezeti változót is, amelyet a játékos a szint által határoz meg a szél vagy más változók szimulálására.

Bármely programozó elmondhatja, hogy minél bonyolultabb a szimuláció, annál több erőforrásra van szükség a sima eredmény biztosításához. Képzelje el egy pillanatra, hogy megpróbál beépíteni egy nagyon összetett számítást, például a golyócsökkenést egy régebbi online játékba. Ebben a forgatókönyvben a hardver egyszerűen nem volt kész támogatni egy ilyen műveletet. A több nem mindig jó, és ha optimalizálásról van szó, annál többet lehet kihagyni, annál jobb teljesítményt nyújtva.

Általában sugárvizsgálati megközelítéssel valójában nem generál golyót, a „végeredmény” általában csak befejeződik egy előre definiált opció aktiválásával az eltalált entitás számára. Ez általában valami hang, matrica vagy valami érdekes, például robbanás. Míg a játékban előállított golyó hiánya jelentősen csökkenti a játékhoz szükséges erőforrásokat, valójában nem töri meg az elmélyülést annak gyorsasága miatt (próbáljon megnézni egy utazó golyót, ha egyszer szabad szemmel lőtt).

Azokban a játékokban, ahol kill bütykök vannak beépítve, amelyek golyókat mutatnak, ennek 3 megközelítése van, amelyekről tudom. Először is, a golyót csak ebben a sorozatban kell ívni abban a pontban, ahol a kamera elfordul a találat „pontja” felé, ezt általában a lövőtől a célig terjedő medián tartomány határozza meg. Ez azt az illúziót kelti, hogy az ívott golyót lőtték, ebben az esetben, bár nem ez volt, mégis fenntartja az illúziót. A második az, hogy minden egyes pillanatban golyót kell ívni, amikor a tűzindító elindul, biztos vagyok benne, hogy nem kell rámutatnom, hogy ez mennyi pazarlás az erőforrásokra. Míg egyes játékok ezt értékesítési pontként használják, én ezt rontásnak tekintem, mivel a játék általános minőségének csökkennie kell egy ilyen funkció támogatásához. A harmadik megközelítés nagyon vicces, és ezt csak régebbi és néhány újabb játékban láttam. A sprite, a sprite a játékfejlesztés világának furcsa misztikus lénye. Ebben az esetben a sprite (egy olyan képfájl, amely mindig közvetlenül a lejátszó kamerája felé néz) animált kép lehet, amely elindításkor úgy tűnik, hogy az animáció által a távolba zsugorodik, vagy a megtett távolság alapján csökken. A Sprites kissé zavaros lehet, mivel valójában nagyon sok erőforrást tudnak igénybe venni, attól függően, hogy mennyire részletesek. A sprite-eket korlátozott felhasználása miatt ritkán használják a modern játékokban is.


Válasz 8:

Csak elmagyarázom, hogyan működik. Kétféle golyó létezik. Hitscan és lövedék. A Hitscan alapvetően azonnali lézersugár a fegyvertől a bármi eltalálásáig, a lövedékek pedig háromlevelűek.

HITSCAN (többjátékos)

Ha rákattint arra a tényre, hogy rákattint, és hová kerül a szerverre, a kiszolgáló ellenőrzi az elérési utat, és meghatározza, hogy eltalált-e egy ellenséget vagy egy felületet, majd a eldöntött eredményt visszaküldi a kliensnek / kliensnek (te a játékos) sérült játékos vagy találati felület. Ezért néha láthatja az ellenségből származó vért, de 0 sebzést okozott, és ezért a cs játékosok 64 helyett 124 pipát akarnak, a tick másodpercenként frissítési gyakoriságot jelent.

HITSCAN (egyjátékos)

Pontosan ugyanaz, mint a Multiplayer, de soha nem lesz probléma a kullancssebességgel (frissítési gyakorisággal).

A lövedékek egy kicsit bonyolultabbak, oda-vissza információkat kell küldenie a kliens és a szerver között minden egyes kullancsért, hogy a lövedék még mindig a levegőben repül, általában vannak bulletdrop-jaik is, és mindezt egy olyan pályára számítják, amely egy szerver ellenőrzi a Multiplayer-ben, vagy az ügyfél végrehajtja a Singleplayer-ben.

A visszarúgás általában 0 és egy mennyiség között van, és ez a kúp szélessége, amelybe a golyók beszállhatnak. A kúp a játékos kamerájából indul, és egy felületen vagy egy skyboxon ér véget. A csgo-ban azonban minden golyónak van egy meghatározott vektor távolsága attól a ponttól, ahonnan elkezdte lenyomni a tűz gombot (ha nem mozgatja az egeret, akkor a visszarúgási minta kezdetének helyzete megváltozik). A vektor az „X” és „Y” tengely távolságának kimondott módja egy ponttól.

Remélem mindent tisztáztam.


Válasz 9:

A golyófizika megvalósításához egy videojátékban általában két módszer létezik:

Hitscan: Ez egy úgynevezett felhasználást használ annak megállapításához, hogy amit célzol, egy lövedékkel eltalálják. Alapvetően a motor meglátja, hová célzik a fegyver, húz egy vonalat a fegyvertől valamilyen maximális hatótávolságig, és meglátja, hogy van-e más tárgy a látóhatáron. Ha igen, akkor megmondja az objektumnak, hogy golyóval „eltalálták”. Ennek egy másik mellékhatása, hogy olyan fegyvereket hozhat létre, amelyek egy sorban több fegyverbe is behatolhatnak (például a Quake-ben lévő sínfegyverhez), feltárva MINDEN objektumot, amelyek átlépik a sugárzást.

Sok játék választja ezt a módszert, mivel gyorsan kiszámítható, és nem igényel új fizikai objektum példányosítását. A számítás azonnal megtörténik (ha elkezdjük figyelembe venni a golyósebességet, akkor a célpont ezen a ponton elmozdulhat), így nincs időtartam a fegyver elsütése és a célpont károkozása között. A leadott sugarak egyenesek és nem utánozzák a valódi golyókat. Ennek kompenzálására a programozók véletlenszerű eltéréseket adhatnak a „realizmus” irányába (visszarúgás, szél, gravitáció stb.)

Példák az ezt használó játékokra: Call of Duty, Halo, Korábbi Battlefield játékok stb.

Lövedék ballisztikája:

Ebben a módszerben a játékmotor tulajdonképpen egy új hálót hoz létre a játék világában, saját tömegével. Ez megadja a golyó saját sebességét és méretét, amelyet a motor követni fog. Amint a golyó mozog (potenciálisan teljes külső ballisztikai szimulációval), a programozó logikában hozzáadhatja azt, hogy mi történik, amikor egy objektumot eltalál. A golyó sokkal reálisabb szimulációja. De a programozás nehéz lehet, és tényleges mérnökökre van szükség az ilyen fizika kódolásához a játék motorjában. Továbbá, mivel minden golyót a motor hoz létre és szimulál, ezért adóztatja a rendszert. Ezért olyan játékokhoz, mint az Arma, csúcskategóriás rendszerek szükségesek, hogy ne csak a játékos, hanem az AI szövetségesei és ellenségei is golyókat tudjanak szimulálni.

A lövedék ballisztikáját használó játékok:

Arma, PuBG, Sniper Elite franchise, Sniper Ghost Warrior. Amit összegyűjtöttem, a Battlefield a lövedék ballisztikus megközelítésének alaprendszerét használja a mesterlövészek számára.


Válasz 10:

Nos, a legtöbb válasz itt a grafikára vonatkozik, és arra, hogy a sugáröntés hogyan befolyásolja a modellezést. Bár ez mindenképpen jó megközelítés, szeretnék csak ragaszkodni az alap osztálytervhez és az OOP alapjaihoz.

Szeretném úgy modellezni az osztályom felépítését, hogy minden ellenséges egyén / fal olyan tárgy legyen, amely figyelembe veszi, mi történik, ha egy golyót eltalálnak. Ahelyett, hogy egy golyó a golyó szempontjából valóban ellenséget ütne.

Képzelje el a következő osztályokat: (absztrakt szinten)

osztály Irány {double x; kettős y; kettős z; }

osztály Pozíció {double x; kettős y; kettős z;}

osztályú Golyó {kettős sebesség; D irány; P helyzet; bool esemény OnBullet (helyzet, irány); }

osztály Ellenség {Pozíció p; int egészség; esemény OnEnemyHit (Pozíció); }

Most a tényleges funkció ellenségeket, golyókat, falakat stb. Fog tartalmazni, és tartalmazni fogja az EventHandlereket is, amelyek ellenőrzik, hogy van-e kereszteződés az ellenségeknek és a golyóknak / a falaknak és a golyóknak.

osztály Forgatókönyv {Ellenség e; B golyó; stb…}

Tehát, hogy válaszoljon a kérdésére, sem az Ellenségek, sem a Golyók nem ellenőrzik, hogy eltalálták-e őket, és a Golyók sem. A forgatókönyv ellenőrzi a kereszteződéseket, és az Ellenségek és / vagy a golyók egyaránt meghatározhatnak eseményeket az osztályaikban.

Természetesen a forgatókönyv osztály dinamikus listákkal / tömbökkel rendelkezik az objektumok több példányának kezelésére.


Válasz 11:

Számítási szempontból könnyebb lenne, ha a játékos ellenőrizné, hogy eltalálták-e őket. A golyók bőségesek, és az egyes golyókhoz objektumok rendelése rengeteg számítási erőforrást jelentene. Gyakran egy kúpobjektumot használtak a lövés ábrázolására, amely bizonyos esetekben olcsóbb, mint az automata fegyverből lőtt golyókat ábrázoló több tíz vonal létrehozása. Ezt azonban olyan játékokban használják, ahol a golyók elérési útját nem húzták be a képernyőre. Azok számára, akik megteszik, line objektum létrehozására lenne szükség.

Az objektumok metszéspontjának kiszámítása nagyon gyors, és mivel a golyókat valós idejűnek tekintik (mivel gyorsabbnak tekintették, mint a játékos mozgása), számítási szempontból olcsóbb, ha nem példányosítják a golyókat, hanem inkább egy olyan játékost, amely ellenőrzi, hogy keresztezi-e a lövést . És ha a kúp valóban keresztezi a fejet, és megváltoztatja a fejlövés tulajdonságát.