2016-05-21 3 views
2

Ich versuche ein GIF in meinem Fenster zu animieren, indem ich es zu jedem Bild auf meinem Kachelbogen scrollen lasse, aber es bleibt nur auf einem Bild. Ich nehme an, es liegt daran, dass ich die fps nicht auf das gif beschränke, aber ich habe keine Ahnung, wie ich das machen soll. Jemand?Wie ich meine GIF-Kacheln animiere (OpenGL, DevIL, C++)

@ max66 Ich versuche, eine Animation zu erhalten, indem Sie dies tun. Ich versuche, es auf der y-Achse entlang der y-Achse auf der Textur (das ist ein Sprite-Tile-Blatt) gehen, die ohne die if-Anweisung bisher funktioniert, aber es auf dem letzten Frame einfriert.

My (neuerer) Code:

#include "LUtil.h" 
#include <IL/il.h> 
#include <IL/ilu.h> 
#include "LSpriteSheet.h" 

int add = 0; 
int zoom = 0; 
int factor = 0; 
int factor2 = 0; 
float y = 0.f; 
int scroll = 0; 
GLfloat gCameraX = 0.f, gCameraY = 0.f, gCameraZ = 0.f; 

//Sprite texture 

LSpriteSheet gArrowSprites; 
LSpriteSheet gSamusSprites; 

bool initGL() 
{ 
    //Initialize GLEW 
GLenum glewError = glewInit(); 
if(glewError != GLEW_OK) 
{ 
    printf("Error initializing GLEW! %s\n", glewGetErrorString(glewError)); 
    return false; 
} 

//Make sure OpenGL 2.1 is supported 
if(!GLEW_VERSION_2_1) 
{ 
    printf("OpenGL 2.1 not supported!\n"); 
    return false; 
} 

//Set the viewport 
glViewport(0.f, 0.f, SCREEN_WIDTH, SCREEN_HEIGHT); 

//Initialize Projection Matrix 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0.0, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0, 5.0, -5.0); 

//Initialize Modelview Matrix 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

glPushMatrix(); 

//Initialize clear color 
glClearColor(0.f, 0.f, 0.f, 1.f); 

//Enable texturing 
glEnable(GL_TEXTURE_2D); 

glEnable(GL_BLEND); 
glDisable(GL_DEPTH_TEST); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

//Check for error 
GLenum error = glGetError(); 
if(error != GL_NO_ERROR) 
{ 
    printf("Error initializing OpenGL! %s\n", gluErrorString(error)); 
    return false; 
} 

//Initialize DevIL 
ilInit(); 
ilClearColour(255, 255, 255, 000); 

//Check for error 
ILenum ilError = ilGetError(); 
if(ilError != IL_NO_ERROR) 
{ 
    printf("Error initializing DevIL! %s\n", iluErrorString(ilError)); 
    return false; 
} 

return true; 
} 


bool loadMedia() 
{ 

//Load texture 
if(!gArrowSprites.loadTextureFromFile("SamusM.png")) 
{ 
    printf("Unable to load texture!\n"); 
    return false; 
} 
LFRect clip = { 0.f, 0.f, 330.f, 355.f }; 

//Top left 
clip.x = 0.f; 
clip.y = 0.f; 
gArrowSprites.addClipSprite(clip); 

//Top right 
clip = {0.f, 0.f, 310.f, 480.f}; 

clip.x = 331.f; 
clip.y = 0.f; 
gArrowSprites.addClipSprite(clip); 

clip = {0.f, 0.f, 330.f, 125.f}; 
//Bottom left 
clip.x = 0.f; 
clip.y = 355.f; 

gArrowSprites.addClipSprite(clip); 

clip = { 0.f, 0.f, 330.f, 355.f }; 

//Top left 
clip.x = 0.f; 
clip.y = 480.f; 
gArrowSprites.addClipSprite(clip); 

//Top right 
clip = {0.f, 0.f, 310.f, 480.f}; 

clip.x = 331.f; 
clip.y = 480.f; 
gArrowSprites.addClipSprite(clip); 

clip = {0.f, 0.f, 330.f, 125.f}; 
//Bottom left 
clip.x = 0.f; 
clip.y = 835.f; 

gArrowSprites.addClipSprite(clip); 
//Generate VBO 
if(!gArrowSprites.generateDataBuffer()) 
{ 
    printf("Unable to clip sprite sheet!\n"); 
    return false; 
} 
if(!gSamusSprites.loadTextureFromFile("SamusG.png")) 
{ 
    printf("Unable to load texture!\n"); 
    return false; 
} 

    while(scroll != 40){ 
    y += 214.f; 
    scroll++; 
    if(scroll == 40){ 
     scroll = 0; 
    } 
} 

clip = {0.f, 0.f, 213.f, 214.f}; 

clip.x = 0.f; 
clip.y = y; 

gSamusSprites.addClipSprite(clip); 

if(!gSamusSprites.generateDataBuffer()) 
{ 
    printf("Unable to clip sprite sheet!\n"); 
    return false; 
} 
return true; 
} 

void update() 
{ 

} 

void render() 
{ 
//Clear color buffer 

glClear(GL_COLOR_BUFFER_BIT); 

glMatrixMode(GL_MODELVIEW); 
glPopMatrix(); 

glPushMatrix(); 

if(add == 0){ 
    if(zoom < 101){ 
    double const f_zoom = 1.0 + 0.1 * zoom; 
    glScaled(f_zoom, f_zoom, f_zoom); 
    } 
    if(zoom < -10){ 
    double const f_zoom = 1.0 - 0.1 * zoom; 
    glScaled(f_zoom, f_zoom, f_zoom); 
    } 

glTranslatef(-100.f, 178.f, 0.f); 
gArrowSprites.renderSprite(0); 

//Render top right arrow 
glTranslatef(+100.f, -178.f, 0.f); 
glTranslatef(1240.f, 240.f, 0.f); 
gArrowSprites.renderSprite(1); 

//Render bottom left arrow 
glTranslatef(-1240.f, +240.f, 0.f); 
glTranslatef(620.f, 500.f ,0.f); 
gArrowSprites.renderSprite(2); 

glTranslatef(-620.f, -500.f, 0.f); 
glTranslatef(620.f, 0.f , 0.f); 
gSamusSprites.renderSprite(0); 

} 
if(add == 1){ 
    if(zoom < 101){ 
    double const f_zoom = 1.0 + 0.1 * zoom; 
    glScaled(f_zoom, f_zoom, f_zoom); 
    } 
    if(zoom < -10){ 
    double const f_zoom = 1.0 - 0.1 * zoom; 
    glScaled(f_zoom, f_zoom, f_zoom); 
    } 

glTranslatef(-100.f, 178.f, 0.f); 
gArrowSprites.renderSprite(3); 

glTranslatef(+100.f, -178.f, 0.f); 
glTranslatef(1240.f, 240.f, 0.f); 
gArrowSprites.renderSprite(4); 

glTranslatef(-1240.f, +240.f, 0.f); 
glTranslatef(620.f, 500.f ,0.f); 
gArrowSprites.renderSprite(5); 
} 

glLoadIdentity(); 


glutSwapBuffers(); 

} 
void handleKeys(unsigned char key, int x, int y) 
{ 
//If the user presses q 
if(key == 'q' && add == 0) 
{ 
       add++; 
} 
else if(key == 'q' && add == 1) 
{ 
    add--; 
} 
    //Update the sprite rectangles so the texture change takes effect 
    if(key == 27) { 
     exit(0); 
    } 
    if(key == 'a') { 
    gCameraX += 8.f; 
    factor--; 
    factor2++; 
    } 
    else if (key == 'd') { 
    gCameraX -= 8.f; 
    factor++; 
    factor2--; 
    } 
    else if (key == 'w') { 
    gCameraY += 8.f; 
    } 
    else if (key == 's') { 
    gCameraY -= 8.f; 
    } 
    else if (key == '+' && zoom != 100) { 
    zoom += 1; 
    if(factor >= 19) { 
    gCameraX -= 64.f; 
    } 
    if(factor2 >= 33){ 
     gCameraX += 16.f; 
    } 
    else{ 
     gCameraX -= 64.f; 
     gCameraY -= 50.f; 
    } 
    } 
    else if (key == '-' && zoom != -9) { 
    zoom -= 1; 
    if(factor >= 19){ 
     gCameraX += 64.f; 
    } 
    if(factor2 >= 33){ 
    gCameraX -= 32.f; 
    } 
    else{ 
    gCameraX += 64.f; 
    gCameraY += 50.f; 
    } 
    } 
     //Take saved matrix off the stack and reset it 
glMatrixMode(GL_MODELVIEW); 
glPopMatrix(); 
glLoadIdentity(); 

//Move camera to position 
glTranslatef(gCameraX, gCameraY, gCameraZ); 

//Save default matrix again with camera translation 
glPushMatrix(); 
} 

EDIT: Ich habe gerade versucht Einstellung der y-Wertes in der Koordinate für Schleife und nichts passiert so versuchte ich die if-Anweisung und immer noch nichts zu entfernen. Aber wenn ich den y-Wert am Anfang meiner Datei anpasse, ändert sich die Textur. Warum fügt meine Schleife nicht zu meinem y-Wert hinzu?

Antwort

0

Ich nehme an, es ist, weil in Ihrem for

for(int scroll; scroll > 40; scroll++){ 

Sie erklären die scroll Variable, aber sie tun es nicht initialisieren.

So scroll Start mit einem undefinierten Wert, der greather als 40.

Lösung sein kann (nehme ich an): initialisieren scroll.

ps.entschuldigung für mein schlechtes Englisch.

--- EDIT 2016.05.23 ---

Blick auf diesen Code

while(scroll != 40){ 
    y += 214.f; 
    scroll++; 
    if(scroll == 40){ 
     scroll = 0; 
    } 
} 

clip = {0.f, 0.f, 213.f, 214.f}; 

clip.x = 0.f; 
clip.y = y; 

gSamusSprites.addClipSprite(clip); 

Wenn scrool die while mit einem Wert erreichen verschieden von 40, die while nie verlassen und Sie Inkrement (für immer) y.

Ich nehme an, Sie sollten gSamusSprites.addClipSprite() (oder eine ähnliche Funktion) für jede Iteration der while aufrufen.

Ich nehme an, Ihre Absicht war es, den Zyklus nur 40 Mal zu wiederholen und zu beenden.

Wenn meine Vermutungen richtig sind, können Sie so etwas wie [Vorsicht: nicht getestet] versuchen

clip = {0.f, 0.f, 213.f, 214.f}; 

for (scroll = 0; scroll < 40; ++scroll, clip.y += 214.f) 
    gSamusSprites.addClipSprite(clip); // or a different function?  
+0

ich das Scroll-Variable initialisiert, indem Sie '= 0 ', nachdem es (dumme Fehler) aber nichts geändert. Das bringt mich zurück auf Platz eins. Irgendeine Ahnung, wie man das zur Arbeit bringt? – PocketTNT

+0

@PochetTNT - Entschuldigung: Ich hatte es gestern nicht genau angeschaut. Aber ... wenn Sie 'scroll' mit 0 initialisieren, ist der' scroll> 40' Test falsch und der Körper des 'for' wird niemals ausgeführt; Deine Absicht war 'Scroll <40'? In diesem Fall wird der 'if (scroll> = 40) scroll = 1; 'nie ausgeführt. Wenn aber der Test von "for" ist "test> = 40", wenn "test == 40" das interne "if" set "scroll = 1", so wird das 'for' nie verlassen. Wirklich: Ich verstehe nicht, was deine Absicht mit dem 'für' war. – max66

+0

Ok, also reparierte ich meine while-Schleife, die Problem durch Neuinstallation glew (Schmerz im a **) abstürzte. Jetzt mache ich den gleichen Code aber in einer while-Schleife.Mein neues Problem ist, wenn ich die if-Anweisung zur Schleife (für oder während) hinzufüge, stürzt es mein Programm ab, aber ohne die if-Anweisung bleibt es auf dem letzten Rahmen stecken. Was ich durch die Verwendung der Schleife erreichen möchte, ist es, sie durch mein "Gif" zu scrollen, das ich in ein vertikales Kachelblatt verwandelte, so dass es animiert ist. – PocketTNT

Verwandte Themen