2011-04-13 60 views
0

传递变量我有我试图合并成一个下面的两个类功能,因为他们都非常相似:怪异的行为合并2类功能,并通过引用

void Camera::UpdateCameraPosition(void) { 
    if(cameraMode == CAMERA_MODE_THIRD_PERSON) { 
     float alpha = Math::DegreesToRadians(Rotation.y); 
     float beta = Math::DegreesToRadians(Rotation.x); 

     Position.SetValue(
      Player.x + CAMERA_ORBIT_OFFSET * cos(beta) * sin(alpha), 
      Player.y + CAMERA_ORBIT_OFFSET * sin(-beta), 
      Player.z + CAMERA_ORBIT_OFFSET * cos(beta) * cos(alpha) 
     ); 
    } else { 
     Position = Player; 
    } 
} 

void Camera::UpdatePlayerPosition(void) { 
    if(cameraMode == CAMERA_MODE_THIRD_PERSON) { 
     float alpha = Math::DegreesToRadians(Rotation.y); 
     float beta = Math::DegreesToRadians(Rotation.x); 

     Player.SetValue(
      Position.x - CAMERA_ORBIT_OFFSET * cos(beta) * sin(alpha), 
      Position.y - CAMERA_ORBIT_OFFSET * sin(-beta), 
      Position.z - CAMERA_ORBIT_OFFSET * cos(beta) * cos(alpha) 
     ); 
    } else { 
     Player = Position; 
    } 
} 

正如你所看到的,PlayerPosition是这个类的两个私有变量。他们的数据类型是Vector3D,另一类。

我试图把它们合并这样的:

void Camera::UpdateCameraOrPlayerPosition(Vector3D &target, Vector3D reference) { 
    if(cameraMode == CAMERA_MODE_THIRD_PERSON) { 
     float alpha = Math::DegreesToRadians(Rotation.y); 
     float beta = Math::DegreesToRadians(Rotation.x); 

     target.SetValue(
      reference.x - CAMERA_ORBIT_OFFSET * cos(beta) * sin(alpha), 
      reference.y - CAMERA_ORBIT_OFFSET * sin(-beta), 
      reference.z - CAMERA_ORBIT_OFFSET * cos(beta) * cos(alpha) 
     ); 
    } else { 
     target = reference; 
    } 
} 

这编译等,但它不具有相同的行为。当另外两个函数正在工作时,当我将这些函数调用替换为这个函数调用时,它不会像它应该那样工作。

我做的替代品是这些:

UpdatePlayerPosition() -> UpdateCameraOrPlayerPosition(Player, Position) 
UpdateCameraPosition() -> UpdateCameraOrPlayerPosition(Position, Player) 

我也试图与一个指针,而不是引用,结果是一样的。我在这里错过了什么吗?

+3

您更改了'CAMERA_ORBIT_OFFSET'从+到 - 在UpdateCameraPosition() - > UpdateCameraOrPlayerPosition(位置,播放器)的情况下' – 2011-04-13 00:33:22

+1

我是一个白痴......并且盲目:S – 2011-04-13 00:42:45

回答

0

您会注意到,当调整X Y和Z坐标时,Target.SetValue将+用于Camera并将其用于Player。