我需要创建一个由用户输入决定的NxN游戏板(即如果他们输入6,它将是一个6x6游戏板等),并创建一个类似于游戏的井字游戏。我刚刚开始尝试构建电路板,但我只能在右上角创建一个5 x 5的电路板,我想把它变成全窗口屏幕。这是迄今为止的一些代码:
#include <stdio.h> //for text output
#include <stdlib.h> //for atof() function
#include <GL/glut.h> //GL Utility Toolkit
//to hold for size and tokens for gameboard
float grid, tokens;
void init(void);
/*Function to build the board*/
void buildGrid(float size) {
glBegin(GL_LINES);
for(int i = 0; i < size; i++) {
glVertex2f(0.0, i/5.0f);
glVertex2f(1.0, i/5.0f);
glVertex2f(i/5.0f, 0.0);
glVertex2f(i/5.0f, 1.0);
}
glEnd();
}
/*Callback function for display */
void ourDisplay(void) {
glClear(GL_COLOR_BUFFER_BIT);
buildGrid(grid);
glFlush();
}
int main(int argc, char* argv[]) {
/*User arguments*/
if (argc != 3) {
printf("You are missing parts of the argument!");
printf("\n Need game size and how many in a row to win by\n");
exit(1);
}
/*Take arguments and convert to floats*/
grid = atof(argv[1]);
tokens = atof(argv[2]);
/* Settupp OpenGl and Window */
glutInit(&argc, argv);
/* Set up display */
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(800, 800); // obvious
glutInitWindowPosition(0, 0); // obvious
glutCreateWindow("Tic Tac Oh"); // window title
/* Call the display callback handler */
glutDisplayFunc(ourDisplay);
init();
/* Start the main loop that waits for events to happen and
then to process them */
glutMainLoop();
}
我认为它与glVertex2f的x,y坐标有关,我尝试使用不同的坐标(底片),它只是将盒子移动到窗口的不同四分之一处。我也在想窗户的坐标(800 x 800)需要以某种方式进行操作,但我只是不确定。
答案 0 :(得分:2)
您正在使用旧式固定功能管道,但您没有设置模型 - 视图 - 投影矩阵。这意味着您的OpenGL窗口使用“剪辑空间”坐标,从-1到+1。因此,屏幕的左下角是(-1,-1),右上角是(+ 1,+ 1)。
至少,您可能需要致电glOrtho()
来设置投影矩阵,然后glTranslatef()
和glScalef()
来设置您的模型视图矩阵。 (或者你可以继续在剪辑空间中提供坐标,但这样做并没有什么优势,所以你也可以选择自己的坐标系来让事情更轻松。)
这将在任何OpenGL 1.x教程中介绍,也许你还没读过那么久。寻找短语“矩阵堆栈”,“投影矩阵”,“模型视图矩阵”。