Я создаю игру Tic-Tac-Toe, используя тот же код, который был предоставлен Sonar Systems в учебнике Tic-Tac-Toe SFML C ++ [STATE CREATION].
Но игра не запускается, и вместо этого я получаю окно с сообщением о том, что утверждение отладки не выполнено, и в окне вывода выдается исключение, говорящее: не может отойти от итератора deque диапазона, и (иногда не всегда), когда я пытаюсь запустить его снова в окне вывода есть это дополнительное сообщение «Недопустимый параметр передан функции, которая считает недопустимые параметры фатальными»
Я установил sfml, и он успешно связан с моим проектом VS2017, все необходимые ресурсы включены с основным в файле проекта, и я убедился, что все пути к каталогам верны. Я исправил первоначальные 86 ошибок (в том числе дополнительные файлы заголовков), и на данный момент нет красного подчеркивания кода, только появляется это окно сообщения.
Это минимальный объем кода, вызывающий ту же проблему:
main.cpp
#include "pch.h"
#include <iostream>
#include "Game.h"
int main()
{
TicTacToe::Game(800, 600, "Tic-Tac-Toe Game");
return EXIT_SUCCESS;
}
Game.cpp
#include "pch.h"
#include "Game.h"
namespace TicTacToe
{
Game::Game(int width, int height, std::string title)
{
_data->window.create(sf::VideoMode(width, height), title, sf::Style::Close | sf::Style::Titlebar);
this->Run();
}
void Game::Run()
{
float newTime, frameTime, interpolation;
float currentTime = this->_clock.getElapsedTime().asSeconds();
float accumulator = 0.0f;
while (this->_data->window.isOpen())
{
this->_data->machine.ProcessStateChanges();
newTime = this->_clock.getElapsedTime().asSeconds();
frameTime = newTime - currentTime;
if (frameTime > 0.25f)
{
frameTime = 0.25f;
}
currentTime = newTime;
accumulator += frameTime;
while (accumulator >= dt)
{
this->_data->machine.GetActiveState()->HandleInput();
this->_data->machine.GetActiveState()->Update(dt);
accumulator -= dt;
}
interpolation = accumulator / dt;
this->_data->machine.GetActiveState()->Draw(interpolation);
}
}
}
Game.h
#pragma once
#include <memory>
#include <string>
#include <SFML\Graphics.hpp>
#include "StateMachine.h"
namespace TicTacToe
{
struct GameData
{
StateMachine machine;
sf::RenderWindow window;
};
typedef std::shared_ptr<GameData> GameDataRef;
class Game
{
public:
Game(int width, int height, std::string title);
private:
const float dt = 1.0f / 60.0f;
sf::Clock _clock;
GameDataRef _data = std::make_shared<GameData>();
void Run();
};
}
StateMachine.cpp
#include "pch.h"
#include "StateMachine.h"
namespace TicTacToe
{
void StateMachine::AddState(StateRef newState, bool isReplacing)
{
this->_isAdding = true;
this->_isReplacing = isReplacing;
this->_newState = std::move(newState);
}
void StateMachine::RemoveState()
{
this->_isRemoving = true;
}
void StateMachine::ProcessStateChanges()
{
if (this->_isRemoving && !this->_states.empty())
{
this->_states.pop();
if (!this->_states.empty())
{
this->_states.top()->Resume();
}
this->_isRemoving = false;
}
if (this->_isAdding)
{
if (!this->_states.empty())
{
if (this->_isReplacing)
{
this->_states.pop();
}
else
{
this->_states.top()->Pause();
}
}
this->_states.push(std::move(this->_newState));
this->_states.top()->Init();
this->_isAdding = false;
}
}
StateRef &StateMachine::GetActiveState()
{
return this->_states.top();
}
}
StateMachine.h
#include "pch.h"
#include "StateMachine.h"
namespace TicTacToe
{
void StateMachine::AddState(StateRef newState, bool isReplacing)
{
this->_isAdding = true;
this->_isReplacing = isReplacing;
this->_newState = std::move(newState);
}
void StateMachine::RemoveState()
{
this->_isRemoving = true;
}
void StateMachine::ProcessStateChanges()
{
if (this->_isRemoving && !this->_states.empty())
{
this->_states.pop();
if (!this->_states.empty())
{
this->_states.top()->Resume();
}
this->_isRemoving = false;
}
if (this->_isAdding)
{
if (!this->_states.empty())
{
if (this->_isReplacing)
{
this->_states.pop();
}
else
{
this->_states.top()->Pause();
}
}
this->_states.push(std::move(this->_newState));
this->_states.top()->Init();
this->_isAdding = false;
}
}
StateRef &StateMachine::GetActiveState()
{
return this->_states.top();
}
}
State.h
#pragma once
namespace TicTacToe
{
class State
{
public:
virtual void Init() = 0;
virtual void HandleInput() = 0;
virtual void Update(float dt) = 0;
virtual void Draw(float dt) = 0;
virtual void Pause() { }
virtual void Resume() { }
};
}
А из окна стека вызовов это строки, в которых происходит сбой:
StateMachine.cpp (строки 53-56)
StateRef &StateMachine::GetActiveState()
{
return this->_states.top();
}
Game.cpp (строка 41)
this->_data->machine.GetActiveState()->Draw(interpolation);
Game.cpp (строки 6-11)
Game::Game(int width, int height, std::string title)
{
_data->window.create(sf::VideoMode(width, height), title, sf::Style::Close | sf::Style::Titlebar);
this->Run();
}
main.cpp (строка 7)
TicTacToe::Game(800, 600, "Tic-Tac-Toe Game");
Я не знаю, может ли это быть полезным, но на всякий случай я также получаю в окне вывода, что некоторые файлы PDB не могут быть найдены или открыты, поэтому я попытался исправить это, и он загрузил некоторые из них, но есть еще некоторые, которые не загружаются.
P.S. Я новичок в программировании