-3

ここで私は2点を持っています.1つは固定され、もう1つはマウスクリックによって変更されます.固定点を移動点に向かって移動させ、その動きを出力に表示したい..今まで、固定点(黄色)は移動しません赤い

   #include <iostream>
   #include <stdlib.h> //Needed for "exit" function
   //Include OpenGL header files, so that we can use OpenGL
   #include <glut.h>
   using namespace std;
    void init();
   void display();
   float a = 200.0, b= 200.0;
   void setPoint(float x, float y){
   glColor3f(1.0, 0.0, 0.0);  //drawing object
   glBegin(GL_POINTS);
   glVertex2f(x,y);
   glEnd();

   }
  int m=50;
  int n=50;
  void setPoint2(int m,int n){
  glColor3f(1.0, 1.0, 0.0);  //drawing object
  glBegin(GL_POINTS);
  glVertex2f(m,n);
  glEnd();
   }

 void init(){
 glClearColor(1.0,1.0,1.0,1.0);
 gluOrtho2D(0.0, 400.0, 0.0, 300.0);
   }
 void display(){
  glClear( GL_COLOR_BUFFER_BIT);   //defult point
  glPointSize(10.0);
  setPoint(a,b);
  setPoint2(m,n);
  glFlush();
  }
  void update(){
while(a!=m || b!=n){
if(a>m&&b>n)
{
    m++;
    n++;
    setPoint2(m,n);

}
else if(a>m&&b<n)
{
    m++;
    n--;
    setPoint2(m,n);

}
else if(a<m&&b>n)
{
    m--;
    n++;
    setPoint2(m,n);

}
else  if(a<m&&b<n)
{
    m--;
    n--;
    setPoint2(m,n);

}

    //  glTranslatef(m,n,0);    
}


    }
    void mouse(int mouse, int state, int x, int y){
    switch(mouse){
    case GLUT_LEFT_BUTTON:
    if(state == GLUT_DOWN){
    cout << x << " -> " << y << endl;

    /*a=x;
    b=y;*/
    a = x/1.0;
    b = 300.0 - (y/1.0);

   glutPostRedisplay();

  }
 break;

   }

  }
  int main(int argc, char* argv[]){
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
  glutInitWindowSize(400,300);
  glutInitWindowPosition(200,100);
  glutCreateWindow("OpenGL Program");
  init();
  glutDisplayFunc(display);
  glutMouseFunc(mouse);
 //glutTimerFunc(25,update, 0); //Add a timer
 glutMainLoop();
      return 0;
     }

赤色の点(可変のもの)をデバッグしているときに、固定のもの(黄色)の問題をマウスでクリックすると表示されますが、私が望むように赤に移動しませんでした

4

1 に答える 1

0

ここで最も明白な 2 つの問題は、update 関数を呼び出すものが実際にはないように見えることです。もしそうなら、移動コードは斜めの移動のみを行うように特化されているため、ポイントが水平線または垂直線にある場合、動かない。

glutPostRedisplay()GLUT を使用してからしばらく経ちますが、一般的に行うべきことは、update() ロジックを「アイドル」コールバックに入れ、最後にa を実行することだと思います。

それとは別に、非常に多くのグローバル、特に名前が関数引数の名前を反映している単一文字の名前付きグローバルの使用は、ひどく混乱します。

于 2012-12-26T23:40:50.577 に答える