C++ 如何设置我的GIF tilesheet动画(OpenGL、DevIL、C+;+;)

C++ 如何设置我的GIF tilesheet动画(OpenGL、DevIL、C+;+;),c++,opengl,C++,Opengl,我试图在我的窗口中设置gif动画,使其滚动到我的tilesheet上的每一帧,但它当前仅停留在一帧上。我想这是因为我没有限制gif上的fps,但我不知道该怎么做。有人吗 @max66我正试图通过这样做来获得动画。我试着让它沿着纹理上的y轴(这是一个雪碧瓷砖片),目前为止它没有if语句,但在最后一帧冻结 我的(新)代码: #包括“LUtil.h” #包括 #包括 #包括“LSpriteSheet.h” int add=0; int zoom=0; 整数因子=0; 整数因子2=0; 浮动y=0.f;

我试图在我的窗口中设置gif动画,使其滚动到我的tilesheet上的每一帧,但它当前仅停留在一帧上。我想这是因为我没有限制gif上的fps,但我不知道该怎么做。有人吗

@max66我正试图通过这样做来获得动画。我试着让它沿着纹理上的y轴(这是一个雪碧瓷砖片),目前为止它没有if语句,但在最后一帧冻结

我的(新)代码:

#包括“LUtil.h”
#包括
#包括
#包括“LSpriteSheet.h”
int add=0;
int zoom=0;
整数因子=0;
整数因子2=0;
浮动y=0.f;
int-scroll=0;
GLfloat gCameraX=0.f,gCameraY=0.f,gCameraZ=0.f;
//雪碧纹理
泥炭纸;
小精灵;
bool initGL()
{
//初始化GLEW
GLenum glewError=glewInit();
如果(glewError!=GLEW_OK)
{
printf(“初始化GLEW时出错!%s\n”,glewGetErrorString(glewError));
返回false;
}
//确保支持OpenGL 2.1
如果(!GLEW_版本_2_1)
{
printf(“不支持OpenGL 2.1!\n”);
返回false;
}
//设置视口
glViewport(0.f,0.f,屏幕宽度,屏幕高度);
//初始化投影矩阵
glMatrixMode(GL_投影);
glLoadIdentity();
格洛托(0.0,屏幕宽度,屏幕高度,0.0,5.0,-5.0);
//初始化模型视图矩阵
glMatrixMode(GLU模型视图);
glLoadIdentity();
glPushMatrix();
//初始化清晰颜色
glClearColor(0.f,0.f,0.f,1.f);
//启用纹理
glEnable(GL_纹理_2D);
glEnable(GL_混合物);
glDisable(GLU深度测试);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA);
//检查错误
GLenum error=glGetError();
如果(错误!=总帐无错误)
{
printf(“初始化OpenGL时出错!%s\n”,GlueErrorString(错误));
返回false;
}
//初始化魔鬼
ilInit();
ILClearColor(255、255、255、000);
//检查错误
ILenum ilError=ilGetError();
如果(ilError!=ILU无错误)
{
printf(“初始化恶魔时出错!%s\n”,iluErrorString(ilError));
返回false;
}
返回true;
}
bool loadMedia()
{
//加载纹理
如果(!gArrowSprites.loadTextureFromFile(“SamusM.png”))
{
printf(“无法加载纹理!\n”);
返回false;
}
LFRect clip={0.f,0.f,330.f,355.f};
//左上角
clip.x=0.f;
clip.y=0.f;
gArrowSprites.addClipSprite(clip);
//右上角
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};
//左下角
clip.x=0.f;
夹子y=355.f;
gArrowSprites.addClipSprite(clip);
clip={0.f,0.f,330.f,355.f};
//左上角
clip.x=0.f;
clip.y=480.f;
gArrowSprites.addClipSprite(clip);
//右上角
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};
//左下角
clip.x=0.f;
clip.y=835.f;
gArrowSprites.addClipSprite(clip);
//生成VBO
如果(!gArrowSprites.generateDataBuffer())
{
printf(“无法剪裁精灵表!\n”);
返回false;
}
如果(!gSamusSprites.loadTextureFromFile(“SamusG.png”))
{
printf(“无法加载纹理!\n”);
返回false;
}
while(滚动!=40){
y+=214.f;
滚动++;
如果(滚动==40){
滚动=0;
}
}
clip={0.f,0.f,213.f,214.f};
clip.x=0.f;
clip.y=y;
gSamusSprites.addClipSprite(clip);
如果(!gSamusSprites.generateDataBuffer())
{
printf(“无法剪裁精灵表!\n”);
返回false;
}
返回true;
}
无效更新()
{
}
void render()
{
//清晰颜色缓冲区
glClear(GLU颜色缓冲位);
glMatrixMode(GLU模型视图);
glPopMatrix();
glPushMatrix();
如果(加法==0){
如果(缩放<101){
双常数f_缩放=1.0+0.1*缩放;
glScaled(f_缩放,f_缩放,f_缩放);
}
如果(缩放<-10){
双常数f_缩放=1.0-0.1*缩放;
glScaled(f_缩放,f_缩放,f_缩放);
}
glTranslatef(-100.f,178.f,0.f);
renderSprite(0);
//渲染右上箭头
GLTRANSTEF(+100.f,-178.f,0.f);
glTranslatef(1240.f,240.f,0.f);
加洛斯普林特。伦德斯普林特(1);
//渲染左下箭头
glTranslatef(-1240.f,+240.f,0.f);
GLTRANSTEF(620.f,500.f,0.f);
加洛斯普林特。伦德斯普林特(2);
GLTRANSTEF(-620.f,-500.f,0.f);
glTranslatef(620.f,0.f,0.f);
gSamusSprites.renderSprite(0);
}
如果(加法==1){
如果(缩放<101){
双常数f_缩放=1.0+0.1*缩放;
glScaled(f_缩放,f_缩放,f_缩放);
}
如果(缩放<-10){
双常数f_缩放=1.0-0.1*缩放;
glScaled(f_缩放,f_缩放,f_缩放);
}
glTranslatef(-100.f,178.f,0.f);
加洛斯普林特。伦德斯普林特(3);
GLTRANSTEF(+100.f,-178.f,0.f);
glTranslatef(1240.f,240.f,0.f);
加洛斯普林特。伦德斯普林特(4);
glTranslatef(-1240.f,+240.f,0.f);
GLTRANSTEF(620.f,500.f,0.f);
加洛斯普林特。伦德斯普林特(5);
}
glLoadIdentity();
glutSwapBuffers();
}
void handleKeys(无符号字符键,整数x,整数y)
{
//如果用户按q
if(key='q'&&add==0)
{
添加++;
}
else if(key='q'&&add==1)
{
加--;
}
//更新精灵矩形,使纹理更改生效
如果(键==27){
出口(0);
}
如果(键=='a'){
gCameraX+=8.f;
因子--;
因子2++;
}
否则如果(键=='d'){
gCameraX-=8.f;
因子++;
因子2-;
}
否则,如果(键=='w'){
gCameraY+=8.f;
}
否则如果(键='s'){
gCameraY-=8.f;
}
否则如果(键=='+'&&zoom!=100){
缩放+=1;
如果(系数>=19){
gCameraX-=64.f;
}
如果(系数2>=33){
gCameraX+=16.f;
}
否则{
gCameraX-=64.f;
gCameraY-=50.f;
}
}
else if(键=='-'&&zoom!=-9){
缩放-=1;
如果(系数>=19){
gCameraX+=64.f;
}
如果(系数2>=33){
gCameraX-=32.f;
}
否则{
gCameraX+=64.f;
gCameraY+=50.f;
}
}
//将保存的矩阵从堆栈中取出并重置它
glMatrixMode(GL_-MO
#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();
}
for(int scroll; scroll > 40; scroll++){
    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 );
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?