jak přimět bulelty poškodit jednotu


Odpověď 1:

Chtěl bych zde jen uvést několik příkladů pro různé typy her. Druhý již zmínil, jak zajímavý je tento typ problému.

Pro žánr „Bullet Hell“ něco jako vertikální / horizontální střílečky jako hry Geometry Wars nebo Touhou. Samotná hra byla navržena tak, aby obsahovala mnoho nábojů vyplňujících obrazovku a samotná hra běží v reálném čase a snaží se udržovat 60 FPS. Pro tento druh hry není hezké mít kolizní logiku umístěnou na každé střele. Protože budou existovat stovky odrážek najednou a pokud se každá odrážka zkontroluje, není dostatek času na to, aby samotná CPU zkontrolovala všechny odrážky. V tomto případě je lepší umístit logiku detekce kolize na každý důležitý objekt, který bude touto kolizí ovlivněn, například na hráče (nebo nepřítele). Pokud tedy zkontrolujeme pouze hráče, výrazně snížíme počet kolizních kontrol. Jakákoli metoda, kterou jsme zde použili, je v pořádku, pokud snížíme časovou složitost.

Existují i ​​jiné hry, které vyžadují sofistikované kontroly kolizí. Například Angry Birds. Všechny objekty na obrazovce mohou vzájemně interagovat. Ptáci mohou zasáhnout pole, pole může zasáhnout jiné pole nebo póly nebo explodovat atd. V tomto příkladu je hra subžánrem simulace fyziky. Protože musíme zkontrolovat všechny objekty a neexistuje jiné řešení. Pak musíme navrhnout kontrolní architekturu nebo modely, abychom mohli efektivně zpracovávat všechny objekty. Konkrétní efektivní algoritmus byl znám jako AABB (Axis Aligned Bounding Box). Jelikož se jedná o standardní algoritmus (jako je raycasting ve FPS), obvykle k tomu existují knihovny, aby se zabránilo novému objevu kola. Například Box2D je taková knihovna. Existují také chvíle, kdy jste museli pro algoritmus použít konkrétní datové struktury. Objekt Quadtree je takovým příkladem pro strukturu 2D prostorových dat. To umožňuje rychlejší vyhledávání a indexování objektů při provádění kolizních kontrol.

Pak navíc ne všechny hry vyžadovaly složitou logiku. K hřebíku nemusíme používat bazuku. Stejně jako například v některých bojových hrách, ať už 2D nebo 3D, může postava střílet kulky. Představte si, že Ryu dělá Hadouken, v té době existují pouze 3 objekty. Pro tento druh situace stačí jednoduché zaškrtávací políčko překrývajícího se rámečku.

Existují také hry, které nepoužívají fyzické projektily, ale přesto potřebují modul detekce kolizí. Například v Dota 2 bylo super těžké vytvořit úplné fyzické modely, kde každý objekt může interagovat v reálném čase v prostředí pro více hráčů. V tomto případě často nemusí být střely realistické a musí se řídit fyzikálními zákony. Standardní šipky v Dota 2 nesledují přímku, ale sledují cíl. Díky tomu je výpočet o něco „snazší“ zpracovat, protože bylo zaručeno, že se srazí od začátku, protože bude sledovat cíl. Existuje také několik případů „dumbed down“, aby to bylo méně realistické, stejně jako standardní projektily nekolidují, několik stacků Area of ​​Effects, protože kontroluje pouze hranice. Pokud tedy není možné provést složitou logiku, můžete změnit svou hru. Pokud jsou důvody a chování konzistentní, hráč je v pořádku. Lze jej dokonce považovat za funkci.

A konečně, protože se jedná o hru, můžeme si vytvořit vlastní pravidlo. Častěji není nutné kontrolovat odrážky u všech pixelů, částic nebo textur, které mají. Vezměte si příklad klasického Mario Bros. Při kontrole, že se Mario srazí s objekty, nekontrolovali dokonalost pixelů. Prostě používají jednoduché hranice obdélníku, ale na obrazovce se to nezobrazí. Totéž platí pro FPS. V reálném čase nejsou k dispozici žádné skutečné střely. Existují pouze speciální efekty a animace, ale skutečná kontrola kolize byla provedena pomocí raycastu, což není fyzická odrážka. Vezměme si příklad jako vystřelení z kulometu, nevystřelili jsme stovky kuliček najednou, ale místo toho jsme provedli jeden paprskový přenos, pak aplikujeme efekt, jako by to byl ze stovek střel. To také snižuje počet kolizních kontrol. Bomby také fungují stejně, nerozptylují skutečné fragmenty.

V zásadě věci zjednodušujeme, kdykoli je to možné, a snižujeme složitost.


Odpověď 2:

Krátká odpověď je: V herním kódu nezáleží na tom, kdo kontroluje zásah, ale klíčové je, kde je tento kód kontrolován.

Dlouhá odpověď:

Záleží na tom, jak hra rozhodne, kdo kontrolu provede. Například některé hry nechají server provést tuto kontrolu, která se nazývá „detekce zásahu“, což již bylo diskutováno ostatními v tomto vlákně odpovědí (např. Diskuse paprskového obsazení Sama Lazaruse).

HD na straně klienta znamená „nejrychlejší připojení vyhrává“. Předpokládejme, že hráči A a B se navzájem střílí v čase X. Paket, který pošle informace „Zabil jsem druhého hráče“, se k serveru dostane různými rychlostmi. Hra se pak musí rozhodnout, zda

  1. Nejprve povolí nejrychlejší paket.
  2. Umožní časové období, po které „nezáleží na tom, kdo dosáhne první“.

Takže jeden ze dvou výsledků: buď jeden z hráčů sestoupí, nebo oba hráči sestoupí.

Pokud je to provedeno na straně serveru, je pravděpodobné, že všichni hráči, kteří pošlou, jsou informace „vystřelil jsem ve směru na tuto pozici“. Server poté vezme informace a provede souhrn „všeho, co se v tuto chvíli stalo“ a rozhodne se, poté odešle velkou zátěž „informací o aktuální situaci právě teď“ zpět hráči. Představte si, že se to děje možná 10 nebo 30 nebo 60krát za sekundu.

Výsledek zde závisí na hře, rychlosti vašeho připojení k serveru a hardwaru, na kterém běží herní server, takže neexistuje jasná a snadná odpověď. Pokud je hra dostatečně optimalizována, je možné vidět dvojité KO, pokud to hra umožňuje, ale záleží to na hře.

Vedení k nejkratší odpovědi: záleží na tom, jak hra vidí detekci zásahu.


Odpověď 3:

Záleží na hře. Toto se označuje jako „detekce zásahu“ a způsob, jakým se to dělá, může mít na hru velký dopad.

Existují dva typy detekce zásahu; na straně klienta a na straně serveru. V rámci toho může být detekce zásahu na straně klienta střelec nebo cíl, i když si nemůžu představit žádný příklad, kdy se používá detekce zásahu na straně cíle (pravděpodobně proto, že by to mohli zneužít hackeři, stejně jako vytvořit problémy s latencí).

Detekce zásahů na straně klienta je mezi hrami nejoblíbenější. V této situaci, když střílíte ze zbraně, počítač vypočítá trajektorii střely a určí, zda zasáhne nepřítele. Pokud ano, vaše hra odešle tyto informace na server se slovy „Zasáhl jsem tohoto nepřítele pro toto množství poškození“.

Výhodou detekce zásahů na straně klienta je, že méně zatěžuje server. Pokud máte na serveru 10 hráčů, je to potenciálně tisíce střel vystřelených každou sekundu. Uvedení těchto výpočtů na straně klienta zabrání přetížení a zpoždění serveru.

Nevýhodou je, že mezi serverem a klientem existuje latence. Na konci můžete vidět nepřítele a zastřelit ho, ale kvůli latenci tento nepřítel ve skutečnosti nebyl. Na konci nepřítele budou zastřeleni za kryt. Existují dva způsoby, jak to vyřešit; kompenzace zpoždění v kódu hry nebo detekce zásahů na straně serveru.

Detekce zásahů na straně serveru může být také problematická v situacích s vysokou latencí, protože můžete někoho vidět a střílet, ale vaše zásahy se neregistrují, protože představa serveru o tom, kde je nepřítel, se kvůli vaší latenci neshoduje s vaší hrou. To může znamenat, že musíte své střely skutečně vést, abyste kompenzovali latenci serveru.

Většina her má velmi složitý netcode, který těmto problémům pomáhá předcházet. Některé hry, například Battlefield 1, dokonce přepínají mezi různými typy detekce zásahů v závislosti na rychlosti připojení hráče.


Odpověď 4:

To je opravdu dobrá otázka! Podařilo se vám nevědomky zasáhnout téma, které je zásadní nejen pro herní design, ale i pro programování obecně. Odpověď na vaši konkrétní otázku je, že to zcela závisí na způsobu, jakým se vývojář rozhodl hru strukturovat, ale pojďme se do toho ponořit hlouběji.

Ve většině herních enginů je logický tok strukturován tak, že když se vystřelí kulka, provede se seslání paprskem. Vrhací paprsek znamená, že čára je vytažena z ohnivého bodu a provedou se kontroly, zda se s touto přímkou ​​nebo paprskem srazí nějaké modely. Když je detekována kolize, je odeslán signál do všech modelů, se kterými se paprsek srazí, a jsou odpovědné za poskytnutí logiky řešení kolize kulky s nimi. (Například zeď nemusí dělat nic, zatímco hráč by utrpěl poškození.)

V jiných hrách je však modelována skutečná dráha letu střely a kulky jsou ovlivňovány gravitací a mají cestovní čas. Aby to bylo možné zvládnout, samotná kulka může mít na starosti rozhodování o tom, jak se pohybuje, a logika toho, jak kulka interaguje s věcmi, může být silněji spojena s kulkou.

Nakonec se jedná o otázku, která se při programování obecně často vyskytuje, a vy jste položili otázku, kterou si mnoho vývojářů pokládá pravidelně: „Aby bylo možné pěkně vytvořit systém, který chci modelovat, kam patří každá logika a s jakým prvkem mého systému by měl být spojen. “ Často se jedná o složité architektonické rozhodnutí a je jednou z mnoha výzev, díky nimž je programování méně vědou a více uměním.


Odpověď 5:

Už je to dlouho, co jsem napsal jakýkoli kód pro videohry, takže se současný stav mohl (a pravděpodobně i změnil), ale primární cíl všech her v reálném čase nebyl: musí být tak rychlý jako možný.

Abych toho dosáhl, vymodeloval jsem kulku tak, že cestuje přímočaře. Pro většinu situací na bojištích je to rozumné přiblížení. Pokud jste se pokoušeli modelovat ostřelovací střelu na velké vzdálenosti, možná budete muset počítat s větrem a pádem, ale to jsou minimální faktory a bez mnohem rychlejších procesorů (které dnes máme) to nebylo praktické, alespoň v mém den.

Lidské tělo má složitý tvar, a proto jsem ho postupně rozkládal. V první fázi jsem modeloval hráče jako válec. Svislá čára v pozici hráče, výška a poloměr jsou všechny potřebné informace. Odtud je jednoduché zjistit vzdálenost od středu hráče k čáře, kterou kulka letí. Studenti geometrie si budou pamatovat, že vzdálenost se vždy měří v pravém úhlu, aby se získala co nejmenší vzdálenost. Tato vzdálenost se poté porovná s poloměrem obrázku. Pokud je vzdálenost větší než poloměr, střela hráče minula a není třeba podnikat žádné další kroky.

Pokud je vzdálenost menší než poloměr, musíte pokračovat do fáze 2, ve které je každá část těla představována jako válec (nebo koule v případě hlavy). Nemůžete předpokládat zásah kulky. něco na těle; mohl například neškodně projít mezi nohama. Zkontrolujete vzdálenost od linie střely k linii válce pro každou část těla a získáte zásah, pokud je tato vzdálenost menší než poloměr válce. (Nebo poloměr koule, v případě hlavy)

Nejprve bych zkontroloval hlavu, za předpokladu, že výstřel do hlavy by byl smrtelný, a nemusel bych plýtvat zpracováním při pokusu zjistit, zda stejná kulka nepronikla například i do paže.

Vím, že je to poněkud zjednodušené: například jsem záměrně vynechal proces kontroly zásahu pouze v rozsahu délky válců jen proto, že jsem usiloval o jasnost. Chtěl jsem však zmínit ještě jeden bod, protože jsem zmínil, že rychlost byla primárním cílem.

V těchto výpočtech část, která zabere nejvíce času na zpracování, je výpočet druhé odmocniny. Trojrozměrný analog klasického 2D vzorce vzdálenosti stále vyžaduje druhou odmocninu. Abych ten čas oholil, neudělal jsem ten poslední krok a porovnal jsem čtverečky vzdáleností, spíše než samotné vzdálenosti. Stejné výsledky, jen rychlejší.

Uvědomuji si, že jsem úplně neodpověděl na původní otázku, ale pokud napíšete objekt, který provede tyto výpočty, a předáte mu objekt odrážky a cílový objekt, můžete získat stejné výsledky v obou směrech.


Odpověď 6:

V dávných dobách postava měla nebo je postavena na souboru, který má všechny atributy postavy. Většinou úrovně, například celkové zdraví, ale mohli byste být zraněni, nebo v určitém procentu a stále považováni za živého. Takže zásah kulkou nemusí vždy znamenat, že jste mrtví. Jelikož je na autorovi hry, aby určil, zda hráč zasažený kulkou do oblasti srdce nebo jiných oblastí určuje míru a typ poškození, nebylo by to u každé hry stejné. Myslím, že kulka nebo jakýkoli předmět, bomba, granát atd., Poskytují různé úrovně zdraví, podle toho, kde vás zasáhne, které se také mohou lišit. Každý objekt ve hře má význam, ať se pohybuje nebo nehýbe. Jak blízko jste tomu, vašemu X, YZ stavu ve hře. Střely X, Y, Z stav při každém průchodu snímku. Všechny tyto věci jsou neustále analyzovány. (Reálný čas). Nyní vidíte, proč tvorba hry není zdaleka tak jednoduchá jako textový procesor. Nepřátelé nebo hráči ve hře, ať už jste dobří nebo špatní, jsou neustále sledováni a zobrazováni v reálném čase u některých her s jejich úrovní zdraví. V některých hrách jste buď mrtví, nebo živí, například PacMan. U ostatních her můžete být na stupnici od 1 do 10 nebo od 1 do 100 atd. Mrtví nebo živí. Jiné předměty, i když ve skutečném životě by selhaly dlouho předtím, jako jsou auta, čluny, tanky atd., Dokonce i zbraně, mohou být zničeny nebo zraněny. Opravdu dobrá hra může mít zbraň, která se zasekává, přehřívá, zpomaluje, méně výkonný laser a tak dále, jak je používána a zneužívána. Čím složitější objekt vyrobíte, tím více musí hra věnovat sílu počítači, který hru hraje, takže musíte udržovat rovnováhu.

NYNÍ pamatujte, že jsem nikdy nenavrhoval ani nenapsal žádnou hru nebo herní software. Jen vybírám příklady z her při studiu, jak autor postavil hru.

Před mnoha lety měl letecký simulátor Chuck Yeager, napsaný pro DOS, ve složce hry řadu konfiguračních souborů. V jednom z nich měl pro každou hru vlastnosti každé roviny ve formátu prostého textu uloženého ve složce hry. Můžete je snadno upravit pomocí hexadecimálního editoru. Udělali jsme a byli jsme schopni navrhnout hru tak, aby vzlétla v letadle, a jakmile získala nadmořskou výšku, letěla vzad. Nyní to nemůžete udělat se skutečným letadlem. Ale bylo zábavné a velmi těžké létat na dlouhé vzdálenosti, ale byla to zábava! Myslím, že určité hry můžete také změnit konfigurační soubory, aby byla vaše postava nezničitelná. Aby vás nepřátelé nemohli zabít bez ohledu na to, jak moc vás zastřelili. To bylo mnohem zábavnější, ale pak si autoři brzy uvědomili tuto chybu a zakódovali všechny soubory, takže jste nenašli, jaké hodnoty změnit, abyste se stali nezničitelnými nebo nezničitelnými.


Odpověď 7:

Sam Lazarus to docela dobře vysvětlil (Well done Sam!), Nicméně to, jak je takový mechanik implementován, do značné míry závisí na hře.

Paprskové skenování je jedním z hlavních přístupů k získání řešení tohoto problému. Tato implementace byla provedena v mnoha starších hrách, které měly během hraní mnohem omezenější kapacitu pro výpočty. Některé další iterace tohoto typu jsou zahrnutí „políček“ pro vyrovnání zpoždění v hrách pro více hráčů a zdvojnásobení jako kolizní objekt (Klobouk dolů před osobou, která to zjistila!). Postupem času však vývojáři přicházeli s více a více zajímavými způsoby, jak to vyřešit.

Viděl jsem jednoho zaujmout přístup ke skenování zásahů, kde jakmile byl detekován zásah, provedl výpočet a určil pokles kulky. Výpočet byl překvapivě jednoduchý, ve 3D hře jsou dostupné rozměry X, Y a Z. V tomto případě, když sken detekoval zásah, by trvalo definovanou proměnnou „množství klesnout na přírůstek vzdálenosti“ a odečíst Z z definované proměnné.

V takovém případě mohou programátoři ke zlepšení prostředí vzít v úvahu následující proměnné: umístění počátku kulky, umístění zásahu objektu, vzdálenost, výška a čas. Typickým přístupem ke skenování zásahů je registrace pouze jako bod. V tomto případě je však pokles odrážek implementován prostřednictvím účtování o dalších proměnných. Některé mohou dokonce obsahovat proměnnou prostředí definovanou úrovní, na které je hráč, aby simulovaly vítr nebo jiné proměnné.

Jakkoli vám každý programátor může říci, že čím složitější je simulace, tím více zdrojů je potřeba k zajištění hladkého výsledku. Na chvíli si představte, že se snažíte začlenit velmi složitý výpočet, jako je pokles kulky ve starší online hře. V tomto scénáři hardware prostě nebyl připraven podporovat takovou akci. Více není vždy dobré a pokud jde o optimalizaci, tím více, co lze vynechat, bude lepší výkon.

Typicky s přístupem paprskového skenování se ve skutečnosti nevyrábí žádná kulka, je to „konečný“ výsledek obvykle jen dokončen spuštěním předdefinované možnosti pro entitu, která je zasažena. To je obvykle něco jako zvuk, obtisk nebo něco zajímavého jako výbuch. Zatímco nedostatek kulky vyráběné ve hře významně snižuje zdroje potřebné pro hru, ve skutečnosti to nezlomí ponoření kvůli tomu, jak rychle se pohybují (Zkuste sledovat pohybující se kulku jednou vystřelenou pouhýma očima).

Ve hrách, kde jsou zabudovány zabijácké kamery, které ukazují kulky, existují 3 přístupy, o kterých vím. Nejprve je nutné během této sekvence pouze vystřelit kulku v místě, kde se kamera bude otáčet, orientované směrem k „bodu“ zásahu, což je obvykle definováno středním rozsahem od střelce po cíl. To dává iluzi, že vystřelená kulka byla vystřelena, v tomto případě, i když to nebylo, stále si iluzi udržuje. Druhým je skutečně vytvořit kulku pokaždé, když je spuštěna spoušť ohně, jsem si jistý, že nemusím poukazovat na to, kolik odpadu to je pro zdroje. Zatímco některé hry to používají jako prodejní místo, vidím to jako kritiku, protože celková kvalita hry musí klesnout, aby takovou funkci podporovala. Třetí přístup k tomu je trochu zábavný a viděl jsem to jen ve starších hrách a několika novějších hrách. Skřítci, skřítci jsou bizarní mystická stvoření světa vývoje her. V tomto případě může být sprite (obrazový soubor, který je vždy obrácen přímo k fotoaparátu přehrávače) animovaný obraz, který se při zahájení zdá, že se buď zmenší do vzdálenosti animací, nebo se zmenší na základě ujeté vzdálenosti. Skřítci mohou být trochu nepříjemní, protože ve skutečnosti mohou vzít spoustu zdrojů v závislosti na tom, jak podrobně jsou. Skřítci se také v moderních hrách zřídka používají kvůli jejich omezenému použití.


Odpověď 8:

Jen vysvětlím, jak to funguje. K dispozici jsou 2 typy střel. Hitscan a projektil. Hitscan je v podstatě okamžitý laserový paprsek od zbraně po cokoli zasáhne a projektily mají trijectory.

HITSCAN (pro více hráčů)

Když kliknete na skutečnost, že jste klikli a kde se odesílá na server, server zkontroluje cestu a určí, zda narazíte na nepřítele nebo na povrch, a poté odešle rozhodnutý výsledek zpět klientovi / klientovi (vy hráči), což je poškozeného hráče nebo zasaženou plochu. To je důvod, proč někdy můžete vidět krev přicházející od nepřítele, ale on utrpěl poškození 0, a proto hráči cs chtějí 124 tick místo 64, tick je obnovovací frekvence za sekundu.

HITSCAN (pro jednoho hráče)

Přesně stejné jako pro více hráčů, ale nikdy nedojde k problému s rychlostí tikání (obnovovací frekvence).

Projektily jsou trochu komplikovanější, musíte posílat informace mezi klientem a serverem pro každé zaškrtnutí, že projektil stále letí vzduchem, obvykle mají také kulku a vše se počítá do trajektorie, která je zkontrolováno serverem v Multiplayeru nebo provedeno klientem v Singleplayeru.

Zpětný ráz je obvykle mezi 0 a množstvím a to je šířka kužele, do kterého mohou kulky dopadnout. Kužel začíná od kamery hráče a končí na povrchu nebo skyboxu. V csgo má však každá kulka nastavenou vektorovou vzdálenost od místa, kde jste začali stisknout klávesu ohně (pokud nepohybujete myší, v takovém případě se změní pozice začátku vzoru zpětného rázu). Vektor je „fantazijní“ způsob, jak říkat vzdálenost na ose X i Y od bodu.

Doufám, že jsem všechno vyjasnil.


Odpověď 9:

Obvykle existují dvě metody implementace fyziky kuliček ve videohře:

Hitscan: Toto využívá něco, co se nazývá, k určení, zda to, na co míříte, bude zasaženo projektilem. V zásadě motor uvidí, kam míří zbraň, nakreslí čáru ze zbraně až do bodu maximálního dosahu a uvidí, zda je v přímé viditelnosti nějaký jiný předmět. Pokud ano, řekne objektu, že byl „zasažen“ kulkou. Dalším vedlejším účinkem je to, že můžete vytvářet zbraně, které dokáží proniknout do více zbraní v řadě (jako je railgun v Quake) detekcí VŠECHNY objekty, které procházejí paprskem.

Mnoho her se rozhodlo použít tuto metodu, protože je rychle vypočítatelná a nevyžaduje vytvoření instance nového fyzického objektu. Výpočet se provádí okamžitě (pokud začneme zohledňovat rychlost střely, pak se cíl mohl v tomto bodě pohnout), takže mezi okamžikem, kdy vystřelíte ze zbraně, a poté, co cíl dostane poškození, není čas na cestu. Odhozené paprsky jsou rovné a nenapodobují skutečné kulky. Aby to kompenzovali, mohou programátoři přidávat náhodné odchylky ve směru „realismu“ (zpětný ráz, vítr, gravitace atd.)

Příklady her využívajících toto: Call of Duty, Halo, dřívější hry Battlefield atd.

Balistika střely:

V této metodě herní engine ve skutečnosti vytváří novou síť ve světě hry s vlastní hmotou. To dodá střele vlastní rychlost a velikost, kterou bude motor sledovat. Jak se kulka pohybuje (potenciálně s plnou simulací externí balistiky), může programátor logicky přidat to, co se stane, když zasáhne objekt. Je to mnohem realističtější simulace střely. Ale programování může být obtížné a ke kódování takové fyziky v herním enginu je zapotřebí skutečných techniků. Také proto, že každá kulka je vytvářena a simulována motorem, je to pro systém zdanění. To je důvod, proč hry jako Arma vyžadují špičkové systémy, které simulují kulky nejen hráče, ale také spojenců AI a nepřátel.

Hry využívající Projectile Ballistics:

Arma, PuBG, franšíza Sniper Elite, Sniper Ghost Warrior. Z toho, co jsem shromáždil, používá Battlefield základní systém přístupu balistické střely pro své odstřelovače.


Odpověď 10:

Většina odpovědí zde souvisí s grafikou a tím, jak casting paprsků ovlivňuje modelování. I když je to určitě dobrý přístup, rád bych se držel pouze designu základní třídy a základů OOP.

Chtěl bych modelovat strukturu mé třídy tak, aby každý nepřátelský jedinec / zeď byl objekt, který bere v úvahu, co se stane, když je zasažena kulka. Spíše než kulka, která skutečně zasáhne nepřítele z pohledu Kulka.

Představte si následující třídy: (na abstraktní úrovni)

třída Směr {double x; dvojité y; dvojité z; }

třída Pozice {double x; dvojité y; dvojité z;}

třída Bullet {dvojnásobná rychlost; Směr d; Pozice p; bool událost OnBullet (poloha, směr); }

třída Nepřítel {Pozice p; int zdraví; událost OnEnemyHit (pozice); }

Nyní bude skutečná funkce obsahovat Nepřátele, Kulky, Stěny atd., Bude také obsahovat EventHandlers, kteří zkontrolují, zda existuje nějaká křižovatka Nepřátelé a Kulky / Stěny a Kulky.

scénář třídy {Enemy e; Kulka b; atd… }

Abychom tedy mohli odpovědět na vaši otázku, ani nepřátelé nekontrolují, zda je zasáhly kulky, ani kulky, zda zasáhnou nepřátele. Scénář kontroluje průniky a jak nepřátelé, tak kulky mohou mít ve svých třídách definované události.

Třída scénáře má samozřejmě dynamické seznamy / pole, která se postarají o více instancí objektů.


Odpověď 11:

Z výpočetního hlediska by bylo snazší, aby hráč zkontroloval, zda jsou zasaženi. Odrážek je spousta a přiřadit objekty pro každou odrážku by znamenalo spoustu výpočetních zdrojů. Kužel často reprezentoval výstřel, který je v některých případech levnější než vytváření desítek čar představujících střely vystřelené z automatické zbraně. Používá se to však ve hrách, kde se cesta kulek na obrazovku nedostala. Pro ty, kteří to dělají, by bylo nutné vytvořit liniový objekt.

Výpočetní průsečík objektů je velmi rychlý a protože kulky jsou považovány za real-time (protože byly považovány za rychlejší než pohyb hráče), je výpočetně levnější neinicializovat kulky, ale spíše instanci hráče, který zkontroluje, zda se protíná s vystřeleným kuželem . A pokud se kužel skutečně protíná s hlavou a mění vlastnost výstřelu do hlavy.