I have been fighting a problem for a while now and would appreciate any help anybody could give.
I have a sprite that moves within a landscape. The sprite remains in the center of the screen and the background moves to simulate that the sprite is moving within the landscape. I have split the landscape into sections so that I only draw the sections of the landscape that I need (are on screen).
The Problem: As a new texture section of the screen appears on the screen (is drawn for the first time) the movement jumps. Almost like a frame is missed. I have done some timing experiments and I do not thinks a frame is missed. My processing is well below the 30fps that I have the animation set to. It only happens the first time the texture section is drawn.
Is there something extra that is done the first time a texture is drawn?
Here is the code:
- (void) render{
// Sets up an array of values to use as the sprite vertices.
const GLfloat sVerts[] = {
-1.6f, -1.6f,
1.6f, -1.6f,
-1.6f, 1.6f,
1.6f, 1.6f,
};
static const GLfloat sTexCoords[] = {
0.0, 1.0,
1.0, 1.0,
0.0, 0.0,
1.0, 0.0
};
glDisableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
// Setup opengl to draw the object in correct orientation, size, position, etc
glLoadIdentity();
// Enable use of the texture
glEnable(GL_TEXTURE_2D);
glVertexPointer(2, GL_FLOAT, 0, sVerts);
glTexCoordPointer(2, GL_FLOAT, 0, sTexCoords);
// draw the texture
// set the position of the first tile
float xOffset = -4.8;
float yOffset = 4.8;
int i;
int y;
int currentTexture = textureA;
for(i=0; i<2; i++)
{
for(y=0; y<2; y++)
{
// test for the texture tile on the screen if not on screen then do not draw
float localX = xOffset+(3.21*y);
float localY = yOffset-(3.21*i);
float xDiff = monkeyX - localX;
float yDiff = monkeyY - localY;
if(((xDiff < 3.2) && (xDiff > -3.2)) && ((yDiff <2.7) && (yDiff > -2.7)))
{
// bind the texture and set the vertex data pointers
glBindTexture(GL_TEXTURE_2D, spriteTexture[currentTexture]);
// move to draw position for the texture
glLoadIdentity();
glTranslatef((localX+self.positionX), (localY+self.positionY), 0.0);
//draw the texture
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
currentTexture++;
}
}
}