私はこの問題をできる限り追跡しており、犯人を見つけたと思いますが、修正することはできません.
基本的に、Ubuntu 12.04 で単純なゲーム エンジンを実行しようとしています。エンジンは静的ライブラリであり、使用中のゲームにリンクされています。すべてが(Ubuntuで)正常にコンパイルされますが、プログラムを実行するとウィンドウが開かず、すぐに閉じます。CodeBlocks で、「プロセスはステータス 255 で終了しました」というエラーが表示されます。Init コードの次の行でチェックされるように、SetVideoMode が null を返していると思います。
if((Surf_Display = SDL_SetVideoMode(WindowWidth, WindowHeight, 32,SDL_GL_DOUBLEBUFFER | SDL_OPENGL)) == NULL){
return false;
}
これは、以前に NULL の前に double equals を追加するのを忘れていたためだと思います。この状態では、アプリは終了せず、ウィンドウを作成することはありませんが、プログラムは明らかにシステム モニターで実行されています。
また、興味深いことに気付きました。スタティック ライブラリのデバッグ バージョンは 350 kb 奇数で、プログラム自体はわずか 150kb です。Windows では、プログラムは常にライブラリのサイズよりも大きくなります。これは、ライブラリが実行可能ファイルに組み込まれていることを前提としています。これはおそらくLinuxの仕組みです。
エンジンの初期化コードは次のとおりです。
#include "Scales.h"
#include "SDL/SDL.h"
#include "GL/gl.h"
#include "GL/glu.h"
#include "SDL/SDL_opengl.h"
#include <iostream>
Engine *scalesEngine;
bool OnInit(int WindowHeight, int WindowWidth){
SDL_Surface* Surf_Display;
if(SDL_Init(SDL_INIT_EVERYTHING) < 0) {
return false;
}
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);
SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2);
if((Surf_Display = SDL_SetVideoMode(WindowWidth, WindowHeight, 32,SDL_GL_DOUBLEBUFFER | SDL_OPENGL)) == NULL){
return false;
}
glClearColor(0.422f,0.576f,1.0f,1.0f);
glClearDepth(1.0f);
glViewport(0, 0, WindowWidth, WindowHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, WindowWidth, WindowHeight, 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);
glLoadIdentity();
game_Init();
return true;
}
int main(int argc, char* argv[]){
scalesEngine = new Engine;
game_preload();
if(OnInit(scalesEngine->WindowHeight(), scalesEngine->WindowWidth()) == false){
return -1;
}
SDL_Event Event;
//Main Game Loop
while(scalesEngine->Running){
while(SDL_PollEvent(&Event)){
scalesEngine->OnEvent(&Event);
}
scalesEngine->Update();
scalesEngine->Render();
}
scalesEngine->OnCleanUp();
delete scalesEngine;
return 0;
}
「ゲーム」で始まるすべての関数呼び出しは、実際のプログラムでは extern 関数です。上記のコードはエンジン ライブラリにあります。
さらに詳しい情報が必要な場合は、お問い合わせください。
編集:問題をさらに追跡した後、SDL が次のエラーを出すことに気付きました:
Couldn't Find Matching GLX Visual
これはどういう意味ですか、どうすれば修正できますか?