буллеттерді қалай оятуға болады, бұл бірлікке нұқсан келтіреді


жауап 1:

Мен мұнда әр түрлі ойын түрлеріне бірнеше мысалдар келтіруге қызығып отырмын. Басқасы проблеманың бұл түрінің қаншалықты қызықты екенін айтып өтті.

«Bullet Hell» жанры үшін геометриялық соғыстар немесе Touhou ойындары сияқты тік / көлденең атқыштар сияқты. Ойынның өзі экранды толтыратын көптеген оқтарға ие болу үшін жасалған және ойын 60 FPS ұстап тұру үшін нақты уақытта жұмыс істейді. Ойынның бұл түрі үшін әр оқта соқтығысу логикасын орналастырған ұнамайды. Бір уақытта жүздеген оқтар болады және егер әр оқ өзін тексерсе, онда барлық оқтарды тексеруге процессордың өзі жетіспейді. Бұл жағдайда соқтығысу логикасын осы соқтығысу әсер ететін әрбір маңызды объектіге орналастырған дұрыс, мысалы ойыншы (немесе жау). Егер біз тек ойнатқышты тексеретін болсақ, соқтығысу санын айтарлықтай азайтамыз. Біз мұнда қандай әдісті қолдандық, егер уақыттың күрделілігін төмендететін болсақ.

Соқтығысты тексеруді қажет ететін басқа да ойындар бар. Мысалы, ашулы құстар. Экрандағы барлық объектілер бір-бірімен әрекеттесе алады. Құстар қорапқа соғыла алады, қорап басқа қорапқа немесе полюстерге соғылуы немесе жарылуы мүмкін, т.с.с. Бұл мысалда ойын физика модельдеудің суб жанры болып табылады. Біз барлық нысандарды тексеруіміз керек және басқа амал жоқ. Содан кейін біз барлық нысандарды тиімді өңдеу үшін тексеру архитектурасын немесе модельдерін ойлап табуымыз керек. Белгілі бір тиімді алгоритм AABB (Axis Aligned Bounding Box) деп аталды. Бұл стандартты алгоритм болғандықтан (мысалы, FPS-тегі растрастинг), дөңгелекті қалпына келтіруге жол бермейтін кітапханалар бар. Мысалы, Box2D - осындай кітапхана. Алгоритм үшін нақты деректер құрылымдарын қолдануға тура келетін кездер де болады. Quadtree объектісі - бұл 2D кеңістіктік мәліметтер құрылымы үшін мысал. Бұл соқтығысуды тексерген кезде объектілерді жылдам іздеу мен индекстеуге мүмкіндік береді.

Сонымен қатар, барлық ойындарға күрделі логика қажет емес еді. Бізге тырнақ қою үшін базуканы қолданудың қажеті жоқ. Мысалы, мысалы 2D немесе 3D жекпе-жек ойындарында кейіпкер оқ атуы мүмкін. Рюдің Хадоукенді жасап жатқанын елестетіп көріңіз, сол уақытта тек 3 нысан бар. Осындай жағдай үшін қарапайым қабаттасудың шектегіш құтысы жеткілікті.

Сонымен қатар физикалық снарядтарды қолданбайтын, бірақ соқтығысуды анықтайтын қозғалтқыш қажет болатын ойындар бар. Мысалы, Dota 2-де кез-келген объект көп уақытты ортада нақты уақыт режимінде өзара әрекеттесе алатын толық физикалық модельдер құру өте қиын болды. Бұл жағдайда көбінесе снарядтар шынайы болып, физикалық заңдарға бағынуды қажет етпейді. Dota 2 стандартты көрсеткілері түзу сызық бойынша жүрмейді, керісінше мақсатқа сәйкес келеді. Бұл есептеулерді өңдеуді сәл «жеңілдетеді», себебі ол басынан соқтығысуға кепілдік берді, өйткені ол мақсатқа сәйкес келеді. Мұны шындыққа сәйкес келмейтін бірнеше «мылқау» жағдай бар, мысалы, стандартты снарядтар соқтығыспайды, бірнеше Effects Area стектері, өйткені олар тек шекараларды тексереді. Сонымен, егер күрделі логиканы жасау мүмкін болмаса, сіз өзіңіздің геймплейіңізді өзгерте аласыз. Себеп пен мінез-құлық сәйкес болғанша, ойыншы оған жақсы. Мұны тіпті ерекшелік деп санауға болады.

Ақырында, бұл ойын болғандықтан, біз өз ережемізді жасай аламыз. Көбінесе тексерілген таңбаларды әрбір пиксель немесе бөлшектер немесе текстуралар үшін тексеру қажет емес. Классикалық Mario Bros мысалын алыңыз, Марионың заттармен соқтығысқанын тексергенде, олар пиксельдің мінсіздігімен тексерген жоқ. Олар тек төртбұрыштың қарапайым шекараларын пайдаланады, бірақ бұл экранда көрсетілмейді. Дәл осы нәрсе FPS-ке қатысты. Нақты уақытта нақты оқтар жүрмейді. Тек арнайы эффекттер мен анимациялар бар, бірақ нақты соқтығысуды тексеру физикалық оқ емес рейкаст көмегімен жүргізілді. Автоматтан оқ ату сияқты мысал келтіріңіз, біз бірден жүздеген оқ атқан жоқпыз, керісінше бір рейкаст жасаймыз, содан кейін біз эффектіні жүз оқтан болған сияқты қолданамыз. Бұл сонымен қатар соқтығысуды тексеру санын азайтады. Бомбалар да бірдей жұмыс істейді, ол нақты фрагменттерді таратпайды.

Негізінде біз мүмкіндігінше заттарды жеңілдетіп, күрделілігін төмендетеміз.


жауап 2:

Қысқа жауап: Ойын кодында соққыны кім тексеретіні маңызды емес, бірақ бұл код тексерілетін жерде маңызды.

Ұзақ жауап:

Бұл ойынның тексеруді кім жасайтынына байланысты. Мысалы, кейбір ойындарда серверде «соққыларды анықтау» деп аталатын бұл тексеріс бар, оны басқалар осы жауап жолында талқылады (мысалы, Сэм Лазардың сәулесін талқылау).

Клиенттік жағынан жасалынған HD «ең жылдам байланыс жеңеді» дегенді білдіреді. А және В ойыншыларының екеуі де Х уақытта бір-біріне бас салады делік. «Мен басқа ойыншыны өлтірдім» деген ақпаратты жіберетін пакет серверге әр түрлі жылдамдықта жетеді. Одан кейін шешім қабылдау керек

  1. Олар алдымен жылдам пакетке рұқсат береді.
  2. Олар «кім бірінші жететіні маңызды емес» уақыт кезеңін береді.

Сонымен, екі нәтиженің бірі: не ойыншылардың бірі түсіп кетеді, не екі ойыншы төмендейді.

Егер бұл сервер жағында жасалса, ойыншылардың барлығы «Мен осы позицияға қарай аттым» деген ақпаратты жіберуі мүмкін. Содан кейін сервер ақпаратты қабылдайды және «осы уақытта болғанның бәрін» жинақтайды және шешім қабылдайды, содан кейін ойыншыға «қазіргі жағдай қандай» деген ақпаратты жібереді. Мұның секундына 10 немесе 30 немесе 60 рет болып жатқанын елестетіп көріңіз.

Мұндағы нәтиже ойынға, сіздің серверге қосылу жылдамдығыңызға және ойын серверінің жұмыс істеп тұрған аппаратурасына байланысты, сондықтан нақты және қарапайым жауап жоқ. Егер ойын жеткілікті түрде оңтайландырылған болса, онда ойынға мүмкіндік беретін болса, екі еселенген КО-ны көруге болады, бірақ бұл ойынға байланысты.

Қысқа жауапқа жету: бұл ойын соққыларды қалай анықтайтынына байланысты.


жауап 3:

Бұл ойынға байланысты. Мұны «соққыларды анықтау» деп атайды және оны орындау тәсілі ойынға үлкен әсер етуі мүмкін.

Хитті анықтаудың екі түрі бар; клиент және сервер жағы. Осыған орай, клиенттің соққыларын шабуылдаушы немесе нысана иесі анықтай алады, бірақ мен мақсатты соққыларды анықтауды қолданатын мысалды ойлап таба алмаймын (мүмкін, бұл хакерлер тарапынан теріс пайдаланылуы мүмкін, сондай-ақ кідіріс проблемаларын тудыруы мүмкін).

Клиенттердің соққыларын анықтау ойындар арасында ең танымал. Мұндай жағдайда, сіз мылтық атқан кезде компьютеріңіз оқтың жүру жолын есептейді және оның жауға тиетінін анықтайды. Егер ол орын алса, сіздің ойыңыз бұл ақпаратты серверге «Мен бұл жауға осындай мөлшерде зиян келтірдім» деп жібереді.

Клиенттік соққыны анықтаудың артықшылығы - бұл серверге аз жүктеме береді. Егер сізде серверде 10 ойыншы болса, бұл секундына мыңдаған оқ атылуы мүмкін. Бұл есептеулерді клиенттің жағына қою сервердің шамадан тыс жүктелуіне және артта қалуына жол бермейді.

Кемшілігі - сервер мен клиент арасында кешігу бар. Сіз өзіңіздің қасыңызда жауды көріп, оларды атып тастауыңыз мүмкін, бірақ кешігудің арқасында ол шынымен де болмады. Жаудың соңында олар жасырынып атып кетеді. Мұны шешудің екі әдісі бар; ойын кодындағы кешеуілдік өтемақысы немесе сервердің соққысын анықтау.

Серверлік соққыны анықтау өте кешігу жағдайында да проблемалы болуы мүмкін, себебі сіз біреуді көріп, түсіріп алсаңыз болады, бірақ сіздің соққыларыңыз тіркелмейді, өйткені сервердің жаудың қай жерде екендігі туралы ойы сіздің кідірісіңізге сәйкес келмейді. Бұл сізге сервердің кешігуін өтеу үшін кадрларды шынымен жүргізу керек дегенді білдіруі мүмкін.

Ойындардың көпшілігінде бұл проблемаларды болдырмауға көмектесетін өте күрделі желі коды бар. Battlefield 1 сияқты кейбір ойындар, тіпті ойыншының қосылу жылдамдығына байланысты соққыны анықтаудың әртүрлі түрлерін ауыстырады.


жауап 4:

Бұл өте жақсы сұрақ! Сіз білместіктен ойын дизайны үшін ғана емес, жалпы бағдарламалау үшін де маңызды тақырыпты қозғай алдыңыз. Сіздің нақты сұрағыңызға жауап әзірлеушінің ойынды құрылымдау туралы шешіміне байланысты болады, бірақ соған терең бойлайық.

Ойын қозғалтқыштарының көпшілігінде логикалық ағын оқ атылған кезде сәулелік лақтыру орындалатын етіп құрылымдалған. Сәуле түсіру дегеніміз - өрттің шыққан жерінен сызық сызылғанын білдіреді және кез-келген модель осы сызықпен немесе сәулемен соқтығысып-соқтығыспағанын тексереді. Соқтығысу анықталған кезде сәуле соқтығысатын кез-келген модельдерге сигнал жіберіледі және олар соқтығысқан оқпен күресу үшін логиканы қамтамасыз етеді. (Мысалы, қабырға ешнәрсе істемеуі мүмкін, ал ойыншы зақымдануы мүмкін.)

Басқа ойындарда оқтың нақты ұшу жолы модельденеді, ал оқтар ауырлық күшіне әсер етеді және олардың жүру уақыты бар. Мұны шешу үшін оқтың өзі оның қалай қозғалатындығын шешуге жауапты болуы мүмкін, содан кейін оқтың заттармен қалай әрекеттесетіні туралы логика оқпен мықтап біріктірілуі мүмкін.

Сайып келгенде, бұл жалпы бағдарламалау кезінде жиі кездесетін сұрақ, және сіз көптеген жасаушылар өздеріне жүйелі түрде қоятын сұрақ қойдыңыз: «Мен модельдеуді қалайтын жүйені жасау үшін, әр логика қайда жатады? және менің жүйем қандай элементпен үйлесуі керек ». Көбінесе бұл күрделі архитектуралық шешім болып табылады және бағдарламалауды ғылымға, өнерге де аз ететін көптеген қиындықтардың бірі болып табылады.


жауап 5:

Бейне ойындарға арналған код жазғаныма көп уақыт болды, сондықтан өнердің деңгейі өзгерген болуы мүмкін (және мүмкін), бірақ барлық нақты уақыттағы ойынның негізгі мақсаты өзгерген жоқ: ол тез болуы керек мүмкін.

Мұны орындау үшін мен оқты түзу сызықпен жүргенде модельдедім. Көптеген ұрыс жағдайлары үшін бұл ақылға қонымды болжам. Егер сіз мергендердің алыс қашықтыққа атуын модельдегіңіз келсе, онда сіз желдің соғуы мен құлдырауын ескеруіңіз керек болар еді, бірақ бұл минималды факторлар, ал әлдеқайда жылдам процессорларсыз (бүгінде бізде) бұл практикалық емес еді, ең болмағанда менің күн.

Адам денесі күрделі формада болады, сондықтан мен оны кезең-кезеңімен бөлшектедім. Бірінші кезеңде мен плеерді цилиндр ретінде модельдедім. Ойыншының позициясындағы тік сызық, биіктігі мен радиусы - барлық қажетті ақпарат. Ол жерден ойыншының ортасынан оқ өтіп бара жатқан сызыққа дейінгі қашықтықты табу қарапайым мәселе. Геометрия оқушылары қашықтық әрдайым тік бұрышпен өлшенетінін ұмытпайды, мүмкін болатын ең аз қашықтықты алу үшін. Содан кейін бұл қашықтық фигураның радиусымен салыстырылады. Егер қашықтық радиусынан үлкен болса, онда оқ ойнатқышты жіберіп алды, сондықтан бұдан әрі ешқандай шара қолданудың қажеті жоқ.

Егер қашықтық радиусқа жетпейтін болса, онда дененің әр бөлігі цилиндр түрінде ұсынылған 2-кезеңге өту керек (немесе бас жағдайында сфера) сіз оқтың тигенін болжай алмайсыз денеде бір нәрсе; ол, мысалы, аяқтар арасында зиянсыз өткен болуы мүмкін. Сіз дененің әр бөлігі үшін оқ сызығынан цилиндр сызығына дейінгі қашықтықты тексеріп, егер сол қашықтық цилиндр радиусынан аз болса, соққы жасайсыз. (Немесе сфера радиусы, бас жағдайында)

Мен ату өлімге әкелуі мүмкін деп болжап, алдымен басымды тексеретін едім, мысалы, дәл сол оқ қолдың ішіне енген-кірмегенін білу үшін мен өңдеуден босқа шығындалудың қажеті жоқ еді.

Мен мұның біршама жеңілдетілгенін білемін: мысалы, мен тек цилиндрлердің ұзындығының шеңберінде соққыны тексеруге қатысты процесті әдейі тастап кеттім, өйткені мен айқындыққа ұмтылдым. Мен айтқым келген тағы бір мәселе бар, өйткені мен жылдамдық негізгі мақсат болғанын айттым.

Бұл есептеулерде ең көп өңдеу уақытын алатын бөлік квадрат түбірді есептеу болып табылады. Классикалық 2D арақашықтық формуласының үш өлшемді аналогы әлі де квадрат түбірді қажет етеді. Сол уақытты қырып тастау үшін мен бұл соңғы қадамды жасамадым және арақашықтықтардың өздерін емес, олардың квадраттарын салыстырдым. Сол нәтижелер, тезірек.

Мен түпнұсқа сұраққа толық жауап бере алмағанымды түсінемін, бірақ егер сіз осы есептеулерді орындау үшін объект жазып, оған оқ нысаны мен мақсатты нысанды берсеңіз, онда сіз кез келген тәсілмен бірдей нәтижелерге қол жеткізе аласыз.


жауап 6:

Ежелгі уақытта кейіпкердің барлық атрибуттары бар файлға салынған немесе салынған. Денсаулықты сақтау сияқты деңгейлердің көп бөлігі, бірақ сіз жараланған немесе белгілі бір пайызбен жараланып, тірі болып саналуыңыз мүмкін. Демек, оқтың тиюі әрқашан сенің өлгеніңді білдірмейді. Ойыншының жүрек аймағына немесе басқа жерлерге оқ тигенін, оның зақымдану мөлшері мен түрін анықтайтындығын ойын авторы өзі шешетін болғандықтан, бұл әр ойын үшін бірдей болмас еді. Менің ойымша, оқ немесе кез-келген зат, бомба, граната және т.б. денсаулықтың әртүрлі деңгейлерін береді, оның сізге тиген жеріне байланысты, сонымен қатар әр түрлі болуы мүмкін. Ойындағы кез-келген заттың қозғалатын немесе қозғалмайтын маңызы бар. Сіз оған қаншалықты жақынсыз, сіздің X, YZ ойынындағы мәртебеңіз. X, Y, Z таңбалары әр кадрда өтеді. Мұның бәрі үнемі талданып отырады. (Шынайы уақыт). Енді сіз ойын жасау мәтіндік процессор сияқты қарапайым емес екенін түсіндіңіз. Ойындағы дұшпандар немесе ойыншылар, жақсы немесе жаман жігіт болсын, әрдайым үнемі тексеріліп отырады және кейбір ойындарда олардың денсаулық деңгейлері нақты уақытта көрсетіледі. Кейбір ойындарда сенің өлгендерің немесе тірілерің, мысалы PacMan. Басқа ойындар үшін сіз 1-ден 10-ға дейінгі немесе 1-ден 100-ге дейінгі және т.б. өлі немесе тірі. Өмірде сәтсіздікке ұшыраған басқа заттар, мысалы, автомобильдер, қайықтар, танктер және т.с.с. тіпті қарулар да жойылуы немесе жаралануы мүмкін. Шынында да, жақсы ойын қару-жарақты кептеліп, қызып, баяулайды, қуаты аз лазер және т.с.с. болуы мүмкін. Сіз затты неғұрлым күрделі жасасаңыз, соғұрлым ойын ойнайтын компьютердің күшін арнайтын болады, сондықтан сіз тепе-теңдікті сақтап отыруыңыз керек.

ҚАЗІР есіңізде болсын, мен ешқашан ойын немесе ойын бағдарламалық жасақтамасын жазған емеспін. Мен автордың ойынды қалай құрғанын зерттеу барысында ойындардан мысалдарды алып отырмын.

Көптеген жылдар бұрын DOS үшін жазылған ұшу симуляторы Чак Йигер ойын папкасында бірнеше конфигурация файлдары болған. Олардың әрқайсысында әр ойынға арналған, әр жазықтықтың сипаттамалары, қарапайым мәтіндік форматта, ойын қалтасында сақталған. Сіз оларды алты бұрышты редактормен оңай өзгерте аласыз. Біз ойынды ұшақпен көтеру үшін жасадық және жасай алдық, және ол биіктікке жеткенде, ол кері бағытта ұшатын болды. Енді сіз мұны нақты жазықтықпен жасай алмайсыз. Бірақ ұзақ қашықтыққа ұшу көңілді және өте қиын болды, бірақ көңілді болды! Сіздің кейіпкеріңізді өшпес етіп жасау үшін кейбір ойындар конфигурация файлдарын өзгерте алады деп ойлаймын. Дұшпандар сені қанша өлтірсе де сені өлтіре алмауы үшін. Бұл қызықты болды, бірақ содан кейін авторлар көп ұзамай бұл қатені түсініп, өзіңізді жойылмайтын немесе өлтірмейтін етіп өзгерту үшін қандай мәндерді таба алмайтындай етіп барлық файлдарды кодтады.


жауап 7:

Сэм Лазар мұны өте жақсы түсіндірді (Жарайсың! Сэм!), Алайда мұндай механиктің орындалуы ойынға байланысты.

Сәулелік сканерлеу - бұл шешім табудың ең негізгі тәсілдерінің бірі. Бұл іске асыру көптеген ескі ойындарда жүзеге асырылды, олардың ойын кезінде есептеу мүмкіндігі едәуір шектеулі болды. Мұның тағы бір қайталануы - көп ойыншы ойындарының артта қалуын есепке алу үшін «соққы қораптарын» қосу және соқтығысу нысаны ретінде екі еселену (оны анықтаған адамға шляпалар!). Уақыт өте келе, әзірлеушілер мұны шешудің қызықты тәсілдерін ойлап табуда.

Мен соққыларды сканерлеу тәсілін қолданғанын көрдім, онда соққы анықталғаннан кейін, оқтың түсуін анықтау үшін есептеу жүргізілді. Таңқаларлықтай есептеулер қарапайым болды, 3D ойынында X, Y және Z өлшемдері қол жетімді. Бұл жағдайда сканерлеу соққыны анықтаған кезде, «қашықтық өсіміне түсетін соманың» анықталған айнымалысын алады. Z анықталған айнымалыдан.

Бұл жағдайда бағдарламашылар тәжірибені жақсарту үшін келесі айнымалыларды ескере алады: оқтың шығу орны, объектінің орналасуы, қашықтық, биіктік және уақыт. Әдетте соққыға арналған сканерлеу тәсілі тек нүкте ретінде тіркелу керек. Алайда, бұл жағдайда оқтың түсуі қосымша айнымалыларды есепке алу арқылы жүзеге асырылады. Кейбіреулер тіпті желді немесе басқа айнымалыларды имитациялау үшін ойыншының деңгейімен анықталған қоршаған ортаның айнымалысын қосуы мүмкін.

Алайда кез-келген бағдарламашы сізге модельдеуді неғұрлым күрделі деп айта алады, сондықтан нәтиже біркелкі болу үшін көбірек ресурстар қажет болады. Бір сәтке ескі онлайн-ойындағы оқтың төмендеуі сияқты өте күрделі есептеуді енгізуге тырысып жатқаныңызды елестетіп көріңіз. Бұл сценарийде аппараттық құрал мұндай әрекетті қолдауға дайын болмады. Толығырақ әрдайым жақсы бола бермейді және оңтайландыру туралы айтатын болсақ, соғұрлым өнімділікті жақсартуға болады.

Әдетте сәулені сканерлеу тәсілімен ешқандай оқ пайда болмайды, оның нәтижесі «соққыға» ұшыраған нысан үшін алдын ала анықталған опцияны іске қосу арқылы аяқталады. Әдетте бұл дыбыс, декал немесе жарылыс сияқты қызықты нәрсе. Ойында өндірілетін оқтың болмауы ойынға қажет ресурстарды айтарлықтай азайтуға мүмкіндік беретін болса да, олардың жүру жылдамдығына байланысты батып кетуді бұзбайды (бір рет көзіңізбен атылған саяхатшы оқты қарап көріңіз).

Оқтарды көрсететін камераларды қосатын ойындарда бұған мен білетін 3 тәсіл бар. Біріншіден, оқты осы кезекпен ғана түсіре отырып, камера соққы «нүктесіне» қарай бағытталады, бұл әдетте атқыштан нысанаға дейінгі орташа диапазонмен анықталады. Бұл уылдырық шашқан оқ атылды деген елесін береді, ал ол болмаған кезде ол иллюзияны сақтайды. Екіншіден, өрт сөндіргіш іске қосылған сайын оқты шашырату керек, бұл ресурстарға қанша қалдық екенін көрсетудің қажеті жоқ екеніне сенімдімін. Кейбір ойындар мұны сату нүктесі ретінде қолданғанымен, мен оны нашарлатушы деп санаймын, өйткені мұндай функцияны қолдау үшін ойынның жалпы сапасы төмендеуі керек. Бұған үшінші көзқарас күлкілі, мен мұны тек ескі ойындарда және бірнеше жаңа ойындарда көрдім. Спрайттар, спрайттар - бұл ойын даму әлемінің таңғажайып мистикалық жаратылыстары. Бұл жағдайда спрайт (әрдайым тікелей ойнатқыш камерасына қарайтын кескін файлы) анимациялық кескін болуы мүмкін, ол басталған кезде анимация арқылы қашықтыққа кішірейеді немесе жүріп өткен жолға байланысты өлшемі кішірейеді. Спрайттар сәл иффия болуы мүмкін, өйткені олар олардың егжей-тегжейлі болуына байланысты ресурстарды жақсы ала алады. Спрайттер шектеулі қолданылуына байланысты қазіргі ойындарда сирек қолданылады.


жауап 8:

Мен жай ғана оның қалай жұмыс істейтінін түсіндіремін. Оқтың 2 түрі бар. Гицкан және снаряд. Hitscan - бұл мылтықтан кез-келген соққы мен снарядтардың траекториясы бар жылдам лазер.

HITSCAN (көп ойыншы)

Сіз нені басқаныңызды және серверге қайда жіберілетіндігіңізді басқан кезде, сервер жолды тексеріп, жауға немесе бетке соғылғаныңызды анықтайды, содан кейін шешім қабылдаған нәтижені клиентке / клиенттің жанына (сіз ойыншыға) жібересіз, зақымдалған ойыншы немесе соққы беті. Сондықтан кейде жаудың қанын көруге болады, бірақ ол 0 зақым алған, сондықтан cs ойыншылары 64 емес, 124 кене алғысы келеді, кене - секундына жаңару жылдамдығы.

HITSCAN (жалғыз ойыншы)

Multiplayer-пен бірдей, бірақ ешқашан кене жылдамдығына қатысты мәселе болмайды (жаңарту жылдамдығы).

Снарядтар біршама күрделенген, снаряд әлі де ауада ұшып бара жатқан әрбір кене үшін клиент пен сервер арасында ақпаратты жіберіп отыру керек, әдетте оларда оқтың тамшысы болады және осының барлығы траекториямен есептеледі. сервер Multiplayer-де тексереді немесе клиент Singleplayer-де орындайды.

Қайтару әдетте 0-ден көп мөлшерге дейін болады, ал конустың ені оқтар түсуі мүмкін. Конус ойыншының камерасынан басталып, беткі қабатта немесе скайбокста аяқталады. Csgo-де әр оқтың векторлық қашықтығы бар, ол сіз қай жерде от басу пернесін бастасаңыз болады (егер сіз тінтуірді қозғалтпасаңыз, онда кері шегінудің басталу орны өзгереді). Вектор - бұл X және Y осінде нүктеден қашықтықты айтудың «сәнді» тәсілі.

Мен бәрін тазарттым деп үміттенемін.


жауап 9:

Оқ физикасын бейне ойынға енгізудің екі әдісі бар:

Hitscan: Бұл сіздің мақсатыңызға снарядпен соғылатындығын анықтау үшін қолданылатын нәрсені қолданады. Негізінен, қозғалтқыш мылтықтың қай жаққа бағытталғанын көреді, мылтықтан максималды ұшу нүктесіне дейін сызық жүргізеді және басқа объектілер көрінетін жерде орналасқанын көреді. Егер иә болса, ол объектіге оқпен «соққыға жығылғанын» айтады. Мұның тағы бір жанама әсері - сіз сәулені кесіп өтетін БАРЛЫҚ заттарды табу арқылы сапқа бірнеше қаруды ене алатын қару құра аласыз (мысалы, зілзаладағы теміржол мылтығы сияқты).

Көптеген ойындар бұл әдісті қолдануды жөн көреді, өйткені ол тез есептеледі және жаңа физика нысанын дайындауды қажет етпейді. Есептеу лезде орындалады (егер біз оқтың жылдамдығына әсер ете бастасақ, онда мақсат сол сәтте қозғалған болуы мүмкін), сондықтан мылтықты атқан кезде және нысанаға зақым келген кезде жүру уақыты болмайды. Кастинг сәулелері түзу және нақты оқтарды имитацияламайды. Мұның орнын толтыру үшін бағдарламашылар «реализм» бағыты бойынша кездейсоқ ауытқуларды қосуы мүмкін (кері қайтару, жел, ауырлық күші және т.б.).

Осыны қолданатын ойындардың мысалдары: Call of Duty, Halo, Battlefield ойындары және т.б.

Снаряд баллистикасы:

Бұл әдісте ойын қозғалтқышы ойын әлемінде өзіндік массасы бар жаңа тор жасайды. Бұл оққа қозғалтқыш қадағалайтын жылдамдық пен өлшем береді. Оқ жылжып келе жатқанда (ықтимал сыртқы баллистикалық модельдеу кезінде), бағдарламалаушы затқа соққы бергенде не болатынын логикамен толықтыра алады. Бұл оқты әлдеқайда шынайы модельдеу. Бірақ бағдарламалау қиын болуы мүмкін және ойын инженерлерінде мұндай физиканы кодтау үшін нақты инженерлер қажет. Сондай-ақ, кез-келген оқ қозғалтқышпен жасалған және имитацияланғандықтан, ол жүйеге салық салады. Сондықтан, Arma сияқты ойындар ойыншының ғана емес, сонымен қатар AI одақтастары мен жауларының оқтарын модельдеу үшін жоғары деңгейлі жүйелерді қажет етеді.

Projectile Ballistics қолданатын ойындар:

Arma, PuBG, Sniper Elite франшизасы, Sniper Ghost Warrior. Менің жинағандарымнан ұрыс даласы снайперлер үшін снарядты баллистикалық тәсілдің негізгі жүйесін қолданады.


жауап 10:

Мұнда жауаптардың көпшілігі графикаға және сәулелену модельдеуге қалай әсер ететініне қатысты. Әрине, бұл жақсы тәсіл болса да, мен негізгі сынып дизайны мен OOP негіздеріне сүйенгім келеді.

Мен өзімнің сынып құрылымымды кез-келген жаудың жеке өзі / қабырғасы оқ тигенде не болатынын ескеретін нысан болатындай етіп модельдеуді қалаймын. Оқтан гөрі қарсыласқа оқ жаудырғаннан гөрі.

Келесі сабақтарды елестетіп көріңіз: (абстрактілі деңгейде)

класс бағыты {екі есе х; қос у; қос z; }

класс орны {double x; қос у; қос z;}

класс Bullet {екі реттік жылдамдық; D бағыты; Лауазым p; boB event OnBullet (лауазымы, бағыты); }

Дұшпан класы {Позиция б; денсаулық сақтау; OnEnemyHit оқиғасы (Position); }

Енді нақты функцияда жаулар, оқтар, қабырғалар және т.б. болады, сонымен қатар оларда жау мен оқтың / қабырғаның және оқтың қиылысы бар-жоғын тексеретін EventHandlers болады.

сынып сценарийі {Enemy e; B таңбасы; және т.б. ...}

Сонымен, сіздің сұрағыңызға жауап беру үшін жаулар оқтың тигенін тексермейді, ал оқтар жауға тигенін тексермейді. Сценарий қиылыстарды тексереді, және жаулар мен / немесе оқтардың екеуінде де өз сыныптарында оқиғалар болуы мүмкін.

Әрине, сценарий сыныбында объектілердің бірнеше даналарын күтуге арналған динамикалық тізімдер / массивтер бар.


жауап 11:

Есептеу тұрғысынан ойнатқыштың соғылғанын тексеруі оңайырақ болар еді. Оқтар өте көп және әр оққа объектілерді тағайындау көптеген есептеу ресурстарына тең болады. Көбінесе атуды бейнелейтін конус нысаны қолданылады, ол кейбір жағдайларда автоматты мылтықтан атылған оқтарды бейнелейтін ондаған сызықтарды жасаудан арзан. Бірақ бұл экранда оқтың жолы сызылмаған ойындарда қолданылады. Мұны жасайтындар үшін сызықтық объект құру қажет болады.

Заттардың есептеу қиылысы өте тез және оқтар нақты уақыт режимінде саналатындықтан (ойнатқыштың қозғалысына қарағанда жылдам деп есептелгендіктен), оқтарды лақтырмай, оқ ату конусымен қиылысқан-жатпайтынын тексеретін ойыншыны санау оңай болады. . Егер конус шынымен басымен қиылысып, бастың ату қасиетін өзгертсе.