Skip to content

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().

// MenuManager.cpp -> loadButtonsForState()
else if (currentState == MenuState::SETTINGS) {
    // Dodawanie nowego przycisku
    activeButtons.push_back({centerX - 100, startY + 210, 200, 50, "Nowa Opcja", MenuAction::NONE, 0, false});
}