|
поворачивает ли игрок на право лил на лево прицел
|
|
| He_npeT | Дата: Воскресенье, 22.07.2007, 20:05:01 | Сообщение # 1 |
 Генерал-майор
Группа: Скриптеры
Сообщений: 292
Статус: Не в сети
| Как зделать такой if: if (игрок поворачивает прицел на право || игрок поворачивает прицел на лево) { ?
My CS 1.6 Non-Steam AmXX Server! (HLSW) Play with steam - get autorslot
|
| |
|
|
| slogic | Дата: Понедельник, 23.07.2007, 13:46:23 | Сообщение # 2 |
|
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| в prethink запоминай viewangle. в postthink читаешь новый viewangle. далее берешь две составляющие этого вектора, которые дают процекцию на горизонтальную плоскоять (какие именно - надо узнать экспериментально - я сейчас не готов ответить), ну и далее берешь угол между этими 2D векторами. Знак этого числа и определит направление поворта.
Сообщение отредактировал slogic - Понедельник, 23.07.2007, 13:47:19 |
| |
|
|
| He_npeT | Дата: Понедельник, 23.07.2007, 16:44:23 | Сообщение # 3 |
 Генерал-майор
Группа: Скриптеры
Сообщений: 292
Статус: Не в сети
| Ничего не понимаю...
My CS 1.6 Non-Steam AmXX Server! (HLSW) Play with steam - get autorslot
|
| |
|
|
| VEN | Дата: Понедельник, 23.07.2007, 16:53:22 | Сообщение # 4 |
|
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| В prethink запоминаешь значение *_v_angle, если изменилось, значит прицел повернулся. По разнице старого и нового углов делаешь выводы о величине угла смещения.
|
| |
|
|
| He_npeT | Дата: Понедельник, 23.07.2007, 19:09:09 | Сообщение # 5 |
 Генерал-майор
Группа: Скриптеры
Сообщений: 292
Статус: Не в сети
| Будет ведь xyz по координатам каты, или я тут чтото не так понимаю... Будет как: человек и его окружность или координаты определённой точки обекта нa который он смотрит? И какой из этих 3 данных точка по горизотнали? Code static Float:angle[3]; pev(id, pev_angles, angle); И можно какнибудь зделать, чтобы для каждоко человека было отдельно? Вроде: Code static Float:angle[33][3]; pev(id, pev_angles, angle[id]); токо правильно.
My CS 1.6 Non-Steam AmXX Server! (HLSW) Play with steam - get autorslot
Сообщение отредактировал He_npeT - Понедельник, 23.07.2007, 19:17:45 |
| |
|
|
| slogic | Дата: Понедельник, 23.07.2007, 20:11:22 | Сообщение # 6 |
|
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| Quote (He_npeT) Будет ведь xyz по координатам каты angle содержит вектор относительно игрока, а не относительно точки (0, 0, 0) на карте. Так что можно смело вычислять угол. Зачем я тебе говорил спроецировать на плоскость? Для того, чтобы узнать именно поворот, иначе можно "зацепить" наклоны. В prethink и postthink forward функции передается аргумент id - индекс игрока. Проблем вообще нет. Они как раз и вызываются для каждого игрока.
|
| |
|
|
| He_npeT | Дата: Понедельник, 23.07.2007, 20:41:31 | Сообщение # 7 |
 Генерал-майор
Группа: Скриптеры
Сообщений: 292
Статус: Не в сети
| Code new bool:turning_right[33]; new bool:turning_left[33];
public client_PreThink(id) { static Float:angle[3]; pev(id, pev_angles, angle); }
public client_PostThink(id) { static Float:angle_old[3] = angle[3]; static Float:angle[3]; pev(id, pev_angles, angle); if (angle_old[X] > angle[X]) { turning_left[id] = true; turning_right[id] = false; } else if (angle_old[X] < angle[X]) { turning_left[id] = false; turning_right[id] = true; } else { turning_left[id] = false; turning_right[id] = false; } } Тут я вижу несколько проблем: что вместо Х (1, 2, или 3?). неуверен нащёт static Float:angle_old[3] = angle[3];. ведь сначало идёт prethink над всеми игроками, я уже тогда posttink, то-есть id собъётся (вроде). Да и к таму-же, если по глу игрока, то ведь токо 2 точки должны быть (причём тут дальность - z)?
My CS 1.6 Non-Steam AmXX Server! (HLSW) Play with steam - get autorslot
Сообщение отредактировал He_npeT - Понедельник, 23.07.2007, 20:48:35 |
| |
|
|
| slogic | Дата: Вторник, 24.07.2007, 15:11:04 | Сообщение # 8 |
|
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| Вместо x - 1. Это yaw-угол. А вообще можешь слепить тестовый скрипт и убедиться. ststic - неверное решение: во-первых ты хранишь только для одного игрока углы, а во-вторых, ты не обратишься к массиву из другой функции, т.к. область видимости этого массива (angle[3]) в prethink только внутри тела этой функции. Надо делать два глобальных двумерных массива.
|
| |
|
|
| He_npeT | Дата: Вторник, 24.07.2007, 17:24:05 | Сообщение # 9 |
 Генерал-майор
Группа: Скриптеры
Сообщений: 292
Статус: Не в сети
| Code new bool:turning_right[33]; new bool:turning_left[33];
new old_angle1[33];
public client_PreThink(id) { static Float:angle[3]; pev(id, pev_angles, angle); old_angle1[id] = angle[1]; }
public client_PostThink(id) { static Float:angle[3]; pev(id, pev_angles, angle); if (old_angle1[id] > angle[1]) { turning_left[id] = true; turning_right[id] = false; } else if (old_angle1[id] < angle[1]) { turning_left[id] = false; turning_right[id] = true; } else { turning_left[id] = false; turning_right[id] = false; } } Как я понел теперь правильно? Но я всё= не понимаю что такое PostThink... PreThink как я знаю - это event который вызывается игроком на каждой его fps, но PostThink - чёрт знает...
My CS 1.6 Non-Steam AmXX Server! (HLSW) Play with steam - get autorslot
|
| |
|
|
| slogic | Дата: Вторник, 24.07.2007, 20:55:37 | Сообщение # 10 |
|
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| Как я понял, ты используешь engine модуль, а не fakemeta. PreThink вызывается до применения физики движка, а PostThink - после. Каждый FPS на сервере вызывается как раз функция server_frame(). PreThink/PostThink для группы игроков могут быть вызваны по нескольку раз между вызовами server_frame(). Quote (He_npeT) Как я понел теперь правильно? Вроде правильно (ты даже оптимизацию сделал). Только надо Code new Float:old_angle1[33];
|
| |
|
|
| He_npeT | Дата: Среда, 25.07.2007, 02:07:15 | Сообщение # 11 |
 Генерал-майор
Группа: Скриптеры
Сообщений: 292
Статус: Не в сети
| Спасибо. +1. =]
My CS 1.6 Non-Steam AmXX Server! (HLSW) Play with steam - get autorslot
|
| |
|
|