0

私は最近、SFML を使用して小さなゲームを作成しています。今晩まで、すべてが驚くほど迅速かつ簡単でした。いつものワークステーションから離れて、Windows 8 タブレット/ネットブックで少しクリーンアップを行っているところ、ゲーム ウィンドウが表示されなくなりました。プログラムを実行すると、すぐに終了し、コンソールで終了するには任意のキーを押すように求められます。調査を行ったところ、使用していた SFML のバージョンが ATI グラフィックス カードをサポートしていないことがわかったので、プログラムを 2.0 にアップグレードしました (現時点では基本的にフレームワークにすぎないため、アップグレードには数時間しかかかりませんでした。すべてが直らなくても問題ないと思いました)。

残念ながら、まだ登場していません。プログラムを実行すると、想定どおりにコンソールが表示されますが、グラフィカル/レンダリング ウィンドウには表示されません。代わりに、「続行するには任意のキーを押してください」というテキストが表示されます。プログラムがすでに実行を終了しているかのように、コンソールに出力されます。キーを押すと、プログラムは戻り値 0 で終了します。

プログラムは、Codelite を使用して C++ で記述され、g++ を使用してコンパイルされます。現在、Windows 8 Professional タブレット/ネットブックで作業しています。別のコンピューターにアクセスできるようになるまでテストすることはできませんが、以前は正常に動作していましたが、停止したと信じる理由はありません。したがって、現在の環境の外。助言がありますか?

[更新]: 別の PC、Windows 7 で実行しようとしたところ、libstdc++-6.dll でプロシージャ エントリ ポイント __gxx_personality_v0 が見つからないという新しいエラーが発生しました。コード全体が大きすぎて投稿できませんが、main() に入っていないように見えるので、それが問題ではないと思います。

#include <iostream>
#include <string>
#include <cstdio>
#include <cassert>

#include "sfml.hpp"
#include "angelscript.hpp"
#include "MapGenerator.hpp"
#include "TestState.hpp"
#include "std.hpp"

sf::RenderWindow* initialize();

void TestAngelScript();
void MessageCallback(const asSMessageInfo *msg, void *param);

int main()
{   
    std::cout << "Made it into main!!!" << std::endl;
    TestAngelScript();

    std::cout << "Initializing" << std::endl;
    sf::RenderWindow* App = initialize();

    TextureHandler::Initialize();
    FontHandler::Initialize();
    SoundHandler::Initialize();
    MusicHandler::Initialize();
    InputHandler::Initialize(App);
    StateEngine engine;
    IState* state = new TestState(App);
    engine.AddState(state);

    sf::Clock clock;

    while (App->isOpen())
    {
        sf::Event Event;
        while (App->pollEvent(Event))
        {
            // Window closed
            if (Event.type == sf::Event::Closed)
                App->close();

            // Escape key pressed
            if ((Event.type == sf::Event::KeyPressed) && (Event.key.code == sf::Keyboard::Escape))
                App->close();
        }

        // Get elapsed time
        float ElapsedTime = clock.restart().asSeconds();

        engine.Update(ElapsedTime);
        App->clear();
        engine.Draw(App);
        App->display(); 
    }

    return EXIT_SUCCESS;
}

sf::RenderWindow* initialize()
{
    return new sf::RenderWindow(sf::VideoMode(800, 600, 32), "SFML Graphics");
}

// Print the script string to the standard output stream
void print(std::string &msg)
{
  printf("%s", msg.c_str());
}

void TestAngelScript()
{
    // Create the script engine
    asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION);

    // Set the message callback to receive information on errors in human readable form.
    int r = engine->SetMessageCallback(asFUNCTION(MessageCallback), 0, asCALL_CDECL); assert( r >= 0 );

    // AngelScript doesn't have a built-in string type, as there is no definite standard 
    // string type for C++ applications. Every developer is free to register it's own string type.
    // The SDK do however provide a standard add-on for registering a string type, so it's not
    // necessary to implement the registration yourself if you don't want to.
    RegisterStdString(engine);

    // Register the function that we want the scripts to call 
    r = engine->RegisterGlobalFunction("void print(const string &in)", asFUNCTION(print), asCALL_CDECL); assert( r >= 0 );  


    // The CScriptBuilder helper is an add-on that loads the file,
    // performs a pre-processing pass if necessary, and then tells
    // the engine to build a script module.
    CScriptBuilder builder;
    r = builder.StartNewModule(engine, "MyModule"); 
    if( r < 0 ) 
    {
      // If the code fails here it is usually because there
      // is no more memory to allocate the module
      printf("Unrecoverable error while starting a new module.\n");
      return;
    }
    r = builder.AddSectionFromFile("assets\\scripts\\test.as");
    if( r < 0 )
    {
      // The builder wasn't able to load the file. Maybe the file
      // has been removed, or the wrong name was given, or some
      // preprocessing commands are incorrectly written.
      printf("Please correct the errors in the script and try again.\n");
      return;
    }
    r = builder.BuildModule();
    if( r < 0 )
    {
      // An error occurred. Instruct the script writer to fix the 
      // compilation errors that were listed in the output stream.
      printf("Please correct the errors in the script and try again.\n");
      return;
    }

    // Find the function that is to be called. 
    asIScriptModule *mod = engine->GetModule("MyModule");
    asIScriptFunction *func = mod->GetFunctionByDecl("void main()");
    if( func == 0 )
    {
      // The function couldn't be found. Instruct the script writer
      // to include the expected function in the script.
      printf("The script must have the function 'void main()'. Please add it and try again.\n");
      return;
    }

    // Create our context, prepare it, and then execute
    asIScriptContext *ctx = engine->CreateContext();
    ctx->Prepare(func);
    r = ctx->Execute();
    if( r != asEXECUTION_FINISHED )
    {
      // The execution didn't complete as expected. Determine what happened.
      if( r == asEXECUTION_EXCEPTION )
      {
        // An exception occurred, let the script writer know what happened so it can be corrected.
        printf("An exception '%s' occurred. Please correct the code and try again.\n", ctx->GetExceptionString());
      }
    }

    // Clean up
    ctx->Release();
    engine->Release();
}

// Implement a simple message callback function
void MessageCallback(const asSMessageInfo *msg, void *param)
{
  const char *type = "ERR ";
  if( msg->type == asMSGTYPE_WARNING ) 
    type = "WARN";
  else if( msg->type == asMSGTYPE_INFORMATION ) 
    type = "INFO";
  printf("%s (%d, %d) : %s : %s\n", msg->section, msg->row, msg->col, type, msg->message);
}

コンソールには何も出力されず、実行後の入力プロンプトを保存します。プログラムは 0 を返します。

IDE の外でプログラムを実行すると、見つからない DLL (libstdc++-6.dll および libgcc_s_sjlj_1.dll) に関するいくつかのエラーが発生します。これらが提供されると、プロシージャ エントリ ポイントが見つからないというエラーが表示されます...ただし、ネットブックでは文句を言いますSFML オーディオ dll で欠落しているのとほぼ同じポイント....

4

2 に答える 2

3

これは古い質問であることは知っていますが、まだ修正しようとしている場合に備えて。

レンダーウィンドウの初期化関数が問題の可能性が最も高いようです。ローカル変数へのポインターを返していますが、これは機能しますが、ウィンドウを取得できません。

メインの外側でアプリポインターを宣言する必要があります

sf::RenderWindow* App;
void initialize() { /* Initialize render window here. */ };

...

int main() ...

または、より単純なソリューションを使用して、メイン関数でウィンドウを作成することもできます。

...
int main () {
...
sf::RenderWindow App(sf::VideoMode(800, 600), "my window");
...
}

このウィンドウがメインで作成されている場合でも、このウィンドウを関数に渡すことができることに注意してください。

InputHandler::Initialize(&App);

初期化関数がsf::RenderWindow*パラメーターとして取る必要がある場所。

于 2015-02-22T10:59:32.410 に答える
0

sfml ウィンドウが表示されないことについて: これは、ウィンドウが画面の解像度を超えた場合に発生する既知の問題です。通常、レンダリング ウィンドウの高さや幅を小さくすると、問題が解決します。代わりに全画面モードを使用することもできます。

于 2013-04-26T18:16:23.897 に答える