0

我正在使用 Dev-C++ 4.9.9.2(不要问为什么)和 SDL 1.2.8。

接下来我创建了新项目:SDL&GL。该项目已经包含一些代码:

#include <SDL/SDL.h>
#include <gl/gl.h>

int main(int argc, char *argv[]){
    SDL_Event event;
    float theta = 0.0f;

    SDL_Init(SDL_INIT_VIDEO);
    SDL_SetVideoMode(600, 300, 0, SDL_OPENGL | SDL_HWSURFACE | SDL_NOFRAME);

    glViewport(0, 0, 600, 300);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0);
    glDepthFunc(GL_LESS);
    glEnable(GL_DEPTH_TEST);
    glShadeModel(GL_SMOOTH);
    glMatrixMode(GL_PROJECTION);
    glMatrixMode(GL_MODELVIEW);

    int done;
    for(done = 0; !done;){
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glLoadIdentity();
        glTranslatef(0.0f,0.0f,0.0f);
        glRotatef(theta, 0.0f, 0.0f, 1.0f);

        glBegin(GL_TRIANGLES);
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex2f(0.0f, 1.0f);
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex2f(0.87f, -0.5f);
        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex2f(-0.87f, -0.5f);
        glEnd();

        theta += .5f;
        SDL_GL_SwapBuffers();
        SDL_PollEvent(&event);
        if(event.key.keysym.sym == SDLK_ESCAPE)
            done = 1;
    }
    SDL_Quit();
    return(0);
}

接下来我编译了项目并尝试运行它。运行后程序显示不到 1 秒并立即终止。调试器返回以下错误:“程序中引发访问冲突(分段错误)”。

我正在使用带有最新驱动程序的 Windows 2003 和 Radeon x1950 PRO。

我已经在装有 Windows XP 的笔记本电脑上测试了程序,它运行良好。为什么这个程序不能在我的电脑上运行?

4

3 回答 3

2

它也适用于我。我会尝试删除 SDL_HWSURFACE 并从窗口调用中添加 SDL_DOUBLEBUF 。

SDL_SetVideoMode(600, 300, 0, SDL_OPENGL | SDL_NOFRAME | SDL_DOUBLEBUF);

while(!done) 看起来更漂亮,更易于阅读。既然它是用 C++ 标记的,你为什么不为此使用布尔值呢?

bool done = false;
while(!done){

您还需要 while(SDL_PollEvent(&event)),因为每帧可以有多个事件。

while(SDL_PollEvent(&event))
{
    switch(event.type)
        case SDL_KEYDOWN:
            if(event.key.keysym.sym == SDLK_ESCAPE)
                done = true;
}
于 2009-10-30T10:33:33.593 回答
0

我的猜测是它在 SDL_PollEvent() 上崩溃了。如果有事件,则返回 1/true,否则返回 0/false。当它确实返回 true 时,它​​将是基于 event.type 的某种类型的 SDL_Event。SDL_Event 是所有 SDL 事件的联合,一个事件中的某些信息不能保证与另一个事件的顺序、类型等相同。因此,您只需要检查事件的类型并根据需要进行处理。当然,请查看文档以获取更多信息。像这样的东西:

if (SDL_PollEvent(&event)) {
  switch (event.type) {
    case SDL_KEYUP:
      if (event.key.keysym.sym == SDLK_ESCAPE)
        done = 1;
  }
}
于 2009-10-27T23:50:20.143 回答
0

我终于找到了一些时间来解决这个问题。我已经完全卸载了旧显卡驱动程序并使用 Catalyst Control Center 安装了 9.8 ATI 驱动程序。现在一切正常。

代码本身没有问题。问题出在我的系统中带有图形驱动程序。无论如何感谢您的回答!

于 2009-11-05T12:45:01.103 回答