HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > [help] помогите с кодом брашей
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
~ X ~
offline

Дата регистрации: Oct 2005
Проживает: Архангельск
Сообщений: 3619

Рейтинг



Награды
 
[1 награда]


Question [help] помогите с кодом брашей

Доброго дня!
Очень нужна помощь с кодом конпок, дверей и прочих движущихся брашей.
Проблема началась с того что Spark() у кнопок вызывался как-то рандомно и криво. В итоге оказалось, что надо отвязывать механизм MoveDone() от Think(), иначе что-то сделать неовзможно. Пробовал делать такое, но тут вообще рандом получается, т.к. ltime ведет себя непредсказуемо.

C++ Source Code:
1
//-----------------------------------------------------------------------------
2
// Purpose: Additional layer to replace engine's calls to MoveDone as THINK funcitons.
3
// Warning: In XDM thinking should work regardless of movement.
4
// Callers: engine: DispatchThink()
5
//-----------------------------------------------------------------------------
6
void CBaseToggle::Think(void)
7
{
8
  bool bWasAlwaysThinking = FBitSet(pev->flags, FL_ALWAYSTHINK);
9
  if (m_flArrivalTimeMov != 0.0f)
10
  {
11
    if (m_flArrivalTimeMov + pev->ltime <= gpGlobals->time && !pev->velocity.IsZero())
12
      LinearMoveDone();
13
    else
14
      conprintf(2, "%s[%d] \"%s\"::Think() origin %f %f %f -> dest %f %f %f\n", ENTFMT_P, pev->origin.x, pev->origin.y, pev->origin.z, m_vecFinalDest.x, m_vecFinalDest.y, m_vecFinalDest.z);
15
  }
16
  if (m_flArrivalTimeRot != 0.0f && m_flArrivalTimeRot + pev->ltime <= gpGlobals->time && !pev->avelocity.IsZero())// TODO
17
    AngularMoveDone();
18
 
19
  if (!FBitSet(pev->flags, FL_ALWAYSTHINK) || (pev->nextthink != 0 && pev->nextthink <= gpGlobals->time))// XDM3039
20
    CBaseEntity::Think();
21
 
22
  if (bWasAlwaysThinking)
23
  {
24
    SetBits(pev->flags, FL_ALWAYSTHINK);// in case someone cleared it
25
    SetNextThink(0);
26
  }
27
}
28
 
29
//-----------------------------------------------------------------------------
30
// Purpose: XDM3039: Is this entity actually moving right now?
31
//-----------------------------------------------------------------------------
32
bool CBaseToggle::IsMoving(void) const
33
{
34
  return !pev->velocity.IsZero() || !pev->avelocity.IsZero();
35
}
36
 
37
//-----------------------------------------------------------------------------
38
// Purpose: Calculate pev->velocity and pev->nextthink to reach vecDest from pev->origin traveling at flSpeed
39
// Note   : Better to SetMoveDone() BEFORE calling this.
40
// Input  : vecDest - absolute destination coordinates
41
//			flSpeed - units per second
42
//-----------------------------------------------------------------------------
43
void CBaseToggle::LinearMove(const Vector &vecDest, const float &flSpeed)
44
{
45
  if (vecDest == pev->origin)// Already there?
46
  {
47
    m_vecFinalDest = vecDest;
48
    LinearMoveDone();
49
    return;
50
  }
51
  if (flSpeed == 0.0f)// XDM3038c
52
    return;
53
 
54
  m_vecFinalDest = vecDest;
55
  // set destdelta to the vector needed to move
56
  Vector vecDestDelta(vecDest); vecDestDelta -= pev->origin;
57
 
58
  // divide vector length by speed to get time to reach dest
59
  float flTravelTime = vecDestDelta.Length() / flSpeed;
60
 
61
  m_flArrivalTimeMov = pev->ltime + flTravelTime;// XDM3039: WTF TESTME
62
  SetBits(pev->flags, FL_ALWAYSTHINK);// XDM3039
63
  SetNextThink(0);
64
 
65
  // scale the destdelta vector by the time spent traveling to get velocity
66
  pev->velocity = vecDestDelta / flTravelTime;
67
  DBG_PrintF("%s[%d] \"%s\"::LinearMove(): velocity %f %f %f, time %g, ArrivalTime %g\n", ENTFMT_P, pev->velocity.x, pev->velocity.y, pev->velocity.z, flTravelTime, m_flArrivalTimeMov);
68
}
69
 
70
//-----------------------------------------------------------------------------
71
// Purpose: Another hack
72
// After moving, set origin to exact final destination, call "move done" function
73
//-----------------------------------------------------------------------------
74
void CBaseToggle::LinearMoveDone(void)
75
{
76
  Vector delta(m_vecFinalDest); delta -= pev->origin;// HL20130901
77
  vec_t error = delta.Length();
78
  if (error > MOVEMENT_POSIITON_ERROR_MAX)
79
  {
80
    LinearMove(m_vecFinalDest, error/max(0.001, gpGlobals->frametime));// move one frame, prevent resonance?
81
    return;
82
  }
83
 
84
  UTIL_SetOrigin(this, m_vecFinalDest);
85
  pev->velocity.Clear();
86
  m_flArrivalTimeMov = 0.0f;
87
 
88
  if (m_pfnCallWhenMoveDone)
89
    (this->*m_pfnCallWhenMoveDone)();
90
}
91
 
92
//-----------------------------------------------------------------------------
93
// Purpose: Calculate pev->avelocity and pev->nextthink to reach vecDestAngles from pev->angles traveling at flSpeed
94
// Input  : vecDestAngles - absolute destination angles
95
//			flSpeed - degrees per second
96
//-----------------------------------------------------------------------------
97
void CBaseToggle::AngularMove(const Vector &vecDestAngles, const float &flSpeed)
98
{
99
  if (vecDestAngles == pev->angles)// Already there?
100
  {
101
    m_vecFinalAngle = vecDestAngles;
102
    AngularMoveDone();
103
    return;
104
  }
105
  if (flSpeed == 0.0f)// XDM3038c
106
    return;
107
 
108
  m_vecFinalAngle = vecDestAngles;
109
  // set destdelta to the vector needed to move
110
  Vector vecDestDelta(vecDestAngles); vecDestDelta -= pev->angles;
111
 
112
  // divide by speed to get time to reach dest
113
  float flTravelTime = vecDestDelta.Length() / flSpeed;
114
 
115
  m_flArrivalTimeRot = pev->ltime + flTravelTime;// XDM3039: WTF TESTME
116
  SetBits(pev->flags, FL_ALWAYSTHINK);// XDM3039
117
  SetNextThink(0);
118
 
119
  // scale the destdelta vector by the time spent traveling to get velocity
120
  pev->avelocity = vecDestDelta / flTravelTime;
121
  DBG_PrintF("%s[%d] \"%s\"::LinearMove(): avelocity %f %f %f, TravelTime %g, ArrivalTime %g, CurTime %g, LocalTime %g\n", ENTFMT_P, pev->avelocity.x, pev->avelocity.y, pev->avelocity.z, flTravelTime, m_flArrivalTimeRot, gpGlobals->time, pev->ltime);
122
}
123
 
124
//-----------------------------------------------------------------------------
125
// Purpose: another hack
126
// After rotating, set angle to exact final angle, call "move done" function
127
//-----------------------------------------------------------------------------
128
void CBaseToggle::AngularMoveDone(void)
129
{
130
  pev->angles = m_vecFinalAngle;
131
  pev->avelocity.Clear();
132
  m_flArrivalTimeRot = 0.0f;
133
 
134
  if (m_pfnCallWhenMoveDone)
135
    (this->*m_pfnCallWhenMoveDone)();
136
}


GUYZ, PLZ HLP!

Скрытый текст:
Этот текст скрытый. Вы должны оставить хотя бы одно сообщение в теме, чтобы его увидеть.

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]

Сообщить модератору | | IP: Записан
Сообщение: 173557

Старое сообщение 21-09-2018 10:45
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
~ X ~ писал:
как-то

Цитата:
~ X ~ писал:
что-то

Цитата:
~ X ~ писал:
тут вообще рандом

Цитата:
~ X ~ писал:
непредсказуемо

Я так и не понял, какая поставлена задача и что именно не получается?

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 173558

Старое сообщение 21-09-2018 12:42
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Если уж стоит флаг FL_ALWAYSTHINK, для чего тогда нужен весь остальной код?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 173559

Старое сообщение 21-09-2018 15:22
-
~ X ~
offline

Дата регистрации: Oct 2005
Проживает: Архангельск
Сообщений: 3619

Рейтинг



Награды
 
[1 награда]


Скрытый текст:
Этот текст скрытый. Вы должны оставить хотя бы одно сообщение в теме, чтобы его увидеть.


XaeroX по-моему, задача предельно простая: надо отвязвать механизм MoveDone() от Think(). Т.е. чтобы MoveDone() вызывался независимо ни от чего, и SetThink() - тоже. Желательно и linear/angular (в терминах ХЛ) сделать независимыми друг от друга.
В данный момент все пробелмы в приведенном выше Think(). Я не знаю как отследить тот момент когда надо вызывать MoveDone() при условии возникновения всяких Blocked() и прочих исключений. Для этого явно служит ltime, но не понятно как его использовать.
FL_ALWAYSTHINK - это хак чтобы заставить движок вызывать Think() каждый кадр и уже руками сравнивать nextthink и вызывать коллбэки. Без него время вызова для брашей регулируется "погодой на марсе".

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]

Сообщить модератору | | IP: Записан
Сообщение: 173560

Старое сообщение 21-09-2018 15:38
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Чтобы развязать - надо кастомную физику, иначе никак.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 173561

Старое сообщение 21-09-2018 17:55
-
~ X ~
offline

Дата регистрации: Oct 2005
Проживает: Архангельск
Сообщений: 3619

Рейтинг



Награды
 
[1 награда]


Дядя Миша ты хочешь сказать, что отталкиваться от ltime вообще не получится? Должен же быть способ!

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]

Сообщить модератору | | IP: Записан
Сообщение: 173564

Старое сообщение 21-09-2018 19:42
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



~ X ~ pev->nextthink = pev->ltime + 0.1; попробуй.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 173565

Старое сообщение 21-09-2018 20:40
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
~ X ~ писал:
m_flArrivalTimeRot + pev->ltime <= gpGlobals->time

Так делать нельзя, ты сравниваешь локальное время мувера и глобальное время. Они не сравнимы.
Нужно отнимать фреймтайм от m_flArrivalTimeRot (ну или тчинктайм - тогда надо кешировать предыдущий локалтайм, чтобы узнать дельту) и сравнивать его с нулём.

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 173566

Старое сообщение 21-09-2018 20:55
-
~ X ~
offline

Дата регистрации: Oct 2005
Проживает: Архангельск
Сообщений: 3619

Рейтинг



Награды
 
[1 награда]


Цитата:
Дядя Миша писал:
~ X ~ pev->nextthink = pev->ltime + 0.1; попробуй.

Так это ж будет фиксированный интервал в 10ФПС, не?
И где попробовать? И что оно должно сделать?
В оригинале LinearMove() так и было. Только там было pev->nextthink = pev->ltime + movement_time. И движок внутри этот nextthink как-то сдвигал во время Blocked(), если я не ошибаюсь.

XaeroX:
а как же тогда ДМ пишет сообщением выше чтобы я локальное время совал в глобальное? Вообще я не понял концепцию локального времени мувера. Я честно много раз пытался смотреть код PushMove(), но от него откровенно голова идет крУгом. Я думал что ltime начинает расти во время блока, но нет. Оно могло бы быть версией глобального времени с отставанием, но тоже нет. Можешь тогда кодом написать, что и с чем сравнивать каждый кадр?

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]

Сообщить модератору | | IP: Записан
Сообщение: 173567

Старое сообщение 22-09-2018 10:21
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
~ X ~ писал:
Так это ж будет фиксированный интервал в 10ФПС, не?

А сколько надо?

Цитата:
~ X ~ писал:
Вообще я не понял концепцию локального времени мувера

Глобальное время идёт от начала уровня, локальное - от начала движения мувера. Ну или если задать nextthink.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 173568

Старое сообщение 22-09-2018 13:03
-
~ X ~
offline

Дата регистрации: Oct 2005
Проживает: Архангельск
Сообщений: 3619

Рейтинг



Награды
 
[1 награда]


Дядя Миша "думать" надо каждый кадр. Тога получается, что время прибытия для браша надо определять так:

C++ Source Code:
1
Think()
2
{
3
  if (pev->ltime >= m_fMovementTime)
4
    LinearMoveDone();
5
}

? Где m_fMovementTime будет задана в начале движения т.е. m_fMovementTime = flTravelTime;

Как-то оно слишком просто получается. Где-то там были подводные камни. Имхо, была ситуация когда ltime вело себя нелинейно или вообще не менялось... надо дампануть всё в spreadsheet и построить график...

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]

Сообщить модератору | | IP: Записан
Сообщение: 173569

Старое сообщение 22-09-2018 13:39
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
~ X ~ писал:
Имхо, была ситуация когда ltime вело себя нелинейно или вообще не менялось...

Ну да, есть такое. Поэтому я и говорю что надо кастомную физику. Меня это говно тоже не устраивало.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 173570

Старое сообщение 22-09-2018 13:45
-
~ X ~
offline

Дата регистрации: Oct 2005
Проживает: Архангельск
Сообщений: 3619

Рейтинг



Награды
 
[1 награда]


Дядя Миша а со стандартным HL API такое возможно?

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]

Сообщить модератору | | IP: Записан
Сообщение: 173571

Старое сообщение 22-09-2018 16:22
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Теоретически да, надо всем энтитям поставить MOVETYPE_NONE и в StartFrame делать кастомную физику. Но я сам не пробовал.

Добавлено 22-09-2018 в 20:02:

Прикинул так-сяк, да наверное должно сработать, если затрагивать только муверы. А остальные типы нет смысла переделывать.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 173572

Старое сообщение 22-09-2018 17:02
-
~ X ~
offline

Дата регистрации: Oct 2005
Проживает: Архангельск
Сообщений: 3619

Рейтинг



Награды
 
[1 награда]


Понятно. Т.е. не совсем понятно, конечно, но главное что это сильно затратно будет по жизненным ресурсам. Я так никогда рисовать не сяду
В общем, придется, навное, вернуть как было. Спарки кнопкам сделаю рендерсистемой.
Но вообще - уныние

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]

Сообщить модератору | | IP: Записан
Сообщение: 173573

Старое сообщение 24-09-2018 11:02
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 08:07. Новая тема    Ответить
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > [help] помогите с кодом брашей
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

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