我试图在我的窗口中为gif设置动画,方法是滚动到我的tileheet上的每个帧,但它目前只停留在一帧上。我认为这是因为我并没有限制gif上的fps,但我不知道如何做到这一点。任何人吗?
@ max66我试图通过这样做获得动画。我试图让它沿着纹理上的y轴向下移动(这是一个精灵图块表),它在没有if语句的情况下工作到目前为止,但它在最后一帧上冻结。
我的(新的)代码:
#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循环中的y坐标值,没有发生任何事情,所以我尝试删除if语句,但仍然没有。但是,如果我调整文件顶部的y值,纹理将会改变。那么为什么我的循环没有添加到我的y值?
答案 0 :(得分:0)
我想这是因为在你的for
for(int scroll; scroll > 40; scroll++){
您声明了scroll
变量但未对其进行初始化。
所以scroll
以未定义的值开头,可能比40更好。
解决方案(我想):初始化scroll
。
p.s:抱歉我的英语不好。
---编辑2016.05.23 ---
看看这段代码
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 );
如果scrool
与while
的值不同,40
,while
永不退出,您只会增加(永远)y
。
我想你的意图是为gSamusSprites.addClipSprite()
的每次迭代调用while
(或类似的函数)。
我想你的意图是只循环40次并退出。
如果我的假设是正确的,你可以尝试类似[警告:未经测试]
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?