Cześć! Robię sobie dla nauki taki mały silnik. Posiadam w nim klasy World i Body.
World - dodaje i updateuje body
Body - zbiór danych - pozycja, przyśpieszenie itp.
class World
{
public:
World(float gravity);
~World();
void AddBody(Body* body) {
this->body.push_back(body);
}
void AddBody(std::vector<Body*> body) {
for(const auto& b: body) {
this->body.push_back(b);
}
}
void Update(float deltaTime) {
for(const auto& b : body {
b->update(deltaTime);
}
}
private:
std::vector<Body*> body;
};
I w już projekcie gry mam klasę Entity, która jest matką.
class Entity {
public:
Entity();
virtual ~Entity();
virtual void Update(float deltaTime);
virtual void Draw();
Body* getBody() {
return body.get();
}
void MakeBody(Vector2 position) {
body = std::make_unique<Body>(position);
}
private:
std::unique_ptr<Body> body; // próbowałem zwykłego pointera i całą resztę smart pointerów
};
class Potwor: public Entity
{
Potwor(Vector2 position) {
MakeBody(position);
}
void Update(float deltaTime) override {
std::cout<<body->getPosition().x<<std::endl;
};
};
I klasę, która obsługuje dodawanie przeciwników jako singleton, bo chce mieć tylko jedną taką klasę
class EntityManager {
public:
static EntityManager getInstance();
~EntityManager();
void AddEntity(Vector2 position);
void Update(float deltaTime);
void Draw();
std::vector<Body*> getBody() {
std::vector<Body*> result;
for(const auto& e : entity) {
result.push_back(e->getBody());
}
return result;
}
private:
EntityManager();
std::vector<std::unique_ptr<Entity>> entity;
};
i główną klasę gry
class GameplayScreen {
public:
GameplayScreen() {
world = std::make_unique<World>(9.81f);
EntityManager::getInstance().AddEntity(`some position`);
world->AddBody(EntityManager::getInstance().getBody());
}
~GameplayScreen();
void Update(float deltaTime);
void Draw();
private:
std::unique_ptr<World> world;
};
I pozycja, która X, która jest wypisywana przez klasę potwor jest równa -nan(ind)
.
Jeśli jednak wezmę w komentarz world->AddBody(EntityManager::getInstance().getBody());
pozycja wraca do normy i jest taka jaką sobie ustawiłem.
world na pewno działa dobrze, bo gdy dodaję Gracza, który nie ma klasy bazowej, wszystko działa bardzo dobrze
class Player {
public:
Player();
~Player();
Body* getBody() {
return &body;
};
private:
Body body;
};
world->AddBody(player.getBody());
I wszystko ładnie pięknie się updateuje u gracza.
Co jest przyczyną takiego zachowania?
Gdzie popełniam błąd?
W jaki sposób to naprawić?