C++ 状态机,与#有关的问题包括
嘿,我试图为我的游戏实现状态机,我想测试一些东西。 所以现在我的机器有两个状态暂停和菜单,每一个都打印一个纹理,如果我按下鼠标,它应该会变为另一个状态。这应该是简单的,我认为我实现它是正确的,但我有40个bug,我认为它与include有关。下面是我的代码的外观: 游戏C++ 状态机,与#有关的问题包括,c++,C++,嘿,我试图为我的游戏实现状态机,我想测试一些东西。 所以现在我的机器有两个状态暂停和菜单,每一个都打印一个纹理,如果我按下鼠标,它应该会变为另一个状态。这应该是简单的,我认为我实现它是正确的,但我有40个bug,我认为它与include有关。下面是我的代码的外观: 游戏 #pragma once #include <SFML/Graphics.hpp> #include "GameState.h" #include "Menu.h" #incl
#pragma once
#include <SFML/Graphics.hpp>
#include "GameState.h"
#include "Menu.h"
#include "Pause.h"
class Game
{
public:
sf::RenderWindow* window;
sf::Event evnt;
GameState *state; // current state
sf::Texture text1;
sf::Texture text2;
sf::Sprite sText1;
sf::Sprite sText2;
void start(); // Main loop
void print1(); // Prints one graphic
void print2(); // Prints second one
void update();// Prints based on current state
void handleInput(); // check for input
Game();
};
配子状态
#pragma once
#include "Game.h"
class GameState
{
protected:
public:
virtual void Update(Game &gra )=0;
virtual GameState* handleInput(sf::Event evnt)=0;
};
暂停
#pragma once
#include "GameState.h"
#include "Menu.h"
class Pause:public GameState
{
public:
void Update(Game& gra);
GameState* handleInput(sf::Event evnt);
};
暂停.cpp
#include "Pause.h"
void Pause::Update(Game& gra)
{
gra.print1();
}
GameState* Pause::handleInput(sf::Event evnt)
{
if (evnt.type == sf::Event::MouseButtonPressed)
{
return new Menu();
}
else
{
return NULL;
}
}
Menu类的工作原理相同,只返回Pause类
这里是错误,怀疑它们是否有帮助
Severity Code Description Project File Line Suppression State
Error C2061 syntax error: identifier 'Game' sfml C:\Programowanie\Nauka\sfml\sfml\GameState.h 11
Error C2061 syntax error: identifier 'Game' sfml C:\Programowanie\Nauka\sfml\sfml\Pause.h 9
Error C2660 'GameState::Update': function does not take 1 arguments sfml C:\Programowanie\Nauka\sfml\sfml\Game.cpp 52
Error C2061 syntax error: identifier 'Game' sfml C:\Programowanie\Nauka\sfml\sfml\Menu.h 9
Error C2504 'GameState': base class undefined sfml C:\Programowanie\Nauka\sfml\sfml\Pause.h 6
Error C2143 syntax error: missing ';' before '*' sfml C:\Programowanie\Nauka\sfml\sfml\Pause.h 10
Error C2061 syntax error: identifier 'Game' sfml C:\Programowanie\Nauka\sfml\sfml\Pause.h 9
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int sfml C:\Programowanie\Nauka\sfml\sfml\Pause.h 10
Error C2238 unexpected token(s) preceding ';' sfml C:\Programowanie\Nauka\sfml\sfml\Pause.h 10
Error C2504 'GameState': base class undefined sfml C:\Programowanie\Nauka\sfml\sfml\Menu.h 6
Error C2061 syntax error: identifier 'Game' sfml C:\Programowanie\Nauka\sfml\sfml\Menu.h 9
Error C2143 syntax error: missing ';' before '*' sfml C:\Programowanie\Nauka\sfml\sfml\Menu.h 10
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int sfml C:\Programowanie\Nauka\sfml\sfml\Menu.h 10
Error C2238 unexpected token(s) preceding ';' sfml C:\Programowanie\Nauka\sfml\sfml\Menu.h 10
Error C2143 syntax error: missing ';' before '*' sfml C:\Programowanie\Nauka\sfml\sfml\Game.h 11
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int sfml C:\Programowanie\Nauka\sfml\sfml\Game.h 11
Error C2238 unexpected token(s) preceding ';' sfml C:\Programowanie\Nauka\sfml\sfml\Game.h 11
Error C2504 'GameState': base class undefined sfml C:\Programowanie\Nauka\sfml\sfml\Pause.h 6
Error C2061 syntax error: identifier 'Game' sfml C:\Programowanie\Nauka\sfml\sfml\Pause.h 9
Error C2143 syntax error: missing ';' before '*' sfml C:\Programowanie\Nauka\sfml\sfml\Pause.h 10
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int sfml C:\Programowanie\Nauka\sfml\sfml\Pause.h 10
Error C2238 unexpected token(s) preceding ';' sfml C:\Programowanie\Nauka\sfml\sfml\Pause.h 10
Error C2143 syntax error: missing ';' before '*' sfml C:\Programowanie\Nauka\sfml\sfml\Game.h 11
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int sfml C:\Programowanie\Nauka\sfml\sfml\Game.h 11
Error C2440 'return': cannot convert from 'Pause *' to 'GameState *' sfml C:\Programowanie\Nauka\sfml\sfml\Menu.cpp 15
Error C2238 unexpected token(s) preceding ';' sfml C:\Programowanie\Nauka\sfml\sfml\Game.h 11
Error C2504 'GameState': base class undefined sfml C:\Programowanie\Nauka\sfml\sfml\Menu.h 6
Error C2061 syntax error: identifier 'Game' sfml C:\Programowanie\Nauka\sfml\sfml\Menu.h 9
Error C2143 syntax error: missing ';' before '*' sfml C:\Programowanie\Nauka\sfml\sfml\Menu.h 10
Error C2238 unexpected token(s) preceding ';' sfml C:\Programowanie\Nauka\sfml\sfml\Menu.h 10
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int sfml C:\Programowanie\Nauka\sfml\sfml\Menu.h 10
Error C2143 syntax error: missing ';' before '*' sfml C:\Programowanie\Nauka\sfml\sfml\Game.h 11
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int sfml C:\Programowanie\Nauka\sfml\sfml\Game.h 11
Error C2238 unexpected token(s) preceding ';' sfml C:\Programowanie\Nauka\sfml\sfml\Game.h 11
Error C2440 'return': cannot convert from 'Menu *' to 'GameState *' sfml C:\Programowanie\Nauka\sfml\sfml\Pause.cpp 14
Error C2061 syntax error: identifier 'Game' sfml C:\Programowanie\Nauka\sfml\sfml\GameState.h 11
Error C2061 syntax error: identifier 'Game' sfml C:\Programowanie\Nauka\sfml\sfml\Pause.h 9
Error C2061 syntax error: identifier 'Game' sfml C:\Programowanie\Nauka\sfml\sfml\Menu.h 9
您有一个循环依赖项,其中
Game.h
包括Gamestate.h
,反之亦然。在前者中,您可以替换完整的include
#pragma once
#include <SFML/Graphics.hpp>
#include "GameState.h" // full include
#include "Menu.h"
#include "Pause.h"
class Game
{
...
#pragma一次
#包括
#包括“GameState.h”//完全包括
#包括“Menu.h”
#包括“暂停.h”
班级游戏
{
...
而是用一个向前的声明
#pragma once
#include <SFML/Graphics.hpp>
#include "Menu.h"
#include "Pause.h"
class GameState; // forward declaration
class Game
{
...
#pragma一次
#包括
#包括“Menu.h”
#包括“暂停.h”
类GameState;//转发声明
班级游戏
{
...
然后你可以在你的
Game.cpp文件中包含“GameState.h”
,你有一个循环依赖,其中Game.h
包含GameState.h
,反之亦然。在前者中,你可以替换你的完整包含
#pragma once
#include <SFML/Graphics.hpp>
#include "GameState.h" // full include
#include "Menu.h"
#include "Pause.h"
class Game
{
...
#pragma一次
#包括
#包括“GameState.h”//完全包括
#包括“Menu.h”
#包括“暂停.h”
班级游戏
{
...
而是用一个向前的声明
#pragma once
#include <SFML/Graphics.hpp>
#include "Menu.h"
#include "Pause.h"
class GameState; // forward declaration
class Game
{
...
#pragma一次
#包括
#包括“Menu.h”
#包括“暂停.h”
类GameState;//转发声明
班级游戏
{
...
然后您可以
#包括“GameState.h”
在你的游戏.cpp
文件中,当你输入你的评论时,我正在更新我的帖子。我想你有一个循环include path循环。相关:这里与循环依赖相关。在这种情况下,你可能可以在游戏.h
中转发声明游戏状态
,而不是包含“GameState.h”
按照这些思路,您还可以做一些其他事情,比如在GameState.hpp
中向前声明Game
,或者在Game.h
中不包含Menu.h
或Pause.h
,只在Game.cpp
中包含Menu.h
。在这种情况下,不一定会有很大的区别,但是可以考虑在哪些点中需要多少细节。您不需要完整的类定义来声明指针类型的变量或声明函数签名。当您键入注释时,我正在更新我的帖子。我认为您有一个循环include path循环。Related:Related关于循环依赖项。在本文中案例您可能可以在Game.h
中向前声明GameState
,而不是#包括“GameState.h”
按照这些思路,您还可以做一些其他事情,比如在GameState.hpp
中向前声明Game
,或者在Game.h
中不包含Menu.h
或Pause.h
,只在Game.cpp
中包含Menu.h
。在这种情况下,不一定会有很大的区别,但是考虑在哪些点上需要多少细节是很好的。声明指针类型的变量或声明函数签名不需要完整的类定义。谢谢你,它可以工作。谢谢你,它可以工作。