Poradnik Developera
Dowiedz się, w jaki sposób rozbudowywać silnik, pisać nowe klasy logiki i zarządzać elementami świata.
1. Jak pisać nowe klasy logiki (Entity)?
Każdy fizyczny element na mapie powinien dziedziczyć z GameObject. Tworząc nowego NPC lub np. ruchomą platformę, musisz przesłonić metodę update.
#include "GameObject.h"
class EnemyBot : public GameObject {
public:
EnemyBot(float startX, float startY, float startZ) {
x = startX;
y = startY;
z = startZ;
// Wymiary kolizji AABB
width = 1.0f; height = 2.0f; depth = 1.0f;
}
// Ta funkcja wywołuje się 60 razy na sekundę (Fixed Timestep)
void update(double fixedDeltaTime) override {
// Przykładowa logika patrolu
x += 2.0f * fixedDeltaTime; // Ruch w osi X
}
};
2. Jak dodawać obiekty i przeszkody do świata?
System fizyki automatycznie blokuje ruch gracza (horyzontalny i wertykalny) na podstawie listy worldObstacles. Aby dodać ścianę lub platformę do wskoczenia, zmodyfikuj konstruktor Application::Application().
// Application.cpp
Application::Application() {
// ... inicjalizacja okna ...
// Parametry: (PosX, PosY, PosZ, Szerokość, Wysokość, Głębokość)
worldObstacles.push_back(Obstacle(5.0f, 0.0f, 5.0f, 2.0f, 2.0f, 2.0f));
worldObstacles.push_back(Obstacle(10.0f, 2.0f, 0.0f, 5.0f, 0.5f, 5.0f)); // Wisząca platforma
}
System skakania gracza domyślnie wykorzystuje "zero" jako nieskończoną podłogę mapy, wyżej umieszczone obiekty Obstacle zablokują grawitację, gdy na nich staniesz.
3. Jak dodawać przyciski i opcje UI do Menu?
Moduł MenuManager korzysta z maszyny stanów. Każdy ekran menu ładuje zestaw dynamicznych przycisków struktury Button. Aby dodać nową opcję w "Ustawieniach", otwórz MenuManager.cpp w metodzie loadButtonsForState().