我正在编写一个程序,当用户点击鼠标时绘制一个正方形,然后用户可以向上,向下,向左和向右移动它。用户移动对象时的问题是隐藏
任何人都可以帮助我。
这是代码示例
#include <GL/glut.h>
#include<iostream.h>
#define ORTHO_SCALE 10.
GLint triangle_vertices[] = {15, 20,30, 20,10, 15};
GLint triangle_vertices2[] = {50, 70,80, 90,100, 130};
struct {
struct {
struct {
GLfloat x, y;
} pos;
GLfloat rot;
} triangle;
} sceneinfo;
void clearScreen()
{
glutSwapBuffers();
glColor3f (1.0, 1.0, 1.0);
int ver[]={38,0,1143,0,1143,800,38,1105};
glPushMatrix();
glEnableClientState( GL_VERTEX_ARRAY );
glVertexPointer(2, GL_INT, 0, ver);
glDrawArrays(GL_QUADS, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);
glPopMatrix();
glutSwapBuffers();
}
void mouse(int btn, int state, int x, int y)
{
if(btn==GLUT_RIGHT_BUTTON && state==GLUT_DOWN)
exit(0);
if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN)
{
glutSwapBuffers();
glPushMatrix();
glTranslatef(sceneinfo.triangle.pos.x, sceneinfo.triangle.pos.y, 0);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_INT, 0, triangle_vertices2);
glDrawArrays(GL_TRIANGLES, 0, 3);
glPopMatrix();
glutSwapBuffers();
}
}
void display(void);
void special(int key, int x, int y);
void init (void)
{
glClearColor (1.0, 1.0, 1.0, 0.0); // Set display-window color to white.
glMatrixMode (GL_PROJECTION); // Set projection parameters.
gluOrtho2D (0.0, 200.0, 0.0, 150.0);
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutCreateWindow("test");
init();
glutDisplayFunc(display);
glutSpecialFunc(special);
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}
void display(void)
{
glColor3f(0.0, 0.0, 0.0);//set color of object
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(sceneinfo.triangle.pos.x, sceneinfo.triangle.pos.y, 0.);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_INT, 0, triangle_vertices);
glDrawArrays(GL_TRIANGLES, 0, 3);
glPopMatrix();
glutSwapBuffers();
}
void special(int key, int x, int y)
{
switch(key) {
case GLUT_KEY_LEFT:
sceneinfo.triangle.pos.x -= 0.2;
break;
case GLUT_KEY_RIGHT:
sceneinfo.triangle.pos.x += 0.2;
break;
case GLUT_KEY_UP:
sceneinfo.triangle.pos.y += 0.2;
break;
case GLUT_KEY_DOWN:
sceneinfo.triangle.pos.y -= 0.2;
break;
}
glutPostRedisplay();
}
答案 0 :(得分:1)
我没有使用过剩,但我可以看到两个潜在的问题:
您可能不应该使用mouse()
函数。此外,你在这里交换缓冲区两次,这不会产生理想的结果。
您似乎没有在任何地方初始化sceneinfo
,但这会从一开始就影响渲染。
后续步骤:初始化sceneinfo
,以便您知道它包含有效值并从mouse()函数中删除绘图代码。如果你仍然有问题,我会使用调试器(或者在最坏的情况下写入日志)来查看sceneinfo.triangle.pos
发生了什么 - 它的增长速度可能比预期的要快得多,具体取决于键盘输入的方式处理。