Hey all, I've been going at this for 1-2 days now and cannot seem to get this to work correctly.
What I'm trying to do, is simply make a textured quad rotate about the z axis in reference to its own center. From what I've gathered, I need to do 3 things...
Translate the quad to (0,0)
Rotate the quad
Translate it back to where ever it was: (x,y)
So this is what I pretty much have..
glTranslatef( -static_cast<float>(sprite.getScreenCoords()->x), -static_cast<float>(sprite.getScreenCoords()->y), 0.0f );
glRotated(angle,0,0,1);
glTranslatef( sprite.getScreenCoords()->x, sprite.getScreenCoords()->y, 0.0f );
This makes the quad rotate, but definitely not about its own center. And I'm not sure what I'm doing wrong =/. Here are some more snippets of code so you can have a better grasp as to how i'm doing things..
Code that draws my sprite:
void Player::updateRengerLogic(unsigned int curTime, const PlayerInfo& playerInfo )
{
//Calc angle from ships front to mouse
float deltaX( playerInfo.mouseCoords.x - sprite.getScreenCoords()->x );
float deltaY( playerInfo.mouseCoords.y - sprite.getScreenCoords()->y );
double aimArrowAngle( atan(deltaY/deltaX) );
if ( deltaX < 0 )
aimArrowAngle += PI;
aimArrowAngle *= (180/PI);
//Draw main ship
glPushMatrix();
glTranslatef( -static_cast<float>(sprite.getScreenCoords()->x), -static_cast<float>(sprite.getScreenCoords()->y), 0.0f );
glRotated(angle,0,0,1);
glTranslatef( sprite.getScreenCoords()->x, sprite.getScreenCoords()->y, 0.0f );
glVertexPointer(2, GL_FLOAT, 0, sprite.getScreenCoords() );
glTexCoordPointer(2, GL_FLOAT, 0, sprite.getUVCoords() );
glBindTexture(GL_TEXTURE_2D, sprite.getTex() );
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glPopMatrix();
//Draw aim arrow
glPushMatrix();
glTranslatef( aimArrow.getScreenCoords()->x+xVel, aimArrow.getScreenCoords()->y+yVel, 0.0f );
glRotated(aimArrowAngle,0,0,1);
glTranslatef( -static_cast<float>(aimArrow.getScreenCoords()->x), -static_cast<float>(aimArrow.getScreenCoords()->y), 0.0f );
glVertexPointer(2, GL_FLOAT, 0, aimArrow.getScreenCoords() );
glTexCoordPointer(2, GL_FLOAT, 0, aimArrow.getUVCoords() );
glBindTexture(GL_TEXTURE_2D, aimArrow.getTex() );
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glPopMatrix();
}
Code that moves the sprite and determines the angle it should face...
void Player::runAILogic(PlayerInfo &playerInfo)
{
playerInfo.playerCoords.x = sprite.getScreenCoords()->x;
playerInfo.playerCoords.y = sprite.getScreenCoords()->y;
if ( (playerInfo.keysDown[SDLK_UP] && playerInfo.keysDown[SDLK_LEFT]) )
{
//xVel -= speed/2;
//yVel -= speed/2;
sprite.setScreenCoords(-speed/2,-speed/2);
aimArrow.setScreenCoords(-speed/2,-speed/2);
if ( angle < 225 )
angle += 10;
if ( angle > 225 )
angle -= 10;
}
else if ( (playerInfo.keysDown[SDLK_UP] && playerInfo.keysDown[SDLK_RIGHT]) )
{
//xVel += speed/2;
//yVel -= speed/2;
sprite.setScreenCoords(speed/2,-speed/2);
aimArrow.setScreenCoords(speed/2,-speed/2);
if ( angle < 315 )
angle += 10;
if ( angle > 315 )
angle -= 10;
}
else if ( (playerInfo.keysDown[SDLK_DOWN] && playerInfo.keysDown[SDLK_LEFT]) )
{
//xVel -= speed/2;
//yVel += speed/2;
sprite.setScreenCoords(-speed/2,speed/2);
aimArrow.setScreenCoords(-speed/2,speed/2);
if ( angle < 135 )
angle += 10;
if ( angle > 135 )
angle -= 10;
}
else if ( (playerInfo.keysDown[SDLK_DOWN] && playerInfo.keysDown[SDLK_RIGHT]) )
{
//xVel += speed/2;
//yVel += speed/2;
sprite.setScreenCoords(speed/2,speed/2);
aimArrow.setScreenCoords(speed/2,speed/2);
if ( angle < 45 )
angle += 10;
if ( angle > 45 )
angle -= 10;
}
else if( playerInfo.keysDown[SDLK_UP] )
{
//yVel -= speed;
sprite.setScreenCoords(0,-speed);
aimArrow.setScreenCoords(0,-speed);
if ( angle < 270 && angle >= 180 )
angle += 10;
if ( angle < 270 && angle <= 180 )
angle -= 10;
if ( angle > 270 )
angle -= 10;
}
else if( playerInfo.keysDown[SDLK_DOWN] )
{
//yVel += speed;
sprite.setScreenCoords(0,speed);
aimArrow.setScreenCoords(0,speed);
if ( angle > 90 )
angle -= 10;
if ( angle < 90 )
angle += 10;
}
else if( playerInfo.keysDown[SDLK_RIGHT] )
{
//xVel += speed;
sprite.setScreenCoords(speed,0);
aimArrow.setScreenCoords(speed,0);
if ( angle > 0 && angle <= 180 )
angle -= 10;
if ( angle > 0 && angle >= 180 )
angle += 10;
}
else if( playerInfo.keysDown[SDLK_LEFT] )
{
//xVel -= speed;
sprite.setScreenCoords(-speed,0);
aimArrow.setScreenCoords(-speed,0);
if ( angle < 180 )
angle += 10;
if ( angle > 180 )
angle -= 10;
}
if ( angle > 360 )
angle = 0;
if ( angle < 0 )
angle = 360;
}
Sorry if I'm posting too much code at once, it just that this seems like it should be such a simple task and I can't get it to work >_<.
Thanks in advance for any help.