我正在用C ++和SFML编写Monopoly游戏。我的应用程序已经有大约20个类,它们很好地协同工作,但我找不到解决一个问题的方法。首先,我需要向您展示一些我的代码,如果我发布太多代码,我很抱歉(我会尝试粘贴简单的最小代码),但是一旦我添加了一行代码,问题就会发生在我的应用程序中 - {{1}进入Field.h,我真的不知道是什么。让我们从应用程序的核心开始,GameState类里面有GameLoop
#include "GameEngine.h"
然后处理所有逻辑的类class GameState : public State {
sf::Clock m_clock;
sf::Sprite m_background;
GameEngine m_gameEngine;
public:
GameState();
void initialise();
void handleUserInput();
void update(sf::Time);
void draw();
};
GameState::GameState(std::shared_ptr<ApplicationData> data) : m_gameEngine(2, "John", "Richard") {
//2 players named John and Richard, just for tests now
}
GameEngine
目前,它只创造了两名球员
class GameEngine {
//players
std::vector<Player> m_players;
int m_numberOfPlayers;
int m_activePlayer = 0;
//game objects
GameBoard m_gameBoard;
public:
GameEngine(int, std::string, std::string);
GameBoard& getBoard() { return m_gameBoard; }
Player& getActivePlayer() { return m_players[m_activePlayer]; }
};
Player类没什么特别的,很少有变量和getter和setter函数
GameEngine::GameEngine(int numberOfPlayers, std::string playerOneName, std::string playerTwoName)
: m_numberOfPlayers(numberOfPlayers), m_firstDice(FIRST_DICE_POSITION_X, FIRST_DICE_POSITION_Y),
m_secondDice(SECOND_DICE_POSITION_X, SECOND_DICE_POSITION_Y) {
m_players.push_back(Player(playerOneName, sf::Color::Red, -5, 0));
m_players.push_back(Player(playerTwoName, sf::Color::Blue, -5, 0));
}
另一个重要部分是class Player {
int m_positionID = 0;
std::string m_name;
sf::CircleShape m_token;
};
GameBoard
并在所有问题开始的时候class GameBoard {
std::array<std::shared_ptr<Field>, BOARD_SIZE> m_board;
public:
GameBoard();
~GameBoard() = default;
std::shared_ptr<Field>& getField(size_t index) { return m_board[index]; }
};
Field
Field是游戏中我所有领域的基类,如Property,Start,GoToJail等。我想要这样的东西:玩家掷骰子,他被移动到新位置,这个位置被检查(在GameEngine里面)
class Field {
protected:
int m_positionID;
float m_positionX;
float m_positionY;
bool m_buyable;
public:
Field() {}
Field::Field(int positionId, float positionX, float positionY, bool buyable) :
m_positionID(positionId), m_positionX(positionX), m_positionY(positionY), m_buyable(buyable) { }
virtual ~Field() = default;
virtual void calculateCharge(GameEngine&) = 0;
};
现在m_board.getField(m_gameEngine.getActivePlayer().getPositionID())->calculateCharge();
将为每个类执行一个不同的操作,简单的运行时多态,但我希望这个函数实际调用calculateCharge()
内部的一些函数,这就是为什么我要传递GameEngine&amp;进入这个函数,但是一旦我'#include GameEngine.h'进入'Field.h',我就得到了
错误C2504:'字段':基类未定义
后面是派生类的几个错误,他们无法访问成员(受保护)等,整个继承不再工作,并且在我遇到几个错误之后
致命错误C1903:无法从之前的错误中恢复;停止 汇编
我试图添加前向声明,但它没有帮助。我真的不知道如何解决这个问题。