我找了一些游戏开发的教程,我发现了一个我应该创建pong克隆的地方,但我甚至无法创建窗口,我得到以下内容:
“Pang.exe中0xEEFFEE01处的未处理异常:0xC0000005:访问冲突读取位置0xEEFFEE01。”
我正在使用SFML 1.6和Visual Studio 2013。
这是我的代码。
Game.cpp
#include "stdafx.h"
#include "Game.h"
void Game::Start(void)
{
if (_gameState != Uninitialized)
return;
_mainWindow.Create(sf::VideoMode(1024, 768, 32), "Pang!");
_gameState = Game::Playing;
while (!IsExiting())
{
GameLoop();
}
_mainWindow.Close();
}
bool Game::IsExiting()
{
if (_gameState == Game::Exiting)
return true;
else
return false;
}
void Game::GameLoop()
{
sf::Event currentEvent;
while (_mainWindow.GetEvent(currentEvent))
{
switch (_gameState)
{
case Game::Playing:
{
_mainWindow.Clear(sf::Color(255, 0, 0));
_mainWindow.Display();
if (currentEvent.Type == sf::Event::Closed)
{
_gameState = Game::Exiting;
}
break;
}
}
}
}
Game::GameState Game::_gameState = Uninitialized;
sf::RenderWindow Game::_mainWindow;
Game.h
#pragma once
#include "SFML/Window.hpp"
#include "SFML/Graphics.hpp"
class Game
{
public:
static void Start();
private:
static bool IsExiting();
static void GameLoop();
enum GameState {
Uninitialized, ShowingSplash, Paused,
ShowingMenu, Playing, Exiting
};
static GameState _gameState;
static sf::RenderWindow _mainWindow;
};
Pang.cpp
#include "stdafx.h"
#include "Game.h"
int _tmain(int argc, _TCHAR* argv[])
{
Game::Start();
return 0;
}
我知道有一些代码与我的问题无关,当它在Game.cpp中到达这一行时会发生错误
_mainWindow.Display();
我是新手,所以任何帮助,任何好的教程或开始学习的起点都会很好。
答案 0 :(得分:0)
一些常规SFML建议:更新到SFML 2.0,尤其是在使用VS2013时。以下是官方SFML教程http://www.sfml-dev.org/tutorials/2.0/
看起来你刚从这里复制代码http://en.sfml-dev.org/forums/index.php?topic=10855.0如果这是真的你应该意识到代码不起作用,如果没有那么复制代码并在他们的教程中使用它的人应该有注意到,事实上他们并没有担心其他教程的状态
好的,问题是你不能拥有一个静态的RenderWindow,并且你的整个游戏类不应该是静态的,它只是不好的编程习惯。您需要做的是从Game.h头文件中的每个声明中删除静态标识符。例如:
此
static void Start();
需要看起来像这样
void Start();
接下来,你的Pang.cpp看起来应该是这样的
//#include "stdafx.h" you don't need this precompiled header
#include "Game.h"
int main(int argc, char* argv[])
{
Game myGame;
myGame.Start();
return 0;
}