2016-07-05 10 views
0

Ich schreibe eine Turtle-Klasse, die Bewegung für das Zeichnen ermöglicht. Ich benutze keine Spielschleife dafür. Benutzer dieser Schildkröte Objekt wird Thema Kommando:SDL2 und C++ in Bezug auf Bildanimation nach einer Zeile

Turtle t; 
t.forward(50); 
t.left(90); 

Der Turtle-Konstruktor Sorgen des Fensters und Renderer Schöpfung nimmt. Alle Interaktion erfolgt durch Programmierung. Keine Abfrage von Tastaturereignissen jeglicher Art. Im Moment bin ich in der Lage eine Spirale Animation mit dem folgenden Code zu machen:

int main(int argc, char* args[]){ 
    Turtle t; 
    t.clear(); 

    t.color("red"); 
    int numofside = 100; 
    t.shape("seaturtle"); 

    for (int i=0; i<numofside; i++) 
    { 
     t.forward(i + 5); 
     t.left(75); 
     SDL_RenderPresent(m_pRenderer); 
     SDL_Delay(50); 
    } 

    SDL_Delay(5000); 
    IMG_Quit(); 
    SDL_Quit(); 
} 

Die große Frage ist nun, wie die seaturtle Bild haben, die Linie folgen, die gerendert wird?

Ich verstehe das Konzept zu tun, Animation in SDL2 mit Rahmen (Schleife) dh klaren Bildschirm, Render bei der aktuellen Position, erhöhen x, y-Position.

Aber ich kann den Bildschirm nicht löschen, da es meine vorhandenen Zeilen gelöscht, die gezeichnet wurden.

Gibt es eine SDL-Texturfunktion, die ein Bild ein- und ausblenden kann, ohne den gesamten Bildschirm zu löschen? oder irgendeine Idee, es zu tun?

Antwort

1

Sie können die "Schildkröte" mit XOR zeichnen. Dann zeichnest du es neu, um es zu löschen.

Sie können auch die gezeichneten Linien verfolgen, sodass Sie sie alle neu zeichnen können, wenn Sie die Anzeige löschen.

Oder Sie könnten mehrere Zeichenflächen verwenden. Eine für den "Hintergrund", eine für die gezeichneten Linien und eine für die "Schildkröte". Dann zeichnest/löschst/zeichnest du die Schildkrötenoberfläche nur, während sie sich bewegt, und zeichne schließlich alle Ebenen übereinander, um sie anzuzeigen. Eine Art Multi-Puffer-Ansatz.

1

Speichern Sie, was Sie zeichnen würden, sagen Sie, sie in einem Vektor (über eine abstrakte Basisklasse DrawInstruction*). Dann können Sie nach einem leeren Bildschirm neu zeichnen. Der Vektor ist entweder global oder besser noch ein Mitglied Ihrer Klasse Turtle.