kako zadiviti bulelete nanose štetu jedinstvu


Odgovor 1:

Zanima me ovdje da dam nekoliko primjera za različite vrste igara. Drugi već spomenuti koliko je ova vrsta problema zapravo zanimljiva.

Za žanr "Bullet Hell", nešto poput vertikalnih / vodoravnih pucačina poput Geometry Wars ili Touhou igara. Sama igra je dizajnirana da ima toliko puno metaka koji ispunjavaju zaslon, a sama igra radi u stvarnom vremenu pokušavajući održati 60 FPS. Za ovu vrstu igre nije lijepo imati logiku sudara na svakom metku. Budući da će istodobno postojati stotine metaka i ako svaki metak provjeri za sebe, nema dovoljno vremena da sam procesor provjeri sve metke. U ovom je slučaju bolje postaviti logiku otkrivanja sudara na svaki važan objekt na koji će utjecati navedeni sudar, na primjer igrač (ili neprijatelj). Ako tada provjerimo samo igrača, značajno smanjujemo broj provjera sudara. Koju god smo metodu ovdje koristili, u redu je ako smanjimo vremensku složenost.

Postoje i druge igre koje trebaju sofisticirane provjere sudara. Na primjer, Angry Birds. Svi objekti na zaslonu mogu međusobno komunicirati. Ptice mogu pogoditi kutiju, kutija može pogoditi drugu kutiju, ili stupove, ili eksplodirati, itd. U ovom primjeru igra je podžanr fizičke simulacije. Jer moramo provjeriti sve predmete i nema drugog načina. Zatim moramo osmisliti arhitekturu ili modele provjere kako bismo učinkovito obradili sve objekte. Izuzetno učinkovit algoritam bio je poznat kao AABB (Axis Aligned Bounding Box). Budući da je to standardni algoritam (poput raycastinga u FPS-u), obično postoje knjižnice za to kako bi se izbjeglo ponovno otkrivanje kotača. Na primjer, Box2D je takva knjižnica. Postoje i slučajevi kada ste za algoritam morali koristiti određene strukture podataka. Objekt Quadtree takav je primjer za 2D strukturu prostornih podataka. To omogućuje brže pretraživanje i indeksiranje objekata prilikom provjere sudara.

Zatim, nisu sve igre trebale složenu logiku. Ne trebamo koristiti bazuku kako bismo stavili čavao. Kao, na primjer, u nekim borbenim igrama bilo 2D ili 3D, lik može pucati u metke. Zamislite da Ryu radi Hadouken, u to vrijeme postoje samo 3 objekta. Jednostavna provjera graničnog okvira za prekrivanje dovoljna je za takvu situaciju.

Postoje i igre koje ne koriste fizičke projektile, ali im je i dalje potreban mehanizam za otkrivanje sudara. Na primjer, u Doti 2 bilo je jako teško stvoriti cjelovite fizičke modele u kojima svaki objekt može u stvarnom vremenu komunicirati u okruženju za više igrača. U ovom slučaju, projektili često ne trebaju biti realni i pokoravati se fizičkim zakonima. Standardne strelice u Doti 2 ne slijede ravnu crtu, već slijede cilj. To čini izračune malo "lakšim" za obradu, jer je zajamčeno da će se sudariti od početka, jer će slijediti cilj. Postoji i više "priglupih" slučajeva kako bi bilo manje realno, kao što se standardni projektili ne sudaraju, više snopova područja efekata jer će samo provjeravati granice. Dakle, ako nije moguće napraviti složenu logiku, možete promijeniti način igre. Sve dok su razlog i ponašanje dosljedni, igrač je u redu s tim. Čak se može smatrati značajkom.

I na kraju, jer je to igra, možemo sami odrediti svoje pravilo. Češće označene metke ne treba provjeravati za sve piksele ili čestice ili teksture koje imaju. Uzmimo primjer klasičnog Mario Bros-a. Pri provjeri da li se Mario sudara s objektima, nisu provjerili sa savršenstvom piksela. Oni samo koriste jednostavne granice pravokutnika, ali oni se ne prikazuju na zaslonu. Ista stvar vrijedi i za FPS. U stvarnom vremenu nema pravih metaka. Postoje samo specijalni efekti i animacija, ali stvarna provjera sudara izvršena je pomoću raycast-a koji nije fizički metak. Uzmimo primjer poput pucanja iz mitraljeza, nismo ispalili stotine metaka odjednom, već smo umjesto toga napravili jedan zračni udar, a zatim primijenili efekt kao da je iz stotina metaka. Ovo također smanjuje broj provjera sudara. Bombe također rade isto, ne rasipaju stvarne fragmente.

U osnovi pojednostavljujemo stvari kad god možemo i smanjujemo složenost.


Odgovor 2:

Kratki odgovor je: U kodu igre nije važno tko provjerava pogodak, ali ključno je mjesto gdje se taj kod provjerava.

Dugi odgovor:

Ovisi o tome kako igra odlučuje tko vrši provjeru. Na primjer, neke igre imaju poslužitelj da izvrši ovu provjeru, koja se naziva "otkrivanje pogodaka", o čemu su drugi već raspravljali u ovoj niti odgovora (npr. Rasprava o bačenom zraku Sama Lazara).

HD napravljen na klijentskoj strani znači "najbrža pobjeda veze". Pretpostavimo da igrači A i B obojica pucaju glavom u vrijeme X. Paket koji šalje informaciju "Ubio sam drugog igrača" doći će do poslužitelja različitim brzinama. Tada igra mora odlučiti hoće li

  1. Prvo će omogućiti najbrži paket.
  2. Omogućit će vremensko razdoblje za koje "nije važno tko prvi stigne".

Dakle, jedan od dva ishoda: ili jedan od igrača pada, ili oba igrača padaju.

Ako se to učini na strani poslužitelja, svi igrači šalju vjerojatno informaciju "Pucao sam u smjeru na ovom položaju". Poslužitelj zatim uzima informacije i radi zbirku "svega što se dogodilo u ovom trenutku" i odlučuje, a zatim šalje velik broj informacija o "trenutnoj situaciji trenutno" na uređaj za reprodukciju. Zamislite da se ovo događa možda 10 ili 30 ili 60 puta u sekundi.

Ishod ovdje ovisi o igri, brzini vaše veze s poslužiteljem i hardveru na kojem poslužitelj igre radi, tako da nema jasnog i jednostavnog odgovora. Ako je igra dovoljno optimizirana, moguće je vidjeti dvostruki KO, ako igra to dopušta, ali to ovisi o igri.

Vodi do najkraćeg odgovora: ovisi o tome kako igra vidi otkrivanje pogotka.


Odgovor 3:

Ovisi o igri. To se naziva "otkrivanjem pogodaka", a način na koji se to radi može imati velik utjecaj na igru.

Postoje dvije vrste otkrivanja pogodaka; strana klijenta i strana poslužitelja. Unutar toga, otkrivanje pogodaka na strani klijenta može biti strijelac ili meta, iako se ne mogu sjetiti niti jednog primjera gdje se koristi otkrivanje pogotka ciljane strane (vjerojatno zato što bi to hakeri mogli zloupotrijebiti, kao i stvoriti probleme s latencijom).

Otkrivanje pogodaka na strani klijenta najpopularnije je među igrama. U ovoj situaciji, kada pucate u pušku, računalo izračunava putanju metka i utvrđuje pogađa li neprijatelja. Ako se dogodi, vaša igra šalje te podatke poslužitelju govoreći "Udario sam ovog neprijatelja zbog ovolike štete".

Prednost otkrivanja pogodaka na strani klijenta je u tome što to manje opterećuje poslužitelj. Ako na poslužitelju imate 10 igrača, to je potencijalno tisuće metaka ispaljenih svake sekunde. Stavljanje tih izračuna na klijentsku stranu sprečava poslužitelj od preopterećenja i zaostajanja.

Mana je što postoji zastoj između poslužitelja i klijenta. Možda ćete na svom kraju vidjeti neprijatelja i ustrijeliti ga, ali zbog latencije taj neprijatelj zapravo nije bio tamo. Na neprijateljskom kraju bit će upucani iza zaklona. Postoje dva načina da se to riješi; kompenzacija zaostajanja u kodu igre ili otkrivanje pogodaka na strani poslužitelja.

Otkrivanje pogodaka na poslužitelju također može biti problematično u situacijama velike kašnjenja jer možete nekoga vidjeti i pucati, ali vaši se pogoci ne registriraju jer se ideja poslužitelja o tome gdje je neprijatelj ne poklapa s vašom igrom zbog kašnjenja. To može značiti da zapravo morate voditi snimke kako biste nadoknadili kašnjenje poslužitelja.

Većina igara ima vrlo složen mrežni kod koji pomaže u izbjegavanju ovih problema. Neke igre, poput Battlefield 1, čak se prebacuju između različitih vrsta otkrivanja pogodaka, ovisno o brzini veze igrača.


Odgovor 4:

Ovo je stvarno dobro pitanje! Uspjeli ste nesvjesno pogoditi temu koja je ključna ne samo za dizajn igara, već i za programiranje općenito. Odgovor na vaše specifično pitanje je da to u potpunosti ovisi o načinu na koji je programer odlučio strukturirati igru, ali zaronimo dublje u to.

U većini pokretača igara logični je tok strukturiran tako da se, kada se metak ispali, izvede izbacivanje zraka. Zasun zračenjem znači da je linija povučena od točke vatre i provode se provjere sudaraju li se neki modeli s tom linijom ili zrakom. Kada se otkrije sudar, signal se šalje svim modelima s kojima se zraka sudara, a oni su zaduženi za pružanje logike za suočavanje s metkom koji se sudara s njima. (Na primjer, zid možda neće učiniti ništa, dok bi igrač nanio štetu.)

U drugim se igrama modelira stvarna putanja leta metka, a na metke utječe gravitacija i vrijeme putovanja. Da bi se to riješilo, sam metak može biti odgovoran za odlučivanje o tome kako će se kretati, a onda će logika za interakciju metka sa stvarima biti jače povezana s metkom.

U konačnici, ovo je pitanje koje se često događa tijekom programiranja, a vi ste postavili pitanje koje si mnogi programeri redovito postavljaju: „Kako bi lijepo stvorili sustav koji želim modelirati, gdje pripada svaki dio logike , i s kojim elementom mog sustava treba biti povezan. " To je često složena arhitektonska odluka i jedan je od mnogih izazova zbog kojih programiranje postaje manje znanost, a više umjetnost.


Odgovor 5:

Prošlo je mnogo vremena otkako sam napisao bilo koji kôd za video igre, pa se stanje tehnike možda promijenilo (i vjerojatno se promijenilo), ali primarni cilj svih igara u stvarnom vremenu nije: mora biti brz kao moguće.

Da bih to postigao, modelirao sam metak kao putovanje u ravnoj liniji. Za većinu situacija na bojnom polju ovo je razumna aproksimacija. Ako ste pokušavali modelirati snajperski metak velikog dometa, možda ćete morati uzeti u obzir vjetar i pad, ali to su minimalni čimbenici, a bez puno bržih procesora (koje danas imamo) to nije bilo praktično, barem u mom dan.

Ljudsko je tijelo, međutim, složenog oblika, pa sam ga razgradio u fazama. U prvoj fazi igrač sam modelirao kao cilindar. Okomita crta na položaju, visini i radijusu igrača su sve potrebne informacije. Odatle je jednostavno pronaći udaljenost od središta igrača do linije koju metak putuje. Studenti geometrije sjetit će se da se udaljenost uvijek mjeri pod pravim kutom, kako bi se dobila najmanja moguća udaljenost. Ta se udaljenost zatim uspoređuje s radijusom slike. Ako je udaljenost veća od radijusa, metak je promašio igrač i ne treba poduzimati daljnje radnje.

Ako je udaljenost manja od radijusa, morate prijeći na fazu 2, u kojoj je svaki dio tijela predstavljen kao cilindar (ili kugla, u slučaju glave) Ne možete pretpostaviti da je metak pogodio nešto na tijelu; možda je prošlo, na primjer, bezazleno između nogu. Provjerite udaljenost od linije metka do crte cilindra za svaki dio tijela i postižete pogodak ako je ta udaljenost manja od radijusa cilindra. (Ili polumjer kugle, u slučaju glave)

Prvo bih provjerio glavu pretpostavljajući da bi hitac u glavu bio smrtonosan i ne bih morao trošiti obradu pokušavajući otkriti je li isti metak, na primjer, također prodro u ruku.

Znam da je ovo donekle pojednostavljeno: na primjer, namjerno sam izostavio postupak provjere pogotka samo u rasponu duljine cilindara samo zato što sam težio jasnoći. Međutim, postoji još jedna točka koju sam želio istaknuti, jer sam spomenuo da je brzina primarni cilj.

U tim izračunima dio koji treba najviše vremena obrade je izračun kvadratnog korijena. Trodimenzionalni analog klasične formule 2D udaljenosti i dalje zahtijeva kvadratni korijen. Da bih obrijao to vrijeme, jednostavno nisam učinio taj zadnji korak i usporedio sam kvadrate udaljenosti, a ne same udaljenosti. Isti rezultati, samo brži.

Shvaćam da nisam u potpunosti odgovorio na izvorno pitanje, ali ako napišete objekt koji će izvršiti ove izračune i proslijedite mu metku objekt i ciljni objekt, možete dobiti iste rezultate u bilo kojem slučaju.


Odgovor 6:

U davna vremena lik ima ili je izgrađen na datoteci koja ima sve atribute lika. Većina puta je razina, kao što je cjelokupno zdravlje, ali mogli biste biti ranjeni ili u određenom postotku i dalje biti smatrani živima. Pogođen metkom ne znači uvijek da ste mrtvi. Budući da je na autoru igre da utvrdi određuje li igrač koji je metak pogodio u područje srca ili druga područja, visinu i vrstu oštećenja, to ne bi bilo isto za svaku igru. Pretpostavljam da metak ili bilo koji predmet, bomba, granata itd. Pružaju različite razine zdravlja, ovisno o tome gdje vas pogodi, koje također mogu varirati. Svaki objekt u igri ima značaj, kreće se ili se ne kreće. Koliko ste mu blizu, vaš X, YZ status u igri. Oznake X, Y, Z status pri svakom prolazu kadra. Sve se te stvari neprestano analiziraju. (Stvarno vrijeme). Sada vidite zašto izrada igre nije ni približno tako jednostavna kao procesor teksta. Neprijatelji ili igrači u igri, bilo vaš dobar ili loš momak, uvijek se neprestano skeniraju i prikazuju u stvarnom vremenu na nekim igrama njihove razine zdravlja. Na nekim igrama, ili mrtvi ili živi, ​​poput PacMana. Za ostale igre na skali od 1 do 10 ili 1 do 100 itd. Biti mrtvi ili živi. Drugi predmeti, iako bi u stvarnom životu propali mnogo prije, poput automobila, čamca, tenkova itd., Čak i oružje, mogu se uništiti ili raniti. Stvarno dobra igra može imati oružje koje zaustavlja, pregrijava, usporava, manje je snažan laser i tako dalje kada se koristi i zlostavlja. Što složenije izrađujete predmet, to više igra mora posvetiti moći računala koje igra igru, tako da morate održavati ravnotežu.

SADA zapamtite da nikada nisam dizajnirao niti napisao bilo kakvu igru ​​ili softver za igre. Upravo vadim primjere iz igara proučavajući kako je autor gradio igru.

Prije mnogo godina, simulator leta Chuck Yeager, napisan za DOS, u mapi s igrama imao je niz konfiguracijskih datoteka. U jednom od njih za svaku igru, imale su karakteristike svake ravnine, u običnom tekstualnom formatu pohranjenom unutar mape igre. Možete ih lako izmijeniti, pomoću hex uređivača. Dizajnirali smo i mogli dizajnirati igru ​​za polijetanje u avionu, a čim bi stekla visinu, letjela bi unatrag. Sada to ne možete učiniti pravim avionom. Ali bilo je zabavno i vrlo teško letjeti na velike daljine, ali bilo je zabavno! Mislim da biste u određenim igrama mogli izmijeniti i konfiguracijske datoteke kako biste svoj lik učinili neuništivim. Tako da vas neprijatelji ne bi mogli ubiti bez obzira koliko vas upucali. To je bilo hrpa zabave, ali onda su autori ubrzo shvatili tu pogrešku i kodirali sve datoteke tako da niste mogli pronaći vrijednosti koje biste promijenili kako biste postali neuništivi ili neuništivi.


Odgovor 7:

Sam Lazarus je to prilično dobro objasnio (Bravo Sam!), No kako će takva mehanika biti primijenjena uvelike ovisi o igri.

Skeniranje zraka je jedan od najvažnijih pristupa struje za dobivanje rješenja za to. Ova implementacija izvršena je u mnogim starijim igrama koje su imale puno ograničeniji kapacitet za izračun tijekom igranja. Neke druge iteracije su uključivanje "pogođenih okvira" za nadoknađivanje zaostajanja u igrama za više igrača i udvostručene kao sudar (Kapa dolje osobi koja je to smislila!). No kako je vrijeme prolazilo programeri su smišljali sve zanimljivije načine kako to riješiti.

Vidio sam kako je jedan pristup pristupio skeniranju pogotka, kada je jednom otkriven pogodak napravio proračun kako bi utvrdio pad metka. Iznenađujuće je izračun bio jednostavan, u 3D igri dostupne su dimenzije X, Y i Z. U ovom slučaju kada bi skeniranje otkrilo pogodak, uzela bi definiranu varijablu "količine koja pada po koraku udaljenosti" i oduzela Z iz definirane varijable.

U ovom slučaju programeri mogu uzeti u obzir sljedeće varijable kako bi poboljšali iskustvo: Mjesto podrijetla metka, Položaj objekta pogotka, Udaljenost, Visina i Vrijeme. Tipično je pristup skeniranju pogotka registriranje samo kao točke. Međutim, u ovom se slučaju ispuštanje metaka provodi računovodstvom dodatnih varijabli. Neki čak mogu sadržavati ambijentalnu varijablu definiranu razinom na kojoj je igrač za simuliranje vjetra ili drugih varijabli.

Međutim, kao što vam svaki programer može reći što je složenija simulacija, potrebno je više resursa kako bi se osigurao nesmetan rezultat. Zamislite na trenutak da pokušate ugraditi vrlo složen izračun, poput pada metka u starijoj online igri. U tom scenariju hardver jednostavno nije bio spreman podržati takvu akciju. Više nije uvijek dobro, a što se tiče optimizacije, više se toga može izostaviti, što se tiče boljih performansi.

Tipično s pristupom zračnom skeniranju zapravo se ne generira metak, njegov se "krajnji" rezultat obično samo dovršava pokretanjem unaprijed definirane opcije za entitet koji je pogođen. To je obično nešto poput zvuka, naljepnice ili nečeg zanimljivog poput eksplozije. Iako nedostatak metka proizvedenog u igri znatno smanjuje resurse potrebne za igru, zapravo ne prekida uranjanje zbog brzine putovanja (pokušajte gledati putujući metak jednom ispaljen golim očima).

U igrama u kojima su ugrađene kamere za ubijanje koje pokazuju metke, postoje 3 pristupa ovome za koja znam. Prvo je izliječiti metak samo tijekom tog niza na mjestu na kojem će se kamera okretati orijentirano prema "točki" pogotka, što se obično definira srednjim rasponom od strijelca do cilja. To daje iluziju da je iznjedreni metak ispaljen, u ovom slučaju, iako nije, još uvijek održava iluziju. Drugo je da se zapravo stvori metak svaki put kad se pokrene okidač, siguran sam da ne trebam isticati koliki je ovo otpad za resurse. Iako neke igre ovo koriste kao prodajnu točku, ja to vidim kao ometač jer ukupna kvaliteta igre mora pasti da bi podržala takvu funkciju. Treći pristup ovome je pomalo smiješan i to sam vidio samo u starijim igrama i nekoliko novijih igara. Spriteovi, spritovi bizarna su mistična bića svijeta razvoja igara. U ovom slučaju, sprite (slikovna datoteka koja je uvijek okrenuta izravno prema kameri playera) može biti animirana slika koja se prilikom pokretanja čini da se animacija smanjuje u daljinu ili smanjuje na temelju pređene udaljenosti. Spriteovi mogu biti pomalo nesigurni, jer zapravo mogu uzeti puno resursa, ovisno o tome koliko su detaljni. Spriteovi se također rijetko koriste u modernim igrama zbog njihove ograničene upotrebe.


Odgovor 8:

Samo ću objasniti kako to funkcionira. Postoje 2 vrste metaka. Hitscan i projektil. Hitscan je u osnovi trenutni lazer iz zraka iz puške u sve što pogodi, a projektili imaju usmjerenost.

HITSCAN (više igrača)

Kada kliknete činjenicu da ste kliknuli i gdje se šalje na poslužitelj, poslužitelj provjerava putanju i utvrđuje udarate li neprijatelja ili površinu, a zatim šalje odlučeni rezultat natrag klijentu / klijentu (vi igrač), tj. oštećeni igrač ili pogođena površina. Zbog toga ponekad možete vidjeti krv koja dolazi od neprijatelja, ali on je nanio 0 štete i zato cs igrači žele 124 tiketa umjesto 64, tik je stopa osvježavanja u sekundi.

HITSCAN (za jednog igrača)

Potpuno isto kao i za više igrača, ali nikad neće biti problema sa brzinom tiketa (brzinom osvježavanja).

Projektili su malo kompliciraniji, morate slati informacije naprijed-natrag između klijenta i poslužitelja za svaki tik da projektil još uvijek leti zrakom, obično imaju i metke i sve se to izračunava u putanji koja je provjereno od strane poslužitelja u Multiplayeru ili izvršeno od strane klijenta u Singleplayeru.

Odmak je obično između 0 i iznosa, a to je širina konusa u koji meci mogu sletjeti. Konus započinje od kamere igrača i završava na površini ili nebu. Međutim, u csgo-u svaki metak ima postavljenu vektorsku udaljenost od mjesta na kojem ste počeli pritiskati vatrogasnu tipku (ako ne pomaknete miša, u tom se slučaju mijenja položaj početka uzorka uzmaka). Vektor je "fensi" način kazivanja udaljenosti na osi X i Y od točke.

Nadam se da sam sve raščistio.


Odgovor 9:

Obično postoje dvije metode za implementaciju fizike metaka u videoigru:

Hitscan: Ovo koristi nešto što se zove kako bi se utvrdilo hoće li ono što ciljate biti pogođeno projektilom. U osnovi, motor će vidjeti kamo pištolj cilja, povući crtu od pištolja do neke točke najvećeg dometa i vidjeti je li neki drugi predmet u vidnom polju. Ako je odgovor da, reći će objektu da je pogođen metkom. Druga je nuspojava toga što možete stvoriti oružje koje može prodrijeti kroz više oružja u nizu (poput tračnice u Quakeu) otkrivanjem SVIH objekata koji prelaze zraku.

Mnoge igre odlučuju se koristiti ovu metodu jer se brzo izračunava i ne zahtijeva instanciranje novog fizičkog objekta. Proračun se vrši trenutno (ako počnemo računati na brzinu metka, tada se meta možda pomaknula u toj točki), tako da nema vremena putovanja između pucanja iz puške i trenutka kada meta primi štetu. Zrake koje se bacaju ravne su i ne oponašaju prave metke. Da bi to nadoknadili, programeri mogu dodati slučajna odstupanja u smjeru za "realizam" (odboj, vjetar, gravitacija itd.)

Primjeri igara koje koriste ovo: Call of Duty, Halo, Ranije Battlefield igre itd.

Balistika projektila:

U ovoj metodi, mehanizam igre zapravo stvara novu mrežu u svijetu igre s vlastitom masom. To će metku dati vlastitu brzinu i veličinu koju će motor pratiti. Kako se metak kreće (potencijalno uz potpunu vanjsku simulaciju balistike), programer može dodati logiku onome što se događa kad udari u objekt. To je puno realnija simulacija metka. Ali programiranje može biti teško i potrebni su stvarni inženjeri koji će takvu fiziku kodirati u mehanizam igre. Također, budući da svaki metak kreira i simulira motor, on oporezuje sustav. Zbog toga igre poput Arme zahtijevaju vrhunske sustave koji simuliraju metke ne samo igrača već i AI saveznika i neprijatelja.

Igre koje koriste balistiku projektila:

Arma, PuBG, Sniper Elite franšiza, Sniper Ghost Warrior. Prema onome što sam prikupio, Battlefield koristi osnovni sustav balističkog pristupa projektila za svoje snajpere.


Odgovor 10:

Pa, većina odgovora ovdje odnosi se na grafiku i na to kako lijevanje zrakama utječe na modeliranje. Iako je to definitivno dobar pristup, volio bih se pridržavati samo osnovnog dizajna klase i osnova OOP-a.

Volio bih oblikovati strukturu svoje klase na način da je svaki neprijateljski pojedinac / zid objekt koji uzima u obzir ono što se događa kad je metak pogođen. Umjesto da metak zapravo pogodi neprijatelja iz perspektive metka.

Zamislite sljedeće satove: (na apstraktnoj razini)

klasa Smjer {double x; dvostruko y; dvostruki z; }

klasa Pozicija {double x; dvostruko y; dvostruko z;}

klasa Metak {dvostruka brzina; Smjer d; Položaj p; bool događaj OnBullet (položaj, smjer); }

razred Neprijatelj {Položaj p; int zdravlje; događaj OnEnemyHit (Pozicija); }

Sad će stvarna funkcija sadržavati neprijatelje, metke, zidove itd., Sadržavat će i EventHandlere koji će provjeriti postoji li sjecište neprijatelja i metaka / zidova i metaka.

scenarij razreda {Neprijatelj e; Metak b; itd ...}

Dakle, da bismo odgovorili na vaše pitanje, niti neprijatelji provjeravaju jesu li ih meci pogodili, niti meci provjeravaju jesu li pogodili neprijatelje. Scenarij provjerava raskrižja, a i neprijatelji i / ili meci mogu imati događaje definirane u svojim klasama.

Klasa scenarija naravno ima dinamičke popise / nizove za brigu o više instanci objekata.


Odgovor 11:

S računskog gledišta, bilo bi lakše da igrač provjeri jesu li pogođeni. Metaka ima u izobilju i dodjeljivanje objekata za svaki metak bilo bi puno računarskih resursa. Često se konusni objekt koristi za predstavljanje hica, što je u nekim slučajevima jeftinije od stvaranja desetaka linija koje predstavljaju metke iz automatskog topa. Međutim, ovo se koristi u igrama u kojima putanja metaka nije uvučena u zaslon. Za one koji to rade bilo bi potrebno stvoriti linijski objekt.

Računalno presijecanje objekata vrlo je brzo, a budući da se meci smatraju u stvarnom vremenu (jer se smatralo bržim od kretanja igrača), računski je jeftinije ne instancirati metke, već instancirati igrača koji provjerava siječe li se s konusom metka . A ako se konus zapravo presijeca s glavom i promijeni svojstvo snimke glave.