我正在尝试使用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只是一个图形包,并不一定用于动画,但出于自学习的目的,我真的希望尽可能简单地实现。
目前该计划使广场永远正确。
答案 0 :(得分:3)
为什么您将自己的动作表达为两个(left
和right
)的组合?这似乎过于复杂。
只需使用一个posX
变量,然后根据按键增加/减少它。
答案 1 :(得分: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);
...
}