HLFX.Ru Forum Страницы (2): « 1 [2]
Показать все 21 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Подскажите пожалуйста как сделать эффект падения экрана как в ку2 (https://hlfx.ru/forum/showthread.php?threadid=4047)


Отправлено SteamPlay43 09-08-2013 в 13:34:

fire64 Такой уж сдк что сделать!


Отправлено Decay 11-08-2013 в 04:39:

Пока что вот так:

pm_shared.c:

C++ Source Code:
1
vec_t punchX = 0; // HACK: rotate camera by X axis
2
void PM_CheckFalling(void)
3
{
4
  if (pmove->onground != -1 && !pmove->dead && pmove->flFallVelocity >= PLAYER_FALL_PUNCH_THRESHHOLD) {
5
    float fvol = 0.5;
6
 
7
    if (pmove->waterlevel > 0) {
8
    } else if (pmove->flFallVelocity > PLAYER_MAX_SAFE_FALL_SPEED) {
9
      pmove -> PM_PlaySound(CHAN_VOICE, "player/pl_fallpain3.wav", 1, ATTN_NORM, 0, PITCH_NORM);
10
      fvol = 1.0;
11
    } else if (pmove->flFallVelocity < PLAYER_MIN_BOUNCE_SPEED) {
12
      fvol = 0;
13
      punchX = 0;
14
    }
15
 
16
    if (fvol > 0.0) {
17
      // Play landing step right away
18
      pmove->flTimeStepSound = 0;
19
 
20
      PM_UpdateStepSound();
21
 
22
      // play step sound for current texture
23
      PM_PlayStepSound(PM_MapTextureTypeStepType(pmove->chtexturetype), fvol);
24
 
25
      // Knock the screen around a little bit, temporary effect
26
      punchX = pmove->flFallVelocity * 0.013;
27
    }
28
  }
29
  if(pmove->onground != -1)
30
    pmove->flFallVelocity = 0;
31
}


В функции PM_CheckParamters():
pm_shared.c: PM_CheckParamters():
C++ Source Code:
1
// Take angles from command.
2
if ( !pmove->dead )
3
{
4
  if (punchX)
5
    pmove->punchangle[0] = punchX;
6
  VectorCopy ( pmove->cmd.viewangles, v_angle );
7
  VectorAdd( v_angle, pmove->punchangle, v_angle );
8
 
9
  punchX = 0;
10
 
11
  // Set up view angles.


Отправлено SteamPlay43 12-08-2013 в 17:12:

DedoK Спасибо!


Отправлено SteamPlay43 22-10-2014 в 17:56:

Decay Теперь этот эффект применяется на всех игроков одновременно)


Отправлено Ku2zoff 22-10-2014 в 20:10:

Цитата:
SteamPlay43 писал:
Теперь этот эффект применяется на всех игроков одновременно)

То есть, когда падает один, камера качается у всех? Decay намудрил чего-то там, завёл ненужный вектор punchX, который задекларирован не внутри функции, а вне неё (соответственно он меняется ни в одном конкретном случае, для одного игрока, а когда любой игрок падает), вот тебе и для всех игроков эффект. Сделай в PM_CheckFalling вот так:
C++ Source Code:
1
if (fvol > 0.0) {
2
  // Play landing step right away
3
  pmove->flTimeStepSound = 0;
4
 
5
  PM_UpdateStepSound();
6
 
7
  // play step sound for current texture
8
  PM_PlayStepSound(PM_MapTextureTypeStepType(pmove->chtexturetype), fvol);
9
 
10
  // Knock the screen around a little bit, temporary effect
11
  [color=blue]pmove->punchangle[0] = pmove->flFallVelocity * 0.013;[/color]// теперь будет только для одного игрока
12
}

И будет тебе счастье.
Я вам щас покажу, как я у себя сделал.
player.cpp, функция void CBasePlayer::PostThink(), там есть такой блок кода:
C++ Source Code:
1
// check to see if player landed hard enough to make a sound
2
// falling farther than half of the maximum safe distance, but not as far a max safe distance will
3
// play a bootscrape sound, and no damage will be inflicted. Fallling a distance shorter than half
4
// of maximum safe distance will make no sound. Falling farther than max safe distance will play a
5
// fallpain sound, and damage will be inflicted based on how far the player fell
6
 
7
if ( (FBitSet(pev->flags, FL_ONGROUND)) && (pev->health > 0) && m_flFallVelocity >= PLAYER_FALL_PUNCH_THRESHHOLD )
8
{
9
  // ALERT ( at_console, "%f\n", m_flFallVelocity );
10
  [color=blue]float punch = (m_flFallVelocity > 700 ? 700 : m_flFallVelocity) * 0.02;[/color]
11
 
12
  if (pev->watertype == CONTENT_WATER)
13
  {
14
    // Did he hit the world or a non-moving entity?
15
    // BUG - this happens all the time in water, especially when
16
    // BUG - water has current force
17
    // if ( !pev->groundentity || VARS(pev->groundentity)->velocity.z == 0 )
18
      // EMIT_SOUND(ENT(pev), CHAN_BODY, "player/pl_wade1.wav", 1, ATTN_NORM);
19
  }
20
  else if ( m_flFallVelocity > PLAYER_MAX_SAFE_FALL_SPEED )
21
  {// after this point, we start doing damage
22
 
23
  float flFallDamage = g_pGameRules->FlPlayerFallDamage( this );
24
 
25
  if ( flFallDamage > pev->health )
26
  {//splat
27
  // note: play on item channel because we play footstep landing on body channel
28
  EMIT_SOUND(ENT(pev), CHAN_ITEM, "common/bodysplat.wav", 1, ATTN_NORM);
29
}
30
 
31
if ( flFallDamage > 0 )
32
{
33
  TakeDamage(VARS(eoNullEntity), VARS(eoNullEntity), flFallDamage, DMG_FALL );
34
  //				pev->punchangle.x = 0; здесь я закомментировал
35
  [color=blue]
36
  UTIL_ScreenShake(pev->origin, flFallDamage, flFallDamage * 0.5, flFallDamage * 0.03, 8.0);
37
 
38
  punch += flFallDamage / 3;
39
  pev->punchangle[0] += punch;
40
  pev->punchangle[1] += RANDOM_FLOAT(-punch, punch);
41
  pev->punchangle[2] = RANDOM_FLOAT(-punch, punch);[/color]
42
}
43
}
44
else if (m_flFallVelocity > PLAYER_MAX_SAFE_FALL_SPEED / 2)
45
{
46
  [color=blue]
47
  pev->punchangle[0] += punch;
48
  pev->punchangle[1] += RANDOM_FLOAT(punch / -10, punch / 10);
49
  pev->punchangle[2] = RANDOM_FLOAT(punch / -10, punch / 10);[/color]
50
}
51
 
52
if ( IsAlive() )
53
{
54
  SetAnimation( PLAYER_WALK );
55
}
56
}


Добавлено 23-10-2014 в 03:10:

Синим выделено новое. Если игрок не получает повреждений, то экран качается на манер ку2 или паранойи. Если получает, то экран трясёт скриншейком. Если повреждения большие, то его ещё и перекашивает будь здоров по оси Z. Кое-что подглядел в Паранойе, остальное додумал сам.
З.Ы. код перекашивания камеры по оси Z из pm_shared.c (находится после комментария // Knock the screen around a little bit, temporary effect) можно убрать, чтобы не конфликтовал с кодом в player.cpp


Отправлено SteamPlay43 24-10-2014 в 14:39:

Ku2zoff Как у тебя всё сложно) Я на днях закомментиравал одну строку, и всё заработало со стандартным параметром pmove->punchangle [ 0 ] )
Надо в функции PreThink закомментировать

C++ Source Code:
pev->punchangle.x = 0;

Что огород городить? Было ведь понятно что обнуляется только по оси x.

Добавлено 24-10-2014 в 21:39:

Ku2zoff Но твоя версия тоже сделана неплохо.


Временная зона GMT. Текущее время 00:51. Страницы (2): « 1 [2]
Показать все 21 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024