2017-10-15 7 views
-1

Ich spiele mit der Fähigkeit, die Anzeige von zwei verschiedenen Texturen auf einem Quad-Whed-Reihe (Position) der Musik zu synchronisieren. Die Musik ist im Tracker-Format. Es besteht aus Mustern, die Zeilen enthalten. Die API des Trackers gibt die aktuell spielende Zeile zurück. Ich muss nur einmal die erste Textur auf dem Quad und dann erst einmal die zweite Textur anzeigen, wenn sich die Position ändert. In DrawGLScene() wird die drawNoise()-Funktion immer in jeder Iteration aufgerufen. Eine Zeile Musik dauert 0,09 Sekunden. Die Variable intPosCurrVal hat für diese 0,09 Sekunden denselben Wert. Daher wird die Funktion oft für einen Zeitraum von 0,09 Sekunden für denselben Wert von intPosCurrVal aufgerufen. Die Variable intPosCurrVal wird erhöht, wenn die nächste Musikzeile abgespielt wird. Ich möchte nur einmal für den gleichen Wert der intPosCurrVal Variable aufrufen. Mit anderen Worten, in der Hauptzeichenfunktion, die die ganze Zeit genannt wird, würde Ich mag nur einmal die Funktion drawNoise() als der Wert der intPosCurrVal Variable erhöht rufen von 1.Ausführung der Funktion nur einmal

Hauptzeichenfunktion:

int DrawGLScene(GLvoid)      
{ 
    int posCurrVal = Music_GetPosition(); 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glClearColor(1.0f, 1.0f, 1.0f, 0.0f); 

    drawNoise(intPosCurrVal); 
    // some other code 

    glFlush(); 
    return TRUE;  
} 

drawNoise Funktion:

void drawNoise(int x) 
{ 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_DEPTH_TEST); 

    if(x > prev) 
    { 
     glBindTexture(GL_TEXTURE_2D, texPosNoise); 
     prev = x; 
    } 
    else 
    { 
     glBindTexture(GL_TEXTURE_2D, texNegNoise); 
    } 

    glBegin(GL_QUADS); 
    glColor3f(1.0f, 1.0f, 1.0f); 
    glTexCoord2f(0.0, 0.0); glVertex3f(- 15.0, - 15.0, 0.0); 
    glTexCoord2f(0.0, 1.0); glVertex3f(- 15.0, 15.0, 0.0); 
    glTexCoord2f(1.0, 1.0); glVertex3f(15.0, 15.0, 0.0); 
    glTexCoord2f(1.0, 0.0); glVertex3f(15.0, - 15.0, 0.0); 
    glEnd(); 

    glDisable(GL_TEXTURE_2D); 
    glDisable(GL_DEPTH_TEST); 
} 

Danke im Voraus

+3

Speichern Sie 'posCurrVal', rufen Sie' drawNoise' nur dann auf, wenn der gespeicherte Wert von 'posCurrVal' abweicht. –

Antwort

1

mir scheint, Dafür gibt es viele mögliche Lösungen. Man könnte sein, DrawGLScene den Wert von posCurrVal zurückgeben. Das heißt, es wird die Position zurückgeben, die es an DrawNoise gesendet hat, und Sie können es irgendwo speichern. Dann, wenn es Zeit ist, erneut DrawGLScene aufzurufen, senden Sie ihm den Wert, den Sie zuvor gespeichert haben (als neues Argument, das Sie der Funktionsdefinition hinzufügen müssen). Jetzt können Sie diesen Wert mit dem Wert vergleichen, den Sie von Music_GetPosition() erhalten, und nur DrawNoise aufrufen, wenn sich der Wert geändert hat.

Dies ist nur eine mögliche Lösung - ich bin mir sicher, dass Sie andere finden können, die besser zu Ihrem Code passen.

+0

Natürlich wäre dies eine mögliche Lösung. Aber da es C++ ist, sollte eine Lösung mit einer 'Klasse' und einem Element zum Speichern von' posCurrVal' bevorzugt werden. – Rabbid76