Arch13
(Member)
Зарегистрирован: Jul 2008
Проживает: /
Написал: 49 сообщений
Оценка:
|
Да вроде бы вальв комьюнити говорит, что нужно воткнуть код от мультиплеерного плеер.срр в синглплеерного и просто прописать энтри в хидер-файле...
Тут что-то при компиляции ошибок много вылезает...
Я не асс в си++, но всё же...
// Let the player override the view.
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
if(!pPlayer)
return;
pPlayer->OverrideView( pSetup );
if( ::input->CAM_IsThirdPerson() )
{
Vector camForward, camRight, camUp;
AngleVectors( pPlayer->EyeAngles(), &camForward, &camRight, &camUp );
trace_t tr, tr2;
Vector vecStart, vecStop, vecDirection, vecSetDirection;
static float camCurrentY;
static float camCurrentX=16.0f; //used for fluid camera transfers
float camDelta=0.5f;
vecStart=pSetup->origin;
AngleVectors(pPlayer->EyeAngles(), &vecDirection);
vecSetDirection.Init(0,0,1.0f);
vecDirection=vecDirection.Cross(vecSetDirection);
vecStop = vecStart + vecDirection*52.0f;
UTIL_TraceLine( vecStart, vecStop, MASK_ALL, pPlayer, COLLISION_GROUP_NONE, &tr );
if (tr.fraction == 1) //are we far enough away to not be hugging a wall with the camera?
{
if(camCurrentX < 16.0f)
camCurrentX +=camDelta;
if(camCurrentX >16.0f)
camCurrentX=16.0f;
VectorMA( pSetup->origin, camCurrentX, camRight, pSetup->origin); //set the right offset
VectorMA( pSetup->origin, 16.0f, camUp, pSetup->origin);
vecStart=tr.endpos;
}
else
{
//we weren't clear on the right, lets check the left
vecStop = vecStart + vecDirection * -52.0f;
UTIL_TraceLine( vecStart, vecStop, MASK_ALL, pPlayer, COLLISION_GROUP_NONE, &tr );
if (tr.fraction == 1) //are we clear on the left?
{
if(camCurrentX > -16.0f)
camCurrentX -=camDelta;
if(camCurrentX < -16.0f)
camCurrentX=-16.0f;
VectorMA( pSetup->origin, camCurrentX, camRight, pSetup->origin);
VectorMA( pSetup->origin, 16.0f, camUp, pSetup->origin);
vecStart=tr.endpos;
}
else //not clear, so set the camera behind the player and raise it more than normal to maintain clear view
{
//set camera behind player because left and right are not clear
VectorMA( pSetup->origin, 0.0f, camRight, pSetup->origin);
//check to see if there is enough room above
AngleVectors(pPlayer->EyeAngles(), &vecDirection);
vecSetDirection.Init(1.0f,0,0);
vecDirection=vecDirection.Cross(vecSetDirection);
vecStop = vecStart +vecDirection*32.0f;
UTIL_TraceLine( vecStart, vecStop, MASK_ALL, pPlayer, COLLISION_GROUP_NONE, &tr);
if(tr.fraction == 1)
{
VectorMA( pSetup->origin, 32.0f, camUp, pSetup->origin);
vecStart=tr.endpos;
}
else //not enough room on left, right, or above, so move the camera eye level
//TODO: Add code to make player translucent as well so the player can see better
{
VectorMA( pSetup->origin, 0.0f, camUp, pSetup->origin);
}
}
}
AngleVectors(pPlayer->EyeAngles(), &vecDirection);
vecStop = vecStart + vecDirection * -96;
UTIL_TraceLine( vecStart, vecStop, MASK_ALL, pPlayer, COLLISION_GROUP_NONE, &tr );
vecStart=pSetup->origin;
vecStop = vecStart+vecDirection*-96;
UTIL_TraceLine( vecStart, vecStop, MASK_ALL, pPlayer, COLLISION_GROUP_NONE, &tr );
//multiply the default distance by the percentage the traceline traveled, should put the camera infront of the object
if(tr.fraction != 1)
{
camCurrentY = -96 * tr.fraction + 10.0f;
}
else
{
camCurrentY=-96.0f;
VectorMA( pSetup->origin, camCurrentY, camForward, pSetup->origin);
}
}
Прошу прощения - это не в тему анимации вообще-то...
Поправил Arch13 03-08-2008 в 08:01
|