Jump to content

  • Log In with Google      Sign In   
  • Create Account


Opengl + SDL Sprite animation.


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 zealotscout   Members   -  Reputation: 107

Like
0Likes
Like

Posted 24 October 2012 - 11:05 PM

Hello everyone on gamedev, Currently a new programmer to open gl working on a University proyect which revolves around making a short 1min~2min video.

My main source of animation is flipping through frames on various sprites sheets via translating gltextcoords and placing them onto a given quad.
Everything would be cool and all but i've got a few problems.

My video involves a scrolling background, and character walking in place; The scene is simulating the character walking and the background moves accordingly.

So... basically I have no idea how I'll get both sprites to move at the same time.

Also, I'm using sdl_image with my sprites so I can get some transparencies.

Another problem arises is when I shift through frames on a walk cycle.
Each frame is printed on screen, then over written by the next but all the past frames are printed. All I want showing is the current frame and not all the others at the same time.

I'll post some pics describing my issues.

In a nut shell I need help on.
1st.Making a background scroll while at the same time playing a walk cycle of a character in front of it.

2nd. Whilst the character is doing his walk sequence, I need to only display the current frame and not all the rest.

This is the code I'm using to create the "animations"
the walk cycle
void malecycle1()
{

malewalk = loadTexture("walkcyclefinal.png");
glBindTexture(GL_TEXTURE_2D,malewalk);


for(float add=0.00;add<1.00;add=add+0.0625)
{//glClear( GL_COLOR_BUFFER_BIT );

glBegin(GL_QUADS); // se comienza el dibujado del quad que contiene la imagen
glTexCoord2f( +add, 0 ); // coordenada proporcional a lo que se va mostrar en pantalla
glVertex3f( 0 ,144, 0 );

// Bottom-left vertex (corner)
glTexCoord2f( 0.0625+add, 0 );
glVertex3f(256 ,144, 0 );

// Bottom-right vertex (corner)
glTexCoord2f( 0.0625+add, 1 );
glVertex3f(256 , 400, 0 );

// Top-right vertex (corner)
glTexCoord2f( +add, 1 );
glVertex3f( 0 , 400, 0 );

glEnd();
SDL_Delay(100 );
SDL_GL_SwapBuffers();


// glDeleteTextures( 1, &texture3 );

}

}

scrolling background
GLuint texture; // Texture object handle
SDL_Surface *surface; // Gives us the information to make the texture

// if ( (surface = SDL_LoadBMP("sprite.bmp")) ) {
surface = SDL_LoadBMP("background22edit.bmp") ;
// Check that the image's width is a power of 2

glGenTextures( 1, &texture );

// Bind the texture object
glBindTexture( GL_TEXTURE_2D, texture );

// Set the texture's stretching properties
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

// Edit the texture object's image data using the information SDL_Surface gives us
glTexImage2D( GL_TEXTURE_2D, 0, 3, surface->w, surface->h, 0,
GL_BGR, GL_UNSIGNED_BYTE, surface->pixels );
glBindTexture( GL_TEXTURE_2D, texture );

for(float x= 0;x<1.0;x=x+0.025)
{
glBegin(GL_QUADS); // se comienza el dibujado del quad que contiene la imagen
glTexCoord2f( x, 0 ); // coordenada proporcional a lo que se va mostrar en pantalla
glVertex3f( 0,0, 0 );

// Bottom-left vertex (corner)
glTexCoord2f( .3333+x, 0 );
glVertex3f( 640,0, 0 );

// Bottom-right vertex (corner)
glTexCoord2f( .3333+x, 1 );
glVertex3f(640, 480, 0 );

// Top-right vertex (corner)
glTexCoord2f( x, 1 );
glVertex3f( 0, 480, 0 );
glEnd();
SDL_Delay(150);
SDL_GL_SwapBuffers();
}
// glutSwapBuffers();



}

Any help will be much appreciated and I hope this wall of text is correctly placed within this forum.
Thanks in advance.

Attached Thumbnails

  • walkcyclefinal.png
  • photo (3).JPG


Sponsor:

#2 zealotscout   Members   -  Reputation: 107

Like
0Likes
Like

Posted 24 October 2012 - 11:15 PM

Forgot to mention, before I get a law suit. I've been using some of NeHes code and lazyfoo's code to get my project running.
If that helps any way.

#3 Sponji   Members   -  Reputation: 1137

Like
0Likes
Like

Posted 25 October 2012 - 02:37 AM

I think I'll just give you some code to give you an idea:
GLuint spriteTexture;
float time = 0;

void drawFrame(GLuint texture, int frame, float x, float y, float w, float h) {
	glBindTexture(GL_TEXTURE_2D, texture);
	// draw one quad with texture coords based on frame
	float tw = ...;   // texture width
	float th = ...;   // texture height
	float tx = frame * tw;  // texture x
	float ty = 0;   // texture y
	glBegin(GL_QUADS);
	glTexCoord2f(tx,	ty);	glVertex3f(x,   y,   z);
	glTexCoord2f(tx+tw, ty);	glVertex3f(x+w, y,   z);
	glTexCoord2f(tx+tw, ty+th); glVertex3f(x+w, y+h, z);
	glTexCoord2f(tx,	ty+th); glVertex3f(x,   y+h, z);
	glEnd();
}

void update() {
	time += delta_time;
}

void render() {
	drawFrame(spriteTexture, int(time) % frameCount, x, y, w, h);
}

And btw, you don't need to load the texture everytime you want to use it, just load it once at start of the program and call glBindTexture(..., id) when you want to use it.

Edited by Sponji, 25 October 2012 - 02:40 AM.

Derp




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS