用sfml显示窗口

时间:2014-06-20 01:28:16

标签: c++ sfml

我找了一些游戏开发的教程,我发现了一个我应该创建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();

我是新手,所以任何帮助,任何好的教程或开始学习的起点都会很好。

1 个答案:

答案 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;
}