Source Modification Centre - LOGO
Gość: ( Logowanie | Rejestracja )

 
MENU
 
ZASOBY
 
 
LEGENDA
 
REKLAMA
tani fotograf na ślub Gorzów

tani pokoje Gorzów

Suknie ślubne gorzów wlkp


zdjęcia studniówka Wrocław

wypożyczalnia samochodów osobowych

Encyklopedia wiedzy o grach Valve

kabriolet do ślubu gorzów

tania strona internetowa gorzów wielkopolski

NASZ BUTTON
SMC
 
NA FORUM
 
 
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:

float mf_NextSwitch;

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 Emot) 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ą:

kbutton_t in_graph;

Dodajmy:

kbutton_t   in_camchange;

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.

Autor: Kostek
Komentarze ( 0 ) / Dodaj komentarz
 
INFO
 
NAJNOWSZE
 
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.
 
ANKIETA

[ Czas generowania strony: 0.073 secs. ]

Copyright (c) 2002-2005 by Mefi & .raven
Wszelkie prawa zastrzeżone

Fotograf studniówka
Salon sukien ślubnych gorzów



38.107.179.22338.107.179.223

Polecamy:

mpblawcenterwww.ac2.kalambury.euhttp://www.re4.miodzik.euręcznie robione świeczkiserwisplaża GotLink.pl Konie odżywki ogłoszenia praca Konstancin Palarnie