2011-03-24 105 views
0

我正在製作一個程序,它將有菜單和子菜單。opengl,改變我的繪製形狀

EDITED --------------------------------------------- ---

當我稱之爲「形狀」子菜單不起作用。

當我調用形狀菜單時,它必須繪製例如一個正方形或三角形或圓形。

我在這裏把我的代碼樣本。

int WXSIZE=400,WYSIZE=400; 
float xmin=-5, xmax=5, ymin=-5, ymax=5; 
int CLEARFLAG=1; 
float xpos=0,ypos=0; 
float x=1.0,y=1.0; 
float col1=1.0,col2=0,col3=0,col4=0,col5=1.0,col6=0,col7=1.0,col8=1.0,col9=0,col10=0.6,col11=0.4,col12=0.7; 
int sub_menu1,sub_menu2,sub_menu3; 
int draw=1; 
float k=0,l=0.5; 

void setupmywindow() 
{ 
    glClearColor(1,1,1,0); 
    gluOrtho2D(xmin, xmax, ymin, ymax); 
} 


void setXYpos(int px, int py) 
{ 
    xpos=xmin+(xmax-xmin)*px/WXSIZE; 
    ypos=ymax-(ymax-ymin)*py/WYSIZE; 
    printf(">>%d %d  %f %f\n",px,py,xpos,ypos); 
} 

.... 
void triangle(float x,float y){ 

    draw==3; 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glColor3f(col1,col2,col3); 

    glBegin(GL_TRIANGLES); 

    glVertex2f(x-l,y+k); 
    glVertex2f(x-k,y+l); 
    glVertex2f(x+k,y+l); 
    glEnd(); 


} 
.... 
void mydraw(float x,float y) 
{ 
     draw==1; 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); 
     glShadeModel(GL_FLAT); 
     glBegin(GL_QUAD_STRIP); 

     glVertex2f(x-l,y+k); 
     glVertex2f(x-l,y+l); 
     glColor3f(col1,col2,col3);glVertex2f(x+k,y+k); 
     glVertex2f(x+k,y+l); 
     glVertex2f(x+l,y+k); 
     glColor3f(col4,col5,col6);glVertex2f(x+l,y+l); 
     glEnd(); 

     glBegin(GL_QUAD_STRIP); 

     glVertex2f(x-l,y-l); 
     glVertex2f(x-l,y+k); 
     glVertex2f(x+k,y-l); 
     glColor3f(col7,col8,col9);glVertex2f(x+k,y+k); 
     glVertex2f(x+l,y-l); 
     glColor3f(col10,col11,col12);glVertex2f(x+l,y+k); 
     glEnd(); 

} 


void mymenu(int n){ 

switch (n) { 

case 1: shape_menu();break; 

case 2: size_menu();break; 

case 3: color_menu();break; 

case 4: clear_menu();break; 

case 5: exit_menu();break; 

} 
glutPostRedisplay(); 
} 

void shape_menu (int n){ 

switch (n) { 

case 2: draw==2;square(xpos,ypos);break; 

case 3: draw==3;triangle(xpos,ypos);break; 

case 4: draw==4;circle(xpos,ypos);break; 


} 
glutPostRedisplay(); 

} 
... 

void myDisplay() 
{ 
    if(CLEARFLAG) glClear(GL_COLOR_BUFFER_BIT); 
    else if (draw==1) {mydraw(xpos,ypos);} 
    else if (draw==2) {triangle(xpos,ypos);} 
    else if (draw==3) {square(xpos,ypos);} 
    else if (draw==4) {circle(xpos,ypos);} 
    glutSwapBuffers(); 
} 

的問題是,當我選擇了改變形狀,它不anything.As你可以看到,我用「畫」來調用相關shape.I要麼有東西出錯了myDisplay功能或shape_menu函數。 謝謝

EDITED ------------------------------------------ ---------------------------------

我終於設法除了一件事情。當它繪製一個我不能移動它,它不響應在窗口中點擊鼠標。 我更正爲:

... 
void shape_menu (int n){ 

switch (n) { 

case 2: draw=2;break; 

case 3: draw=3;break; 

case 4: draw=4;break; 


} 
glutPostRedisplay(); 

} 
... 
void myDisplay() 
{ 
    if(CLEARFLAG) glClear(GL_COLOR_BUFFER_BIT); 
    else if (draw==1) {mydraw(xpos,ypos);} 
    else if (draw==2) {square(xpos,ypos);} 
    else if (draw==3) {triangle(xpos,ypos);} 
    else if (draw==4) {circle(xpos,ypos);} 
    glutSwapBuffers(); 
} 
.... 

,我也移除了我的職務「畫== 1」。 這給圈的功能是:

void circle(float x,float y) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    int numpoints=84; 
    glColor3f(col1,col2,col3); 
    glBegin(GL_LINE_STRIP); 
    int i; 
    for(i=0; i<numpoints; i++) 
    { 
    float angle = i * (2.0*PI/numpoints); 
    x = cos(angle)*l; 
    y = sin(angle)*l; 

    glVertex2f(x,y); 
    } 
    glEnd(); 
} 

應該怎麼管理,以解決我的問題?

回答

1

OpenGL不是場景圖。這是一個繪圖API。

這意味着什麼,你不「添加」對象到某種層次。你需要做的是存儲哪些對象來繪製哪些大小,然後繪製迭代通過這個列表,並根據其中存儲的東西繪製的東西。