如何在OpenGl中制作2d国际象棋棋盘

时间:2014-02-26 06:24:59

标签: c++ opengl

我必须使用VisualC ++在OpenGL中制作一个8 * 8块的2d棋盘。我有以下代码,我尝试过。

但是我在这段代码中遇到了问题。

  1. 我无法减小电路板尺寸。例如5 * 5。
  2. 当我点击窗口时,它会重新绘制电路板。
  3. 我想让这段代码只使用循环。除了If,Else。

  4. #include<GL\glut.h>
    
    int black=0,white=1,color=0;
    GLint a1=10,b1=10,a2=30,b2=30;
    
    void init (void)
    {
      glClearColor (0.0, 0.0,1.0,0.0);
      glMatrixMode (GL_PROJECTION);
      glClear (GL_COLOR_BUFFER_BIT);
      gluOrtho2D (0.0,120.0,0.0,140.0);
    }
    
    void lineSegment ()
    {       
      for(int i=0;i<3;i++)
      {
        if(b2<120)
        {
          a1=10;b1=b2;
          a2=30;b2=b2+20;
        }
        for(int j=0;j<5;j++)
        {
          if(a2<120)
          {
            if(color==black)
            {
              glColor3f(0,0,0);
              glRecti(a1,b1,a2,b2);
              color=1;
              a1=a2;
              a2=a2+20;
            }
            else
            {                   
              glColor3f(1,1,1);
              glRecti(a1,b1,a2,b2);
              color=0;
              a1=a2;
              a2=a2+20;
            }
          }
        }
        //GLint a1=10,b1=10,a2=30,b2=30;    
      }         
      glFlush();
    }       
    
    void main (int argc, char** argv)
    {       
      glutInit(&argc,argv); //Initialize GLUT.
      glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); // Set display mode.
      glutInitWindowPosition (50,100); //Set top-left display-window position.
      glutInitWindowSize (400,300); //Set display-window width and height.
      glutCreateWindow ("An Example OpenGL Program"); //Create display window.
    
      init(); // Execute initialization procedure.
    
      glutDisplayFunc(lineSegment); //send graphics to display window.
      glutMainLoop(); //display everything and wait.
    }
    

1 个答案:

答案 0 :(得分:1)

我建议你大大减少你正在使用的代码。定义电路板的宽度和高度以及电路板每侧的分割数。

让我们分别将宽度和高度分别定义为wh以及分割数nm。 w.l.o.g.假设nm均匀划分wh

void DrawBoard(int w, int h, int n, int m) {
  bool color = true;
  int sw = w/n, sh = h/m; //square width and height respectively
  //for each width and height draw a rectangle with a specific color
  for(int i = 0; i < n; ++i) {
    for(int j = 0; j < m; ++j) {
      //oscillate the color per square of the board
      if(color)
        glColor3f(1, 1, 1);
      else
        glColor3f(0, 0, 0);
      color = !color;

      //draw a rectangle in the ith row and jth column
      glRecti(i*sw, j*sh, (i+1)*sw, (j+1)*sh);
    }
    if(m % 2 == 0) color = !color; //switch color order at end of row if necessary
  }
}

这应该给出基本的想法,尽管我可能已经提升了一两个指数。但实际上,迭代网格单元格并在每个方块上绘制一个矩形。

此代码还将从坐标(0,0)开始并在(w,h)结束时绘制板。但是,如果您希望它处于任意位置,您可以在glRecti调用中向eaxh对应的坐标添加(x,y),或者在openGL中了解变换并使用glTranslatef