Позиционирование трейла с отступом от игрока
| |
Naykon
|
Дата: Суббота, 26.07.2014, 16:46:21 | Сообщение # 1 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Есть позиция игрока:
GetClientAbsOrigin(client, g_fOrigin);
Поправляем ее так чтобы трейл находился на расстоянии 100 за спиной игрока:
g_fOrigin[2] = g_fOrigin[2]+100.0;
Но если игрок повершется вокруг своей оси на 180 град. то трейл станет не сзади а спереди!!! Как сделать привязку чтоб трейл был всегда именно за спиной игрока!? Спасибо.
|
|
| |
_wS_
|
Дата: Суббота, 26.07.2014, 17:40:25 | Сообщение # 2 |
|
|
|
| |
horr0r
|
Дата: Суббота, 26.07.2014, 18:44:43 | Сообщение # 3 |
|
Сообщений: 149
Репутация: 40 [ +/- ]
|
|
Я знаю, что у вС'а лучше. Но все же). Вот попробуй мою функцию, я потестил, она работает). Код stock bool:GetAnglePosPlayer(client, Float:angle, Float:radius, Float:vec[3]) { //by horr0rjkee if(client==0 || !IsClientConnected(client)) return false; new Float:pos[3], Float:ang[3]; GetClientEyeAngles(client, ang); GetClientAbsOrigin(client, pos); vec[0] = pos[0] + Cosine(DegToRad(ang[1]+angle))*radius; vec[1] = pos[1] + Sine(DegToRad(ang[1]+angle))*radius; vec[2] = pos[2]; return true; }
То есть в твоем случае, позицию за спиной можно получить так: Код new Float:posvector[3]; GetAnglePosPlayer(client, 180.0, 100.0, posvector); Первый аргумент - client. Тот чью позицию ищем. Второй аргумент - на сколько градусов повернуть позицию. (В твоем случае 180 | 0 - спереди | 90 - справа | 180 - сзади | 270 - слева) Третий аргумент - на какую дистанцию. (В твоем случае 100). Четвертый - переменная, в которую запишется позиция.
Сообщение отредактировал horr0r - Суббота, 26.07.2014, 18:49:52 |
|
| |
Naykon
|
Дата: Суббота, 26.07.2014, 19:17:24 | Сообщение # 4 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
На сколько я понимаю это нужно делать в таймере.. т.е преверять каждую 0.1 сек куда смотрит игрок и соответственно менять позицию трейла?Добавлено (26.07.2014, 19:03:26) --------------------------------------------- Можно ли избежать использования таймера? Добавлено (26.07.2014, 19:17:24) --------------------------------------------- horr0r, не совсем понимаю как это мне поможет. Мы создали трейл который будет всегда на расстоянии 100 от игрока и все время с одной стороны независибо от поворота прицела. Как минимум функция корректировки позиции должна запомнить куда смотрел игрок в момент создания трейла чтоб дальше изменять трейл относительно курсора..
обьясните если я что-то не догоняю..
Код public Action:TrailTimer_Func(Handle:timer, any:client) { new Float:posvector[3]; GetAnglePosPlayer(client, 180.0, 100.0, posvector); TeleportEntity(StringToInt(_trail_index[client]), posvector, {0.0, 90.0, 0.0}, NULL_VECTOR); }
stock bool:GetAnglePosPlayer(client, Float:angle, Float:radius, Float:vec[3]) { if(client==0 || !IsClientConnected(client)) return false; new Float:pos[3], Float:ang[3]; GetClientEyeAngles(client, ang); GetClientAbsOrigin(client, pos); vec[0] = pos[0] + Cosine(DegToRad(ang[1]+angle))*radius; vec[1] = pos[1] + Sine(DegToRad(ang[1]+angle))*radius; vec[2] = pos[2]; return true; }
В результате трейл улетает куда-то в космос (что впринцепи понятно..)
|
|
| |
BarD
|
Дата: Суббота, 26.07.2014, 19:23:41 | Сообщение # 5 |
|
Сообщений: 943
Репутация: 137 [ +/- ]
|
|
Думаю, все видели на некоторых картах трейлы, привязанные к гранатам. Их позиция не меняется, т.е при повороте, они тоже поворачиваются. Почему бы тебе не привязать трейл, скажем, к ножу игрока?
Сообщение отредактировал BarD - Суббота, 26.07.2014, 19:24:43 |
|
| |
Naykon
|
Дата: Суббота, 26.07.2014, 19:31:29 | Сообщение # 6 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
Вообщем за функцию большое спасибо horr0r, не в обиду но я
Код vec[0] = pos[0] + Cosine(DegToRad(ang[1]+angle))*radius; vec[1] = pos[1] + Sine(DegToRad(ang[1]+angle))*radius; vec[2] = pos[2]; где-то раньше видел)))Добавлено (26.07.2014, 19:30:18) --------------------------------------------- BarD, как вариант спасибо. И сразу напомни как получить позицию ножа? + Если игрок стоит и поворачивается вокруг своей оси то нож меняет позицию? Добавлено (26.07.2014, 19:31:29) --------------------------------------------- Можно ли получить индекс ножа у клиента и отловить его позицию? O_o (при условии что она в руках)
|
|
| |
horr0r
|
Дата: Суббота, 26.07.2014, 19:46:46 | Сообщение # 7 |
|
Сообщений: 149
Репутация: 40 [ +/- ]
|
|
Naykon, не надо телепортировать всегда треил. Достаточно только прицепить его к нужной позиции. Скинь код создания треила.
|
|
| |
Naykon
|
Дата: Суббота, 26.07.2014, 20:19:02 | Сообщение # 8 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
мусор.
Сообщение отредактировал Naykon - Воскресенье, 27.07.2014, 22:03:37 |
|
| |
horr0r
|
Дата: Суббота, 26.07.2014, 20:42:36 | Сообщение # 9 |
|
Сообщений: 149
Репутация: 40 [ +/- ]
|
|
Попробуй проще. Вот мой код. Я в твоем не разбирался, уж очень он непонятный. Код new sprite = CreateEntityByName("env_spritetrail"), Float:vpos[3]; GetAnglePosPlayer(client, 180.0, 100.0, vpos); DispatchKeyValueVector(sprite, "origin", vpos); DispatchKeyValue(sprite, "lifetime", "0.5"); DispatchKeyValue(sprite, "startwidth", "8.0"); DispatchKeyValue(sprite, "endwidth", "1.0"); DispatchKeyValue(sprite, "spritename", "sprites/bluelaser1.vmt"); DispatchKeyValue(sprite, "renderamt", "255"); DispatchKeyValue(sprite, "rendercolor", "255 255 255"); DispatchKeyValue(sprite, "rendermode", "5"); DispatchSpawn(sprite); SetVariantString("!activator"); AcceptEntityInput(sprite, "SetParent", client); Затестил. Этот код рабочий.
Сообщение отредактировал horr0r - Суббота, 26.07.2014, 20:48:03 |
|
| |
Naykon
|
Дата: Суббота, 26.07.2014, 22:25:00 | Сообщение # 10 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
эмм... увы этот тип трейла не может корретно отображать рисунки.. (логотипы и т д)..Добавлено (26.07.2014, 22:22:51) --------------------------------------------- horr0r, подскажи как получить позицию сзади на 50 и в лево на 50..? Добавлено (26.07.2014, 22:25:00) --------------------------------------------- это имется в виду 1 позиция.
|
|
| |
horr0r
|
Дата: Суббота, 26.07.2014, 22:39:50 | Сообщение # 11 |
|
Сообщений: 149
Репутация: 40 [ +/- ]
|
|
А разве есть еще какие-либо типы треилов??? Entity - env_spritetrail.
GetAnglePosPlayer(client, 180.0, 50.0, vpos); 180.0 - сзади 90.0 - слева 270.0 - справа 0/360.0 - спереди
Сообщение отредактировал horr0r - Суббота, 26.07.2014, 22:41:10 |
|
| |
Naykon
|
Дата: Воскресенье, 27.07.2014, 00:08:01 | Сообщение # 12 |
|
Сообщений: 439
Репутация: -4 [ +/- ]
|
|
я имею ввиду твой код не корректно отображает картинки (типа адидас, логотипы и т д..)
Ты меня не понял. Мне нужно чтоб точка была одна (сзади за 50 и слево на 50).. кароче под углом 45 градусов.. вообщем тут геометрия осталась сам разберусь спс.Добавлено (27.07.2014, 00:08:01) --------------------------------------------- Каждую секунду я поправлял трейл назад клиента относительно его прицела с помошью функции horr0r (аналог wS). Но функция чтоб непосредственно извенить точку начала трейла я воспользовался TeleportEntity(StringToInt(_trail_index[client][0]), height, NULL_VECTOR, NULL_VECTOR); - однако, трейл телепортнулся в указанную точки и счез.. где я ошибся вопрос 1 поста остается Актуален.
|
|
| |
Tokami
|
Дата: Воскресенье, 27.07.2014, 00:56:49 | Сообщение # 13 |
|
Сообщений: 238
Репутация: 19 [ +/- ]
|
|
Naykon, благодарю за трейлы а то я пользовался способом horr0ra а твои трейлы мне нравится больше)
|
|
| |
horr0r
|
Дата: Воскресенье, 27.07.2014, 12:09:34 | Сообщение # 14 |
|
Сообщений: 149
Репутация: 40 [ +/- ]
|
|
Почему не может корректно отобразить? Измени строку Код DispatchKeyValue(sprite, "spritename", "путь до треила"); Сейчас затестю. Логотип какой-нибудь.
|
|
| |
BarD
|
Дата: Воскресенье, 27.07.2014, 12:11:00 | Сообщение # 15 |
|
Сообщений: 943
Репутация: 137 [ +/- ]
|
|
Попробуй к ножу привязать.
Функция нахождения координат по индексу:
Код new Float:pos[3]; GetEntPropVector(index, Prop_Send, "m_vecOrigin", pos);
|
|
| |
|