Vector2 newPos = fgACollisionP1 - player1Pos;
Not 100% sure though.
EDIT: Nevermind ... I suppose you want the collision response to push the playerPos away from the collision point, so what you've got seems OK.
Maybe the strange rebound is happening from the velocity of the player? Do you need to cross the player's direction vector with the response vector?
See if you can scavenge anything useful out of this stuff from Bullet's character controller:
/*
* Returns the reflection direction of a ray going 'direction' hitting a surface with normal 'normal'
*
* from: http://www-cs-students.stanford.edu/~adityagp/final/node3.html
*/
btVector3 btKinematicCharacterController::computeReflectionDirection (const btVector3& direction, const btVector3& normal)
{
return direction - (btScalar(2.0) * direction.dot(normal)) * normal;
}
/*
* Returns the portion of 'direction' that is parallel to 'normal'
*/
btVector3 btKinematicCharacterController::parallelComponent (const btVector3& direction, const btVector3& normal)
{
btScalar magnitude = direction.dot(normal);
return normal * magnitude;
}
/*
* Returns the portion of 'direction' that is perpindicular to 'normal'
*/
btVector3 btKinematicCharacterController::perpindicularComponent (const btVector3& direction, const btVector3& normal)
{
return direction - parallelComponent(direction, normal);
}