私は最近、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 で欠落しているのとほぼ同じポイント....