天地之灵学习小组
我们学习小组的OpenGL学习笔记 大家一定要互相折磨呀~~
posts - 150,  comments - 156,  trackbacks - 0
刚学OpenGL没有多久就写了一个小程序,希望画一个三角形然后用鼠标控制它上下左右移动,当时程序时写出来了的,但可惜的是无论你按什么键,三角形都无法移动,那个程序就搁浅了一段时间。下午的时候感觉是时候了,遂重新写了一遍。中间出现了许多显而易见的以至于我认为我从来都不会犯的小错误,很幸运的是这些都被我发现并改掉了。但这些个错误改掉之后,三角形依然无法移动。无奈之余去吃晚饭,大概是晚饭回来之后吧,又在网上逛了好多遍,查了老些资料。在一次偶然的运行下,我惊奇的发现了它竟然动了,高兴之余把左右下的键全给附上了事件(暂且称之为事件),然后再次运行竟然又惊奇的发现它又不动了。遂又花了老长的时间捣鼓这个程序,还是解决不了,只好请教婷婷。好长时间过去了,没有得到回复,就在我“心灰意冷”的时候,她给我检测出来了错误。原来我的全局变量取名x,y和keyboard(unsigned key ,int x ,int y)里面的x,y重复了。当时知道了这个错误之后我心里那个不好受啊,这可是低级错误啊,竟然犯了,以前写其它的程序的时候可都没犯过啊。但婷婷说这不是低级错误而是经验,想想也是哦,自己才写了多少代码,大家编写程序的时候遇到的程序何止千千万万,我才遇到几个啊。

这几乎是一下午加班个晚上的劳动成果,贴上来给大家分享分享。只是还发现一个问题,就是按下a键,它不是向左移动,而是向右移动,同样按d键而是向左移动。
#include <stdlib.h>
#include 
<gl/glut.h>
//#include <windows.h>
GLfloat i=0.0,j=0.0;
void init()
{
    glClearColor(
0.0,0.0,0.0,0.0);
    glColor3f(
0.2f,0.8f,0.6f);
}

void draw()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_TRIANGLES);
        glVertex2f(
0.0,0.0);
        glVertex2f(
0.5,0.0);
        glVertex2f(
0.5,0.5);        
    glEnd();
    glutSwapBuffers();
}

void display()
{
    glPushMatrix();
    glLoadIdentity();
    glTranslatef(i,j,
0);
    draw();
    glPopMatrix();
    glFlush();
}


void keyboard(unsigned char key,int x,int y)
{
    
switch(key)
    
{
    
case 'w':
    
case 'W':
        j
+=0.1;
        
if(j>0.5)
            j
=0.5;
        
//display();
        glutPostRedisplay();
        
break;
    
case 's':
    
case 'S':
        j
-=0.1;
        
if(j<-1.0)
            j
=-1.0;
        
//display();
        glutPostRedisplay();
        
break;
    
case 'a':
    
case 'A':
        i
+=0.1;
        
if(i>0.5)
            i
=0.5;
        
//display();
        glutPostRedisplay();
        
break;
    
case 'd':
    
case 'D':
        i
-=0.1;
        
if(i<-1.0)
            i
=-1.0;
        
//display();
        glutPostRedisplay();
        
break;
    
default :
        exit(
0);
        
break;
    }

}

int main(int argc,char *argv[])
{
    glutInit(
&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE
|GLUT_RGB);
    glutInitWindowSize(
500,500);
    glutInitWindowPosition(
100,100);
    glutCreateWindow(argv[
0]);
    init();
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
    
return 0;
}

好了就写到这里,继续OpenGL,继续玛丽医生。

FeedBack:
# re: 10月23日_它真的动了_By risky
2008-10-24 13:41 | 天地之灵
所以像Alpha这样的模式绝对论者,就会建议你,让全局变量全部消失掉吧……
像Vczh这样的MS毒害者就会建议你,在全局变量前面加g_吧
如果是一年前的我,就会建议你,在局部变量前面加下划线吧
如果是现在的我,我就会建议你……
碰到问题别总发呆,打断点调试下阿,否则光靠经验解决不了的问题怎么办呢?
  回复  更多评论
  
# re: 10月23日_它真的动了_By risky
2008-10-24 17:18 | 陈梓瀚(vczh)
囧,我一直跟你说都是说不写全局变量的……我的意见是,main结束之后,不要自动或手动执行任何delete。全局可以通过参数代替……这样的话你的代码就可以随时被复制。

所以,除了类名,其余不加前缀……  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



<2008年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(6)

随笔分类(149)

随笔档案(150)

同道中人

搜索

  •  

积分与排名

  • 积分 - 46018
  • 排名 - 476

最新随笔

最新评论

阅读排行榜

评论排行榜