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?
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
@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
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