Wyświetlenie menu w grze, czyli zmiana widoku na 2D

0

Witam, chciałbym w mojej grze 3d wyświetlić małe menu u dołu ekranu, które będzie pokazywało ile mamy życia.
Niestety okazało się, że nie do końca potrafię "przeskoczyć" z widoku 3d do 2d nie naruszając modeli 3d :/
Wiem że to trochę skomplikowane, ale liczę że mi pomożecie.
Z góry dzięki.

0

A jak to dotychczas robisz? I w czym to robisz? Jak chcesz rysować GUI to rysujesz je na końcu jako najwyższa warstwa. Możesz textury nakładać albo inaczej jak chcesz.

0
xeo545x39 napisał(a)

A jak to dotychczas robisz? I w czym to robisz? Jak chcesz rysować GUI to rysujesz je na końcu jako najwyższa warstwa. Możesz textury nakładać albo inaczej jak chcesz.

Naczy teraz zrobiłem tyle:

void Menu::Menuwgrze(){
    glLoadIdentity();
    std::cout << std::endl << zmienne::przycisk;
    glTranslatef(1.0f,2.0f,0.0f);
    glColor3f(0.0,1.0,1.0);
    glBegin(GL_TRIANGLES);         // Rysujemy kwadraty
        glVertex3f(-1.0f, 1.0f, 0.0f);         // górny lewy
        glVertex3f( 1.0f, 1.0f, 0.0f);         // górny prawy
        glVertex3f( 1.0f,-1.0f, 0.0f);         // dolny prawy
    glEnd();         // Koniec rysowania kwadratu
}

(Wiem, kod nie jest mistrzowski).
Miało to wyglądać tak, że ja się normalnie mogę rozglądać po świecie itp. a na ekranie widnieje sobie trójkąt w nienaruszonej pozycji.
Robię to w OpenGl'u, w GLUT'cie.

0

A konkretnie co się dzieje z tymi modelami?

0
xeo545x39 napisał(a)

A konkretnie co się dzieje z tymi modelami?

Nie ma ich :P Nie wyświetla się ten trójkąt.

0

Jak chcesz sobie zrobić rysowanie OSD to ważną rzeczą jest wyłączenie DEPTH_TEST. Czyli przed rysowaniem OSD piszesz:

glDisable(GL_DEPTH_TEST);

A po rysowaniu:

glEnable(GL_DEPTH_TEST);

To samo robisz z oświetleniem, żeby światło nie wpływało na OSD. No i to wszystko robisz po rysowaniu sceny, bo po wyłączeniu badania głębi ważna jest kolejność rysowania. Żeby OSD stało w miejscu, a nie było zależne od ruchów kamery, przed rysowaniem dopisz:

glLoadIdentity();
0
Spine napisał(a)

Jak chcesz sobie zrobić rysowanie OSD to ważną rzeczą jest wyłączenie DEPTH_TEST. Czyli przed rysowaniem OSD piszesz:

glDisable(GL_DEPTH_TEST);

A po rysowaniu:

glEnable(GL_DEPTH_TEST);

To samo robisz z oświetleniem, żeby światło nie wpływało na OSD. No i to wszystko robisz po rysowaniu sceny, bo po wyłączeniu badania głębi ważna jest kolejność rysowania. Żeby OSD stało w miejscu, a nie było zależne od ruchów kamery, przed rysowaniem dopisz:

glLoadIdentity();

Czy o to ci chodziło?

void Menu::Menuwgrze(){
    glDisable(GL_DEPTH_TEST);
    std::cout << std::endl << zmienne::przycisk;

    glTranslatef(1.0f,2.0f,0.0f);
    glColor3f(0.0,1.0,1.0);
    glLoadIdentity();
    glBegin(GL_TRIANGLES);         // Rysujemy kwadraty
        glVertex3f(-1.0f, 1.0f, 0.0f);         // górny lewy
        glVertex3f( 1.0f, 1.0f, 0.0f);         // górny prawy
        glVertex3f( 1.0f,-1.0f, 0.0f);         // dolny prawy
    glEnd();         // Koniec rysowania kwadratu
    glEnable(GL_DEPTH_TEST);
} 

Bo nie działa.

0

Pokaż funkcje rysujące resztę (i wywołującą metodę Menuwgrze).

0
Spine napisał(a)

Pokaż funkcje rysujące resztę (i wywołującą metodę Menuwgrze).

/* The main drawing function. */
void DrawGLScene()
{
    //Ukryj myszkę
    if(zm.ukrywaniemyszki == true){
        glutWarpPointer(zm.window_width / 2, zm.window_height / 2); //ustawiam na srodku ekranu
        glutSetCursor(GLUT_CURSOR_NONE); //ukrycie myszki
    }

    glutSetWindow(zm.window);        //Ustala aktywne okno

    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);        // Czyści okno i bufor głebokości
    glLoadIdentity();                                // Restartuje widok

    //Funckje Rotate pozwalają rozglądać się.
    glRotatef(zm.lookUpDown,1.0f,0.0f,0.0f); //Obrot w osi X
    glRotatef(zm.lookLeftRight,0.0f,1.0f,0.0f); //Obrot w osi Y

    glTranslatef(0.0+zm.playerX, 0.0 + zm.playerY, 0.0 + zm.playerZ); //przesuwa obraz :)

    //Ustawiam kolor
    glColor3f(0.0f, 1.0f, 1.0f);

    //Wczytuję wierzchołki.
    //v.UstawDane();
    //Wyświetlam wierzchołki.
    v.ShowVertices();
    //Wyświetlam celownik
    c.MainCelownik();

    //Wczytuję kolor z pixela.
    //unsigned char pixel[3];
    //glReadPixels(zm.mouse_x, zm.mouse_y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel);
    //std::cout << "R: " << (int)pixel[0] << std::endl;
    //std::cout << "G: " << (int)pixel[1] << std::endl;
    //std::cout << "B: " << (int)pixel[2] << std::endl;
    //std::cout << std::endl;
    m.Menuwgrze(); //TUTAJ!!!! -----------------------------------------------
    update();
    glFlush();
    glutSwapBuffers();
} 
0

Na początek powinieneś oddzielić od siebie przekształcenia rysowania.

Te funkcje, cytuję "Funckje Rotate pozwalają rozglądać się.", działają na wszystko co rysujesz poniżej, Translate też. Musisz te przekształcenia razem z rysowaniem opakować w blok glPushMatrix(), glPopMatrix();

glPushMatrix();
    //Funckje Rotate pozwalają rozglądać się.
    glRotatef(zm.lookUpDown,1.0f,0.0f,0.0f); //Obrot w osi X
    glRotatef(zm.lookLeftRight,0.0f,1.0f,0.0f); //Obrot w osi Y

    glTranslatef(0.0+zm.playerX, 0.0 + zm.playerY, 0.0 + zm.playerZ); //przesuwa obraz :)

    //Ustawiam kolor
    glColor3f(0.0f, 1.0f, 1.0f);

    //Wczytuję wierzchołki.
    //v.UstawDane();
    //Wyświetlam wierzchołki.
    v.ShowVertices();
    //Wyświetlam celownik
    c.MainCelownik();
glPopMatrix();

To samo robisz z m.Menuwgrze(); tak na zaś ;)

Nie wiem czy od razu zobaczysz to co chciałeś, ale powinieneś zrobić to co napisałem. To glLoadIdentity w metodzie Menuwgrze myślę, że możesz wywalić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0