GicaEngine V3 je game engine napisan u C++.
- GUI sa ImGui
- Ucitavanje .obj modela (i to sa sopstvenim parser-om)
- Ucitavanje tekstura
- UI elementi u igrici (za sad dugmici i tekst)
- Kompajliranje igrice
- Opcije da se projekat sacuva i pokrene
- Svetla (za sad samo pointlight)
- Fizika, koristeci PhysX
- Vise kamera
Tokom kompilacije, program ce automatski generisati GameMain.cpp kod koji ima sve funkcije potrebne za igricu.
Program ce takodje sve modele i teksture kompresovati u jedan fajl, main.rpf.
GameMain.cpp ce main.rpf automatski dekompresovati i drzati u memoriji, tako da izvlacenje modela i tekstura iz igrice skoro nemoguce (ukoliko ne znas strukturu fajla).
Main.rpf sadrzi XML fajl koji sadrzi sve informacije o sceni.
GameMain.cpp moze se izmeniti, ali glavni su OnInit i OnUpdate funkcije.
GameMain.cpp takodje sadrzi i neophodne funkcije za dobijanje modela, tekstura, svetala, UI elemenata, itd. kako bi ih menjali.
Krajnji projekat bice u "out" folderu, gde je potrebno pokrenuti build.bat fajl ponovo, i igrica ce biti u "build" folderu.
U demonstraciji moze se videti vise o tome.
GameMain.cpp sam programirao za kontrolisanje bureta i padanje kutije, sve u OnUpdate() funkciji. Naravno, fizika ovde nije ukljucena
Ovde sam takodje isprogramirao svetlo u OnUpdate() funkciji.
OnUpdate(): Ovde stoji kod koji ce se pokrenuti svaki frame.
OnInit(): Ovde stoji kod koji ce se pokrenuti na pocetku igrice.
"API": Ne postoji pravi API, ali postoje funkcije u samom kodu:
Za dobijanje modela:
int getModel(std::string name)
{
for(int i = 0; i < g_models.size(); ++i)
{
if(g_models[i].name == name)
return i;
}
return -1;
}Primer (catcher igrica):
int boxIndex = getModel("Box");
if(score < 7)
g_models[boxIndex].position.y -= 0.01f;U primeru kako bi promenili poziciju, rotaciju, teksturu, itd. nekog modela, potreban je njegov index. A index se dobije pomocu funkcije getModel.
Sve sto treba da znate jeste ime modela, u mom slucaju "Box". Nakon toga mozete menjati svojstva modela pomocu g_models[index].
Slicno je i za dobijanje UI elemenata:
int getUIElement(std::string name)
{
for(int i = 0; i < uiElements.size(); ++i)
{
if(uiElements[i]->name == name)
return i;
}
return -1;
}Primer (catcher igrica):
int scoreLabel = getUIElement("ScoreLabel");
std::string scoreText = "Score: " + std::to_string(score);
static_cast<UILabel*>(uiElements[scoreLabel].get())->text = scoreText; U primeru se promeni tekst UI elementa "ScoreLabel".
Isto radi, isti je princip kao i getModel() funkcija.
Za pointlight:
int getPointLight(std::string name)
{
for(int i = 0; i < plNames.size(); ++i)
{
if(plNames[i] == name)
return i;
}
return -1;
}Primer (kao i u primeru sa kutijom):
int box_light_i = getPointLight("Point Light");
static int dir = -1;
float limit = 2.0f;
float step = 0.001f;
pointLights[box_light_i].position.x += step * dir;
if(pointLights[box_light_i].position.x <= -limit || pointLights[box_light_i].position.x >= limit)
dir *= -1;Ovaj kod svaki frame (OnUpdate) menja poziciju svetla "Point Light" za step.
Isto radi, isti je princip.
Prosto pokreni build_msvc.bat fajl i sve ce se odraditi samo. Nastace novi folder, "build". Unutar njega, "Release", i tu ce biti GameMain.exe i main.rpf. Takodje, potrebne su sledece biblioteke kompajlirane samostalno uz pomoc Visual Studia:
Takodje imate i kompajliran program u Releases







