Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Migający kwadrat

Ostatnio zmodyfikowano 2014-03-10 11:33
Autor Wiadomość
MJMJ
Temat założony przez niniejszego użytkownika
Migający kwadrat
» 2014-03-09 20:08:57
Witam,

Zaznaczę na wstępie, że jestem dość początkujący w temacie opengl/glut. Chciałbym wyświetlić kwadrat w trybie pełnoekranowym. To jest w każdym tutorialu, więc to już mam ;) Ponadto, chciałbym żeby zmieniał kolor. Wiem, że mój monitor odświeża się z częstotliwością 60Hz, tak więc kwadrat mógłby zmieniać się najczęściej 30 razy na sekundę. Pytanie, jak to zrobić? Mniej więcej mi się udało, aczkolwiek kwadraty czasem nakładają się na siebie. Ponadto, czy mogę ustawić co ma być wyświetlane w każdej kolejnej ramce wyświetlanej przez monitor? Nie oczekuję gotowego rozwiązania, wystarczy, że ktoś mnie naprowadzi.

C/C++
/*
(c) Janusz Ganczarski (Power)
http://www.januszg.hg.pl
JanuszG(małpeczka)enter.net.pl
*/
#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>

// funkcja generująca scenę 3D
int frame = 1;
int obr = 1;
void Display()
{
    // kolor tła - zawartość bufora koloru
    glClearColor( 1.0, 1.0, 1.0, 1.0 );
    int time = glutGet( GLUT_ELAPSED_TIME );
   
    if(( fmod( time, 33 ) == 0 ) )
    {
        if( obr == 1 )
        {
            obr = 0;
            // czyszczenie bufora koloru
            glClear( GL_COLOR_BUFFER_BIT );
            // początek definicji wielokąta
            glBegin( GL_POLYGON );
            // kolejne wierzchołki wielokąta
            glVertex3f( 0.0, 0.0, 0.0 );
            glVertex3f( 0.0, 1.0, 0.0 );
            glVertex3f( 1.0, 1.0, 0.0 );
            glVertex3f( 1.0, 0.0, 0.0 );
            // koniec definicji prymitywu
            glEnd();
            // kolor kwadratu
            glColor3f( 1.0, 0.0, 0.0 );
            // skierowanie poleceń do wykonania
            glFlush();
            // zamiana buforów koloru
            glutSwapBuffers();
        }
        else if( obr == 0 )
        {
            obr = 1;
            // czyszczenie bufora koloru
            glClear( GL_COLOR_BUFFER_BIT );
            // początek definicji wielokąta
            glBegin( GL_POLYGON );
            // kolejne wierzchołki wielokąta
            glVertex3f( 0.0, 0.0, 0.0 );
            glVertex3f( 0.0, 1.0, 0.0 );
            glVertex3f( 1.0, 1.0, 0.0 );
            glVertex3f( 1.0, 0.0, 0.0 );
            // koniec definicji prymitywu
            glEnd();
            // kolor kwadratu
            glColor3f( 0.0, 1.0, 0.0 );
            // skierowanie poleceń do wykonania
            glFlush();
            // zamiana buforów koloru
            glutSwapBuffers();
        }
    }
    glutSwapBuffers();
    frame++;
    //glutPostRedisplay();
}

// zmiana wielkości okna

void Reshape( int width, int height )
{
    // generowanie sceny 3D
    Display();
}

// stałe do obsługi menu podręcznego

enum
{
    EXIT // wyjście
};

// obsługa menu podręcznego

void Menu( int value )
{
    switch( value )
    {
        // wyjście
    case EXIT:
        exit( 0 );
    }
}

int main( int argc, char * argv[] )
{
    // inicjalizacja biblioteki GLUT
    glutInit( & argc, argv );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH );
    glutGameModeString( "1366x768:16@60" );
    // utworzenie głównego okna programu
    glutEnterGameMode();
    // dołączenie funkcji generującej scenę 3D
    glutDisplayFunc( Display );
    //glutReshapeFunc( Reshape );
    // utworzenie menu podręcznego
    glutCreateMenu( Menu );
    // dodatnie pozycji do menu podręcznego
    #ifdef WIN32
    glutAddMenuEntry( "Wyjscie", EXIT );
    #else
    //glutLeaveGameMode();
    glutAddMenuEntry( "Wyjscie", EXIT );
    #endif
    // określenie przycisku myszki obsługującej menu podręczne
   
    glutAttachMenu( GLUT_RIGHT_BUTTON );
    glutIdleFunc( Display );
    // wprowadzenie programu do obsługi pętli komunikatów
    glutMainLoop();
    return 0;
}
P-105951
PsichiX
» 2014-03-10 11:33:16
swoją drogą: if( frame % 30 = 0 ) { ... }
P-105980
« 1 »
  Strona 1 z 1