1

我正在尝试使用glTranslate.

我使用以下代码使用 OpenGL 绘制正方形:

    void drawEnemy (RECT rect){
    glPushMatrix();

    //move enemy left then right
    glTranslatef(+right, 0.0, 0.0); //animate right
    glTranslatef(-left, 0.0, 0.0); //animate left

    glBegin(GL_QUADS);
    glColor3f(238, 0.0, 0.0);
        glVertex3f(rect.x, rect.y, 0.0);
    glColor3f(128, 0.0, 128);
        glVertex3f(rect.x, rect.y+rect.h, 0.0);
    glColor3f(238, 0.0, 0.0);
        glVertex3f(rect.x+rect.w, rect.y+rect.h, 0.0);
    glColor3f(128, 0.0, 128);
        glVertex3f(rect.x+rect.w, rect.y, 0.0);
        glEnd();
    glPopMatrix();
    }

我正在尝试控制沿 x 轴覆盖的长度,然后使用此代码以相反的方向返回:

    void timer(int t)
    {   
    right +=0.5f;
    if(right>=platform1.x+platform1.w)
        right-=0.5f;

    left+=0.5f;
    if(left<=platform1.x)
        left-=0.5f;

    glutPostRedisplay();
    glutTimerFunc(25,timer,0);
    }

我知道 Opengl 只是一个图形包,不一定用于动画,但出于自学的目的,我真的很想尽可能简单地实现这一点。

目前,该程序使广场永远正确。

4

2 回答 2

3

你为什么将你的动作表达为两个(leftright)的组合?这似乎过于复杂。

只需使用单个posX变量,并根据按键增加/减少它。

于 2013-03-21T13:19:21.820 回答
2

看这行代码:

if(left<=platform1.x)
    left-=0.5f;

如果left = 0和会发生什么platform1.x = 1

编辑:

听起来您想要跟踪当前位置和移动方向,如下所示:

double dir = 1;
double x = platform1.x;

void timer(int t) { 
   x += dir;
   if(x < platform1.x || x > platform1.x + platform1.w) {
      dir = -dir;
      x += dir;
   }
   ...
}

void drawEnemy(RECT rect) {
   ...
   glTranslatef(x, 0.0, 0.0);
   ...
}
于 2013-03-21T13:19:46.510 回答