OpenGL中glTranslatef无法生效,方块移动功能失效求助
问题分析与修复方案
核心问题:变换顺序错误
你在ShapeMove函数里先调用glCallList(SQ)绘制方块,之后才执行glTranslatef变换——OpenGL的变换只作用于后续的绘制指令,已经完成的绘制不会受影响,所以方块永远停在初始位置,看不到移动效果。
其他次要问题
- 变量赋值语法错误:
Make_Square里的t,r = 400;和b,l = 200;是错误的C语法,只会给r和l赋值,t和b会是随机值,必须逐个赋值。 - 移动步长过大:
dir初始值设为10,窗口仅600像素,方块200像素宽高,一步10像素会导致移动过快甚至瞬间出边界,建议调小到1或2,让移动更平滑。 - 碰撞检测时机滞后:当前碰撞检测在绘制之后执行,会导致方块出界后才反向,应该先处理碰撞再绘制。
修复后的关键代码修改
修正ShapeMove函数
void ShapeMove(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); // 先处理碰撞与方向反转 if(r > ww || l < 0 || t > wh || b < 0) dir *= -1; // 根据方向更新方块边界并应用变换 if(dirVH == 1) { t += dir; b += dir; glTranslatef(0.0, dir, 0.0); } else if(dirVH == -1) { l += dir; r += dir; glTranslatef(dir, 0.0, 0.0); } // dirVH=0时不执行任何变换 // 绘制方块(此时变换已生效) glCallList(SQ); glFlush(); }
修正Make_Square里的赋值语句
void Make_Square() //Creates the Square List { glNewList(SQ, GL_COMPILE); //Starts the List glColor3f(0,0,0); //Sets color to Black glBegin(GL_POLYGON); //Begins to Draw Polygon glVertex2d(200,400); glVertex2d(200,200); glVertex2d(400,200); glVertex2d(400,400); //Creates a 200x200px Square glEnd(); // 修正变量赋值 t = 400; r = 400; b = 200; l = 200; //Stores the x,y max and min values of the square, to see if it hit edge. glEndList(); //Ends the List }
调整dir初始值
将static GLfloat dir = 10, dirVH = 1;改为static GLfloat dir = 2, dirVH = 1;,降低移动速度。
额外优化
在myinit函数末尾添加Make_Square();,确保程序启动时t/b/l/r被正确初始化,避免初始碰撞检测异常。
内容的提问来源于stack exchange,提问作者Neckbeard
相关产品推荐
相关产品推荐

