首页 > 解决方案 > c++ 基类欠精细

问题描述

你好我有未定义基类的问题

在此处输入图像描述

这是我的基础和继承头文件

基类

#pragma once

#include "GameStateManager.h"

class GameEngine;
class GameStateManager;
struct tagMSG;

class GameState
{
public:
    GameState() {}
    virtual ~GameState() {}
    virtual void Enter(GameEngine *) = 0;
    virtual void Update(tagMSG& msg, GameStateManager* game) =0;
    virtual void Exit() = 0;

};

派生类

    #pragma once
    #include "GameEngine.h"
    #include "GameState.h"
    #include "MainMenu.h"

    class Logo :public GameState
    {
    public:
        Logo();
        ~Logo();

        void Enter(GameEngine * engine);
        void Update(tagMSG& msg, GameStateManager* game);
        void Exit();
    private:
        float timer;
        GameEngine * m_GameEngine_Info;
        SceneActor * blackscreen;
        SceneActor * digipen_logo;
        SceneActor * team_logo;
    };

游戏状态管理器

    #include "Logo.h"
    #include "MainMenu.h"
    #include "Level.h"

    class GameState;

    class GameStateManager
    {
    public:
        GameStateManager(GameEngine* engine);
        ~GameStateManager();

        void Cleanup();
        void ChangeState(std::string state);
        void Update(tagMSG & msg);
        bool Running() { return m_running; }
        void Quit();

    private:
        std::unordered_map<std::string, GameState *> states;
        GameState * current_state;
        bool m_running;
        GameEngine * m_engine;
    };

我试图为我的游戏引擎做游戏状态,参考这个

https://gamedev.stackexchange.com/questions/28931/most-effective-way-to-manage-a-gamestate-system-that-is-easy-to-use

http://gamedevgeek.com/tutorials/managing-game-states-in-c/

更新

在此处输入图像描述

"game->ChangeState("mainmenu")" 中的错误 1

void Logo::Update(tagMSG& msg, GameStateManager* game)
{
    m_GameEngine_Info->Update(msg);
    if (m_GameEngine_Info->InputCheckTriggered(CVK_ESC))
    {
        timer = 0.0f;
    }

    while (timer >= 0.0f)
    {
        if (timer <= 0.1f)
        {
            game->ChangeState("mainmenu");
        }
        else if (timer <= 5.0f)
        {
            if (team_logo != nullptr)
                team_logo->SetOnlyActive(true);
            if (digipen_logo != nullptr)
                digipen_logo->SetOnlyActive(false);
        }
        --timer;
    }
}

改变状态函数, states 是一个 unordermap current_state 是 GameState *

void GameStateManager::ChangeState(std::string state)
{
    current_state->Exit();
    current_state = states.find(state)->second;
    current_state->Enter(m_engine);
}

标签: c++inheritance

解决方案


在基类中包含 GameEngine.h 在 Logo.h 中包含 GameStateManager.h

看起来头文件没有正确包含。


推荐阅读