С ++ / SFML программа вылетает при выходе - PullRequest
2 голосов
/ 26 января 2012

Я только недавно начал играть с SFML и написал эту простую программу.

Кстати, я использую Visual Studio 2010.

Программа компилируется и работает нормально при использовании опции «начать отладку». но если я открою файл .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();
}

Ответы [ 3 ]

4 голосов
/ 21 ноября 2012

У меня была такая же проблема.Вам необходимо перекомпилировать SFML при использовании VS2010.

1 голос
/ 18 июня 2012

SFML имеет несколько версий своих .lib для выпуска и отладки.

Примеры:

  • sfml-audio.lib
  • sfml-audio-d.lib
  • sfml-audio-s.lib
  • sfml-audio-sd.lib

Убедитесь, что вы используете библиотеку безв этом

Кроме того, когда вы ставите .dll с вашим exe-файлом (при условии, что вы используете динамические библиотеки), убедитесь, что вы используете обычные версии, а не отладочные (-d) версии.

Наконец,когда вы создаете проект, убедитесь, что вы собрали его для релиза, а не для отладки.

1 голос
/ 26 января 2012

Несколько вещей, которые вы можете попробовать:

  1. Если вы подозреваете повреждение кучи, запустите gflags (находится в Средства отладки для Windows ) и включите кучу страниц.Некоторые инструкции о том, как это работает, можно найти здесь .В основном, когда включена куча страниц, ваше приложение будет зависать в момент ошибки памяти, а не спустя какое-то время.
  2. Вы сказали, что у вас происходит сбой при выходе.Когда это происходит, я предполагаю, что Windows выдает диалоговое окно сбоя.Откройте одну из тех ссылок, которые говорят что-то вроде «посмотреть, какая информация загружается».Где-то среди этих файлов будет мини-дамп вашего процесса.Вы можете загрузить это в visual studio (откройте файл и нажмите F5).Иногда Visual Studio дает сбой, поэтому другой, более надежной, но более сложной, но более трудной в использовании альтернативой является WinDbg, также входящий в состав Debugging Tools for Windows.
...