我一直在尽我所能追查这个问题,我想我已经找到了罪魁祸首,但我无法解决它。
基本上我正在尝试在 Ubuntu 12.04 中运行我的简单游戏引擎。引擎是一个静态库,它链接到正在使用的游戏。一切都可以编译(在 Ubuntu 中),但是当我运行程序时,它永远不会打开窗口并立即关闭。在 CodeBlocks 中,我收到错误“进程以状态 255 终止”。我相信 SetVideoMode 正在返回 null,正如 Init 代码中的这一行所检查的那样:
if((Surf_Display = SDL_SetVideoMode(WindowWidth, WindowHeight, 32,SDL_GL_DOUBLEBUFFER | SDL_OPENGL)) == NULL){
return false;
}
我认为这是因为我之前忘记在 NULL 之前添加双等号,并且在这种情况下,应用程序不会终止,只是永远不会创建一个窗口,但程序显然正在系统监视器中运行。
我还注意到一些有趣的事情。静态库的 Debug 版本是 350 奇数 kb,而程序本身只有 150 kb。在 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;
}
所有以“game”为前缀的函数调用都是实际程序中的外部函数。上面的代码在引擎库中。
如果您需要更多信息,请询问。
编辑:在进一步寻找问题后,我注意到 SDL 给出了这个错误:
Couldn't Find Matching GLX Visual
这是什么意思,我到底该如何解决?