|
|
| |
| ZASOBY |
| |
| |
|
|
|
| |
|
| NASZ BUTTON |
|
|
| |
|
|
| |
|
| |
|
TUTORIALE - CODING
|
[ Dodaj ]
|
|
Tworzenie widoku trzeciej osoby
| [ 2005-08-21 17:27:55 Dodał:
Kostek Wyświetleń: 2699 Komentarzy: 0 ]
|
|
Na wstępie dodam, że jest to tłumaczenie tutorialu Creating a Third Person Camera.
Ten tutorial nauczy was jak stworzyć widok trzeciej osoby z następującymi cechami:
- Detekcja kolizji
- Zoom przy pomocy pokrętła myszy
- Przeźroczystość modeli kiedy kamera jest zbyt blisko
Krok 1: IN_CAMERA.CPP
Otwórzmy plik GAME_SDK.SLN, w pierwszym kroku zmienimy kod kamery w pliku IN_CAMERA.CPP
Skomentujmy linię:
| #define CAM_MIN_DIST 30.0 |
| //#define CAM_MIN_DIST 30.0 |
Pod linią #define YAW_MIN -135.0 dodajmy:
#define CAM_MIN_DIST 16.0 // Don't let the camera get any closer than ...
#define CAM_SWITCH_DIST 96.0 // the default distance the camera will be when switching from 1st to 3rd person
#define CAM_MAX_DIST 96.0 // ... or any farther away than ...
#define CAM_HULL_OFFSET 6.0 // the size of the bounding hull used for collision checking
#define START_TRANS_DIST 40.0 // how close to player when it starts making model translucent
#define TRANS_DELTA 1.9921875 // Set to 255 / START_TRANS_DIST
static Vector CAM_HULL_MIN(-CAM_HULL_OFFSET,-CAM_HULL_OFFSET,-CAM_HULL_OFFSET);
static Vector CAM_HULL_MAX( CAM_HULL_OFFSET, CAM_HULL_OFFSET, CAM_HULL_OFFSET); |
Pod linią static kbutton_t cam_in, cam_out, cam_move; dodajmy:
Teraz zamieńmy linię:
| static ConVar cam_idealyaw( "cam_idealyaw", "90", FCVAR_ARCHIVE ); // thirdperson yaw |
Na:
| static ConVar cam_idealyaw( "cam_idealyaw", "0", FCVAR_ARCHIVE ); // thirdperson yaw | fix side view bug |
Zmieńmy sekcję(pod funkcją CAM_Think):
if ( !m_fCameraInThirdPerson )
return; |
Na:
// Toggle first/3rd person, check every 0.5 seconds
if(gpGlobals->curtime >= mf_NextSwitch) {
if(input->KeyState(&in_camchange))
{
mf_NextSwitch = gpGlobals->curtime + 0.5; // Check if the key has been pressed every 0.5 seconds
if(!m_fCameraInThirdPerson)
{
CAM_ToThirdPerson();
} else {
CAM_ToFirstPerson();
}
}
}
if( !m_fCameraInThirdPerson )
{
// If in FP mode, transparent
// This is sort of a hack since when the map first loads you ARE transparent...
// This is for when you switch from 3rd to 1st.
if(C_BasePlayer::GetLocalPlayer() ) {
C_BasePlayer::GetLocalPlayer()->SetRenderMode( kRenderTransColor );
C_BasePlayer::GetLocalPlayer()->SetRenderColorA(0);
}
return;
} |
Właśnie nakazaliśmy kodowi aby sprawdzał czy użytkownik nacisnął przycisk in_camchange (klawisz ten zdefiniujemy później). Dodaliśmy też kod, który spowoduje, iż gracz stanie się przeźroczysty podczas zmieniania widoku z 3RD person na 1ST person. Ma to zapobiec wchodzeniu modelu postaci w drogę kamery co mogłoby znacznie utrudnić grę (w pewnych momentach nie widzielibyśmy co dzieje się przed nami).
W części kodu:
else if( input->KeyState( &cam_out ) ) {
dist += CAM_DIST_DELTA;
} |
Zaraz po dist += CAM_DIST_DELTA; dodajmy:
// Prevent the cam_out from going any further
// NOTE: Without this, it _appears_ it's not moving, but
// the transparency changes so it is... this fixes it.
if( dist > CAM_MAX_DIST )
dist = CAM_MAX_DIST; |
Zamieńmy:
if( cam_snapto.GetInt() )
{
camAngles[ YAW ] = cam_idealyaw.GetFloat() + viewangles[ YAW ];
camAngles[ PITCH ] = cam_idealpitch.GetFloat() + viewangles[ PITCH ];
camAngles[ 2 ] = cam_idealdist.GetFloat();
}
else
{
// code already here
} |
Na:
if( cam_snapto.GetInt() )
{
camAngles[ YAW ] = cam_idealyaw.GetFloat() + viewangles[ YAW ];
camAngles[ PITCH ] = cam_idealpitch.GetFloat() + viewangles[ PITCH ];
camAngles[ 2 ] = cam_idealdist.GetFloat();
}
else
{
if( camAngles[ YAW ] - viewangles[ YAW ] != cam_idealyaw.GetFloat() )
camAngles[ YAW ] = MoveToward( camAngles[ YAW ], cam_idealyaw.GetFloat() + viewangles[ YAW ], CAM_ANGLE_SPEED );
if( camAngles[ PITCH ] - viewangles[ PITCH ] != cam_idealpitch.GetFloat() )
camAngles[ PITCH ] = MoveToward( camAngles[ PITCH ], cam_idealpitch.GetFloat() + viewangles[ PITCH ], CAM_ANGLE_SPEED );
if( !C_BasePlayer::GetLocalPlayer() ) {
// this code can be hit from the main menu, where it will crash
camAngles[ 2 ] = dist; // if there's no localplayer to calc from
}
else {
trace_t tr;
float adjDist = dist;
C_BasePlayer* localPlayer = C_BasePlayer::GetLocalPlayer();
Vector origin = localPlayer->GetLocalOrigin(); // find our player's origin
origin += localPlayer->GetViewOffset(); // and from there, his eye position
AngleVectors( QAngle(camAngles.x, camAngles.y, camAngles.z),
&camForward, NULL, NULL ); // get the forward vector
UTIL_TraceHull( origin, origin - (camForward * dist),
CAM_HULL_MIN, CAM_HULL_MAX,
MASK_SOLID, NULL, &tr ); // use our previously #defined hull to collision trace
if( tr.fraction < 1.0 ) {
adjDist = dist * tr.fraction; // move the camera closer if it hit something
}
else {
adjDist = dist; // no trace hit, use cam_idealdist without adjusting it
}
if ( adjDist < START_TRANS_DIST ) {
localPlayer->SetRenderMode( kRenderTransColor ); // make him translucent
localPlayer->SetRenderColorA( (byte)(adjDist * TRANS_DELTA) ); // closer = less opacity
}
if( adjDist < CAM_MIN_DIST )
adjDist = CAM_MIN_DIST; // clamp up to minimum
if( adjDist > CAM_MAX_DIST )
adjDist = CAM_MAX_DIST; // clamp down to maximum
camAngles[ 2 ] = adjDist;
}
} |
Ta cześć kodu sprawdza kolizje i obsługę przeźroczystości.
W funkcji void CInput::CAM_ToThirdPerson(void), zmieńmy:
| m_vecCameraOffset[ 2 ] = CAM_MIN_DIST; |
Na:
| m_vecCameraOffset[ 2 ] = CAM_SWITCH_DIST; // When switching, move camera to our specified switch distance |
Zaraz pod tym dodajmy jeszcze:
// Set model to 'player' because when a map first loads
// it doesn't set the model... sort of a hack.
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
pPlayer->SetModel("player"); |
Koniec kroku pierwszego.
Krok 2: C_BASECOMBATWEAPON.CPP
Otwórzmy plik C_BASECOMBATWEAPON.CPP w projekcie klienta. Poniżej tej części kodu:
// check if local player chases owner of this weapon in first person
C_BasePlayer *localplayer = C_BasePlayer::GetLocalPlayer(); |
Dodajmy:
// Get rid of view model, crosshair and weapon in 3rd person
// Once we actually get weapons working, we'll let it draw only the weapon
if (localplayer)
{
if (input->CAM_IsThirdPerson())
{
if(localplayer == GetOwner()) // make sure the caller is the player to prevent hiding EVERYONE's weapon model.
{
SetModel( GetWorldModel() );
localplayer->m_Local.m_iHideHUD |= HIDEHUD_CROSSHAIR; // Hide crosshair, remove this line if you still want to see it.
return false; // Comment this and uncomment the line underneath if you want to be
// able to do weapon things (it will display the weapon).
//return BaseClass:: DrawModel( flags );
}
}
} |
Tu nakazaliśmy kodowi chowanie View model (ręce Gordona - inaczej pojawiałyby się pomiędzy jego nogami ) i celownika w widoku trzeciej osoby. Jeśli chcecie widzieć celownik w tym widoku usuńcie z końcówki kodu tą cześć:
| localplayer->m_Local.m_iHideHUD |= HIDEHUD_CROSSHAIR; |
Jeśli chcesz aby w twoim modzie w widoku trzeciej osoby widzialna byłą broń skomentuj return_false i usuń komentarz z //return BaseClass:: DrawModel( flags );.
Krok 3:IN_MAIN.CPP
Otwórzmy plik IN_MAIN.CPP w projekcie klienta. Pod linią:
Dodajmy:
Pod:
void IN_ZoomDown(void) {KeyDown(&in_zoom);}
void IN_ZoomUp(void) {KeyUp(&in_zoom);} |
Dodajmy:
void IN_CamChangeDown(void) {KeyDown(&in_camchange);}
void IN_CamChangeUp(void) {KeyUp(&in_camchange);} |
Pod CalcButtonBits( bits, IN_ZOOM, s_ClearInputState, &in_zoom, bResetState );, dodajmy:
| CalcButtonBits( bits, IN_CAMCHANGE, s_ClearInputState, &in_camchange, bResetState ); |
Pod:
static ConCommand startzoom("+zoom", IN_ZoomDown);
static ConCommand endzoom("-zoom", IN_ZoomUp); |
Dodajmy:
static ConCommand startcamchange("+camchange", IN_CamChangeDown);
static ConCommand endcamchange("-camchange", IN_CamChangeUp); |
Krok 4: INPUT.H & IN_NUTTONS.H
Otwózmy plik IN_BUTTONS.H z Header Files w projekcie klienta.
Pod #define IN_BULLRUSH (1 << 22), dodajmy:
| #define IN_CAMCHANGE (1 << 23) |
Uwaga: Jeśli kiedykolwiek będziesz chciał dodac więcej komend do klawiatury, wystarzy dopisać:
| #define {command} (1 << {int} |
Gdzie {int} to następna w kolejności liczba całkowita(w tym przypadku 24). Uwaga: liczba całkowita nie może przewyższyć 32, gdyż Valve tak to ustawiło.
Otwórzmy plik INPUT.H znajdujący się w Header Files w projekcie klienta. Pod:
| extern kbutton_t in_back; |
Dodajmy:
| extern kbutton_t in_camchange; |
Krok 5 (ostatni): KB_ACT.IST
Otwórzmy plik KB_ACT.IST z folderu SOURCEMODS\{twój mod}\SCRIPTS. Gdziekolwiek dopiszmy:
| "+camchange" "Toggle 3rd/1st Person View" |
Na koniec najważniejsza rzecz, aby widok był tak jak ma być czyli za pleców to musimy skasować nasz plik CONFIG.CFG, aby skasować stare ustawienia kamery.
Mam nadzieje, że komuś przyda się ten tutorial.
|
|
|
|
|
|
|
|
| |
|
|
| |
| SHOUTBOX |
|
MoonBlaze: ciasto is a lie |
|
zwieracz: Przyłącz się do mnie, mam ciasto |
|
Jodla: <kontemplujac stwierdza iz obecna rzeczywistosc jest do bani> |
|
MoonBlaze: sm_ban @Dabu 1 |
|
Dabu: Ta strona umarła, zapraszam lepiej na heacrab.pl :D [/koniec reklamy] |
|
Jodla: open beta nowego gmoda a tu 0 info na stronie ...może czas to zmienic zwłaszcza iż screeny z GM13 wygladaja apetycznie |
|
Dabu: web 3.0 |
|
Elektryk: Link |
|
Tracha: Ruski gracz! |
|
zwieracz: Za moich czasów, to się bawilismy przy takiej gierce, gdzie zając łapaj kury za jaja. A moze to był wilk. |
|
| |
|
|
|