уторак, 23 априла, 2024
Како да...?

LibGDX „Java game development framework” (1. дио)

Аутор: Гаврило Продановић

Скоро читавој младој популацији игрице су алатка за опуштање и портал за уживање у некој другој димензији. Многи одрасли често играју игрице са својом дјецом или самостално у слободно вријеме. Да би се саставила игрица, потребне су одређене техничке способности и осјећај за умјетност и креативност да би се игрица дочарала кроз графику, звучне ефекте и кроз сам gameplay. Ми ћемо овде представити алат који ће вам олакшати писање кода за игрицу, а име му је LibGDX од badlogicgames-а.

Некада прије, требало је вјероватно дубоко разумјевање low-level ствари да би се написала и нека основна игрица. Да би игрица била доступна на више платформи, обично се прескакао корак. Данас је све много лакше, а подршка за више платформи долази спонтано и подразумјевано, а то су, може се рећи, главни адути LibGDX-а. LibGDX је java framework који подржава следеће платформе: Desktop (Linux, Mac OSX, Windows), Mobile (Android, iOS) и web (HTML5). Од IDE-а подржани су Eclipse, Intellij IDEA и NetBeans. Могуће је користити само командну линију за развој. LibGDX сваки пројекат концептуално дјели у пет дјелова (пројеката): core, desktop, android, ios и html. Core садржи заједнички кôд, а остали пројекти садрже кôд специфичан за платформу. LibGDX посједује генератор пројекта који ће подесити све потребне потпројекте и скинути све додатне либове (енг. libraries) који су потребни. Можемо одабрати које платформе желимо да користимо, а у понуди су остале библиотеке које ће да прошире функције libGDX-а. Користи gradle, што аутоматски омогућава импортовање у све познате IDE-ове.За портабилност LibGDX-а вјероватно су највише заслужни OpenGL и Јava који су доступни за различите платформе. Програмер ће кôд логике игре да стави у core пројекат, док су остали пројекти генерисани врапери (енг. wrappers), а у њима се и не мора много тога мјењати. За desktop бисмо поставили подразумјевану резолуцију, за android подразумјевану орјентацију, а у html пројекат кôд landing странице. За све платформе биће вам довољан Linux OS за програмирање, осим за iOS платформу гдје ће вам бити потребан Mac рачунар са OSX системом и са xCode развојним окружењем. Знајући да се структура система датотека концептуално разликује између Windows-а и осталих UNIX система, а исто тако се и начини смјештања података на Android-у и на Linux desktop-у разликују, приказ LibGDX почећемо управо о томе како овај framework генерализује систем датотека. LibGDX генерализује систем датотека у следећих пет група:

  1. Classpath: Омогућује приступање датотекама које су упаковане у архиву апликације (нпр. jar или apk). Приступ овим датотекама је read-only.
  2. Internal: У интерне датотеке спадају оне датотеке чија је путања релативна на root путању апликације и радног директоријума за Desktop и за датотеке које се налазе унутар assets/ директоријума у Android пројекту који је укључен у архиву апликације. Интерне датотеке су обично read-only ако се односе на датотеке упаковане у архиву.
  3. Local: Локалне датотеке на desktop-у су смјештене у root апликације, а за мобилне уређаје унутар приватног директоријума у зависности од система. Препоручено га је користити за чување мањих датотека као што је game state.
  4. External: За desktop су смјештене унутар home директоријума, док је за мобилне уређаје то SD картица. Намјењен је за чување великих датотека, ако има потребе.
  5. Absolute: Омогућава приступ датотекама на основу апсолутне путање. Овакав начин није препоручљив јер постоји могућност за нарушавање портабилности.

За html5 доступно је само интерно складиште (енг. storage), док се за све остале платформе могу користити сва складишта. Локално и екстерно складиште могу бити физички недоступни на неким платформама, па су ту и функције којима можемо провјерити доступност. Могуће је брисати и мјењати назив датотеке унутар локалног или екстерног складишта или копирати и премјештати датотеку између локалног и екстерног складишта.

Као примјер врапера за систем датотека учитаћемо текстуалну датотеку из интерног складишта која је смјештена унутар assets фасцикле у android пројекту.

FileHandle file = Gdx.files.internal("myfile.txt");
String text = file.readString();

Програм у LibGDX, можемо рећи, почиње у класи која наслијеђује Game super класу. Прије тога, покрене се кôд специфичан за платформу, нпр. main функција за desktop или onCreate у MainActivity-у за android. Најважнија наслијеђена метода је render() која се позива у бесконачан loop. У њој се позивају функције за рендеровање, а може бити смјештен и кôд логике игрице. У пракси није практично имплементирати читаву игрицу унутар главне Game класе, а libGDX нам ту помаже јер посједује interface Screen који имплементира неку нашу класу која је задужена за одређену уску логику (нпр. један screen за главни мени, други screen за сам gameplay). Интерфејс дефинише већи број метода: render, resize, show, hide, pause, resume и dispose. Оне својим именом описују своју намјену. Захваљујући оваквом приступу, лако можемо да смјењујемо логичке цјелине једну за другом. У следећем броју удубићемо се у методе којима можемо да рендерујемо графику у libgdx, његове low-level opengl врапере и high-level класе које су ту да нам олакшају живот. Говорићемо о томе како је input класификован кроз платформе и укратко ћемо рећи шта је у понуди за репродуковање звучних ефеката и мелодија. Касније ћемо говорити о могућностима које су интегрисане у libgdx, а које нам могу омогућити да направимо што бољи gameplay.