Dev-C++编译SDL和OpenGL程序的方法

用wxDev-C++编译SDL和OpenGL程序,就是同时包含SDL.h和gl.h头文件的程序。之前反复弄也弄不出来,去百度知道提问,不但没有得到帮助,还惹来一疯子,叫嚣“为什么放着好用的Visual Studio 系列不用,而非要用wxDev-C++之类的?现在有很多书,或者人在误导大家,用什么命令行编译,看起来很酷,但实际毫无用处,这些事交给编译器做有什么不好呢?有这些精力多集中在代码和算法上不是很好么? 那你倒说说开源的好在哪?现在跟风的人真是不少”。这种人一看就知道相当自私的,不解决问题还一个劲的叫嚣,让人看了就不爽。

        不说Visual Studio系列的好坏,可是也没有见过自私到看别人开源都不爽的人啊,疯子到处都有,看来以后百度问问题得小心一些了。如果命令行真的毫无用处,相信Windows也不会保留CMD了,跟疯子是没有道理可讲的。

      关闭提问问题,自己解决。逛了几圈国外的论坛和国内的CSDN以后。终于有了灵感。有一次编译的时候报错:[Linker error] undefined reference to `WinMain@16' ,百度谷歌了好久,说是找不到程序的编译入口,用MingW32的时候要将-lmingw32放在连接器命令的最前面才可以,这才知道,原来连接器命令是有顺序的,于是开始反复调整顺序,终于,调试出来了:

     -lmingw32 -lSDLmain -lopenGL32 -lglu32 -lglut32 -mwindows -lopengl32 -lglu32 –lSDL

然后就可以编译运行了,按上下左右方向键就可以旋转那三条直线。

下面是程序的源码:testSDLGL.cpp

/*

坐标观察程序,

ESC:退出

F5:复位

LEFT/RIGHT:以绿色Y为轴心旋转

UP/DOWN:以红色X为轴心旋转

PAGEUP/PAGEDOWN:以蓝色z为轴心旋转

*/

#include <GL/gl.h>

#include <SDL/SDL.h>

bool running=true;

float x=0.0,y=0.0,z=0.0;

enum Target{modelview,projection};

Target target=modelview;

 

void initGL()

{

    SDL_Init(SDL_INIT_VIDEO);

    SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,SDL_DEFAULT_REPEAT_INTERVAL);

    SDL_SetVideoMode(600,300,16,SDL_OPENGL);

 

}

void destroyGL()

{

    SDL_Quit();

}

void drawCoordinate()

{

    glBegin(GL_LINES);

        glLineWidth(10.0f);

        glColor3f(1,0,0);

        glVertex3f(0,0,0);

        glVertex3f(1,0,0);

        glColor3f(0,1,0);

        glVertex3f(0,0,0);

        glVertex3f(0,1,0);

        glColor3f(0,0,1);

        glVertex3f(0,0,0);

        glVertex3f(0,0,1);

    glEnd();

 

}

void draw()

{

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    if(target==modelview)

    {

        glMatrixMode(GL_MODELVIEW);

    }

    else

    {

        glMatrixMode(GL_PROJECTION);

    }

    glLoadIdentity();

    glRotatef(x,1,0,0);

    glRotatef(y,0,1,0);

    glRotatef(z,0,0,1);

    glMatrixMode(GL_MODELVIEW);

    drawCoordinate();

 

    SDL_GL_SwapBuffers();

 

}

void switchTarget()

{

    if(((int)target+1)>((int)projection))

    {

        target=modelview;

    }else

    {

        target=(Target)((int)target+1);

    }

}

void reset()

{

    x=0;

    y=0;

    z=0;

}

void quit()

{

    running=false;

}

void onKeyDown(const SDL_Event& event)

{

    switch(event.key.keysym.sym)

    {

    case SDLK_ESCAPE:

    quit();

    break;

    case SDLK_TAB:

    switchTarget();

    break;

    case SDLK_F5:

    reset();

   break;

    case SDLK_LEFT:

    y+=1;

    break;

    case SDLK_RIGHT:

    y-=1;

    break;

    case SDLK_UP:

    x+=1;

    break;

    case SDLK_DOWN:

    x-=1;

    break;

    case SDLK_PAGEUP:

    z+=1;

    break;

    case SDLK_PAGEDOWN:

    z-=1;

    break;

 

    }

}

void loop()

{

    SDL_Event event;

    while(running)

    {

        while(SDL_PollEvent(&event))

        {

            switch(event.type)

            {

            case SDL_QUIT:

                quit();

            break;

            case SDL_KEYDOWN:

                onKeyDown(event);

            break;

            }

        }

        draw();

        SDL_Delay(50);

    }

 

}

int main(int argc,char* argv[])

{

    initGL();

    loop();

    destroyGL();

    return 0;

}

 

程序运行后的结果,旋转了一下直线的位置,要不刚运行出来就两条直线,要旋转才能看到第三条。

 

 

经过测试和精简,最后连接器的命令为:-lmingw32 -lSDLmain -lSDL -lglut32 -mwindows -lopengl32
其中-mwindows若去掉的话,会显示命令行窗口。

最后不要忘记将SDL.dll放到本程序所在路径。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值