Пиша малка аркадна игра на C++ (многопосочна 2D космическа стрелба) и завършвам частта за откриване на сблъсък.
Ето как го организирах (току-що го измислих, така че може да е скапана система):
Всеки кораб е съставен от кръгли компоненти - количеството компоненти във всеки кораб е някак произволно (повече компоненти, повече процесорни цикли). Имам maxComponent разстояние, което изчислявам при създаването на кораба, което е най-дългата линия, която мога да нарисувам от центъра на кораба до ръба на най-отдалечения компонент. Следя неща на екрана и използвам това maxComponentDistance, за да видя дали дори са достатъчно близо, за да се сблъскат.
Ако са в непосредствена близост, започвам да проверявам дали компонентите на различните кораби се пресичат. Тук идва въпросът ми за ефективността.
Имам (x,y) местоположения на компонента спрямо центъра на кораба, но не отчита как корабът се върти в момента. Поддържам ги относителни, защото не искам да преизчислявам компоненти всеки път, когато корабът се движи. Така че имам малка формула за изчисляване на въртенето и връщам 2d-вектор, съответстващ на позицията, която се съобразява с въртенето спрямо центъра на кораба.
Откриването на сблъсък е в GameEngine и използва 2d-вектора. Въпросът ми е относно видовете връщане. Трябва ли просто да създавам и връщам 2d-векторен обект при всяко извикване на тази функция, или трябва да дам на този съставен обект допълнителна частна 2d-векторна променлива, да редактирам частната променлива, когато функцията е извикана, и да връщам указател към този обект?
Не съм сигурен за ефективността на разпределението на паметта спрямо наличието на постоянна, редактируема, частна променлива. Знам, че паметта също трябва да бъде разпределена за частната променлива, но не всеки път, когато се проверява за сблъсъци, само когато се създава нов компонент. Компонентите не са постоянни в моята среда, тъй като се изтриват, когато корабът бъде унищожен.
Това е основната ми дилема. Също така бих оценил всякакви насоки относно дизайна на моята действителна система за откриване на сблъсък. За първи път го пробвам (може би трябваше да прочета малко)
Благодаря предварително.