2D Tiled Game Optimization в Java

Работя върху 2d игра отгоре надолу в чиста Java и досега имам система за картографиране на шума, която работи с парчета плочки (и обекти) точно като Minecraft.

Начинът, по който съхранявам плочки, е чрез създаване на int[s * s] масив, където s е размерът (в плочки), който има страна на парчето. След това имам статичен масив от плочки, който съдържа всяка от възможните плочки в играта, индексирана с цяло число. Това са целите числа, съхранени в int[s * s] във всяка част. Сега искам да мога да наслагвам плочки, като невидими плочки за хвърляне на хайвера, стени, дървета и преходни плочки (като когато тревата се промени на пясък: трябва да има граница от трева над пясъка, което би било нова плочка).

Проблемът е, че само едно цяло число може да се съхранява във всяка координата на парчето. Друг начин да го направите е да поставите действителни екземпляри на плочките вътре в парчетата и да накарате наслагващите се плочки да сочат към тези директно под тях (като стек), но мисля, че това е доста лош подход. Друг подход, който тествах, беше да направя масив от списъци с плочки, което също беше много лошо.

Кой би бил добър начин да се постигне това?


person Thiago    schedule 19.03.2013    source източник


Отговори (1)


Обикновено бихте отделили хранилището за плочки и предмети.

  • Ще имате int [w*h] или подобно за самите плочки, което ще позволи само една плочка на квадрат.
  • Отделно можете да имате ArrayList [w*h], който съхранява списък с обекти във всеки квадрат. Този масив ще съдържа null за празни квадрати, така че допълнителните разходи за съхранение за повечето квадрати (които нямат обекти в тях) са минимални.

Разбира се, има и други подходи, но този има предимството, че е едновременно прост и доста ефективен.

Единственият реален недостатък е, че ще трябва да пишете отделен код за обработка на плочки и обекти - но тъй като обикновено боравите с плочки и обекти по различен начин, тогава това едва ли ще бъде голям проблем.

person mikera    schedule 19.03.2013
comment
Добре, така че като направя това, ще трябва да превърна моите дървета, хвърлящи хайвера си и т.н. в обекти, което всъщност няма да е проблем. Това е хубаво. Но какво ще стане, ако искам да смеся плочки? Пример е преходът от трева към пясък: ще ми трябва нещо като граница от трева вътре в пясъчната плочка. Това, което исках да направя, беше да направя тази граница нова плочка и просто да я начертая върху пясъка, което ще изисква 2 плочки на едно и също място (или не?). - person Thiago; 19.03.2013
comment
няколко начина, по които можете да внедрите граници: а) просто да ги откриете и да ги нарисувате, докато рендирате б) да ги имате като обекти в) да приложите наслагвания на плочки (няколко плочки на квадрат, като обекти) г) автоматично генерирайте множество версии на плочки с граници. Вероятно бих предпочел а) обикновено, но YMMV и това зависи донякъде от цялостния ви дизайн на двигателя и степента на артистична гъвкавост, която искате да имате. - person mikera; 19.03.2013