C ++ OpenGL Game Menu Связывание объектов - PullRequest
1 голос
/ 02 марта 2011

Привет, я сейчас пытаюсь разработать игру с использованием C ++ и OpenGL. Я начал с меню и имею два отдельных файла. конечный автомат верхнего уровня, написанный на c ++, и рендеринг 5 блоков в орто-представлении, который действует как меню в openGL.

Как мне связать каждый случай с прямоугольником / «кнопкой»? Я не уверен, как это сделать. (Я немного читал об интерактивных позициях на экране, хотя моя игра может масштабироваться до окна любого размера, что затрудняет его реализацию).

ЭТО ГОСУДАРСТВЕННЫЙ КОД ФАЙЛА МАШИНЫ

#include <windows.h>
#include <gl\GL.h>
#include <GL\freeglut.h>
#include <stdio.h>
#include <iostream>
using namespace std;

int startMenu(){

        int choice;

    cout << "1 new game" << endl;
    cout << "2 options" << endl;
    cout << "3 exit" << endl;
    cin >> choice;
    return choice;
}


void stateNewGame(){

    cout << "loads new game" << endl;
}

void stateOptionMenu(){

    cout << "loads options" << endl;
}


int main(int argc, char * argv []){

    bool exit = false;
    for (;;)
    {
        int choice = startMenu();
        switch(choice)
        {
        case(1):
            stateNewGame();
            break;

        case(2):
            stateOptionMenu();
            break;

        case(3):
            exit=true;
            break;
        default:
            cout<< "select again" << endl;
            break;
        }

    if (exit==true)
            break;
    }

    return 0;
}

ЭТО КОД ОТКРЫТОГО ФАЙЛА

//including windows, gl and glut for graphics
//stdio for buffering
#include <windows.h>
#include <gl\GL.h>
//#include <glut.h>
#include <GL\freeglut.h>
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;

//hold display list
GLuint displist; 

//two variables for window size
int width = 500;
int height = 500;


//orthogonal projection
void orthogonalStart (void) {
    //switch to projection matrix
    glMatrixMode(GL_PROJECTION);

    //start projections
    glPushMatrix();

    //clear previous instructions
    glLoadIdentity();

    //change window size to variables defined
    gluOrtho2D(0, width, 0, height);

    //switch back to model matrix
    glMatrixMode(GL_MODELVIEW);
}

void orthogonalEnd (void) {
    //Switch back to projection mode
    glMatrixMode(GL_PROJECTION);

    //Finish the calls above
    glPopMatrix();

    //Switch back to our model matrix
    glMatrixMode(GL_MODELVIEW);
}

void display (void) {

    //clearing draw buffer painting bkg red
    glClearColor (1.0,0.0,0.0,1.0);
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

     //calling function
         orthogonalStart();

     //declare displist as display list 
     displist = glGenLists(1);

     //compile the new list
     glNewList(displist,GL_COMPILE); 

     //start projections
     glPushMatrix();


     for(int i=0; i<=4; i++){

        //draw a square
        //QUADSTRIP Improvement?
        glBegin(GL_QUADS);
        glColor3f(0,0,1);
        glVertex2f(100, 150);
        glColor3f(0,1,1);
        glVertex2f(100, 100);
        glColor3f(1,0,1);
        glVertex2f(400, 100);
        glColor3f(1,1,1);
        glVertex2f(400, 150);



        //end drawing
        glEnd();

        //end projections
        glPopMatrix();

        //translate start point
        glTranslatef(0, 75, 0);

       glFlush();

    }

   //end the list
       glEndList(); 


//call displist
glCallList(displist);

//calling function
orthogonalEnd();

//move contents of back buffer to front buffer
glutSwapBuffers();
glLoadIdentity ();
glFlush();
}

int main(int argc, char * argv []){

glutInit (&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);
glutInitWindowSize (500, 500);
glutInitWindowPosition (0, 0);
glutCreateWindow ("A Basic Window");
glutDisplayFunc (display);
glutMainLoop ();
return 0;
}

Ответы [ 2 ]

1 голос
/ 03 марта 2011

Кроме того, вы, возможно, захотите взглянуть на концепции графического интерфейса Immediate (imgui), которые могут помочь вам просто обработать взаимодействие между графикой меню и событиями мыши.

Возможно, у вас естьпосмотрите этот учебник или исходный код от nvidia .

Вы также можете найти вдохновение в AntTweakBar .

1 голос
/ 02 марта 2011

В этом руководстве объясняется, как обрабатывать события щелчка мыши. Обработайте щелчок, пройдя по массиву прямоугольников, проверяя, охватывает ли каждый из них нажатую точку. Окна переменного размера можно обрабатывать, просто сохраняя нормализованные прямоугольники (например, отображая ширину и высоту экрана в поле 1024x1024), а также нормализуя точку перед тестированием.

...