我刚开始使用SFML,我编写了这个简单的程序。

我正在使用Visual Studio 2010 BTW。

使用“开始调试”选项时,程序可以编译并运行良好。
但是如果我像运行普通桌面应用程序一样打开.exe文件,则该文件将在退出时崩溃。

我花了一段时间试图找出答案,但我只能说这可能是堆损坏。

这是所有代码:

#include <iostream>
#include <sstream>
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>


void moveSquare();
void avgFPS();

class displayFPS : public sf::Thread{
public:
private:
    virtual void Run();
};

int checkEvent(sf::RenderWindow &win){
    sf::Event Event;
    while(win.GetEvent(Event)){
        // Window closed
        if (Event.Type == sf::Event::Closed){
            return 0;
        }
        // Escape key pressed
        if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape)){
            return 0;
        }
    }
    return -1;
}

sf::RenderWindow win(sf::VideoMode(800,600,32),"Mario Clone Test");
sf::Image img1(200,200,sf::Color(255,255,0));
sf::Sprite sprite1;
std::stringstream ss;
sf::String fps;
bool threadFPS;

int main(){
    sprite1.SetImage(img1);
    sprite1.SetCenter(-300,-300);
    win.SetFramerateLimit(30);
    moveSquare();
    win.Close();
    sf::Sleep(0.5);
    return 0;
}

void moveSquare(){
    displayFPS dispFPS;
    threadFPS = true;
    dispFPS.Launch();
    fps.SetSize(20);
    while(1){
        if(!win.IsOpened() || checkEvent(win) == 0){
            threadFPS = false;
            dispFPS.Wait();
            break;
        }
        win.Draw(sprite1);
        win.Draw(fps);
        win.Display();
        win.Clear();
        if(win.GetInput().IsKeyDown(sf::Key::Left)){
            sprite1.Move(-100*win.GetFrameTime(),0);
        }
        if(win.GetInput().IsKeyDown(sf::Key::Right)){
            sprite1.Move(100*win.GetFrameTime(),0);
        }
        if(win.GetInput().IsKeyDown(sf::Key::Up)){
            sprite1.Move(0,-100*win.GetFrameTime());
        }
        if(win.GetInput().IsKeyDown(sf::Key::Down)){
            sprite1.Move(0,100*win.GetFrameTime());
        }
    }
    return;
}

void avgFPS(){
    double frames=0.0,avg=0.0;
    int j=0;
    while(threadFPS){
        if(win.GetFrameTime() != 0){
            j++;
            frames = frames+(1.0/win.GetFrameTime());
            avg = frames/j;
        }
        ss << "avg FPS: " << avg << std::endl << "Arrow Keys to Move" << std::endl << "Press ESC to Exit";
        fps.SetText(ss.str());
        ss.str("");
    }
    return;
}

void displayFPS::Run(){
    avgFPS();
}

最佳答案

我有同样的问题。
使用VS2010时,您需要重新编译SFML。

10-05 20:50
查看更多