AMARANT Posted January 27, 2015 Share Posted January 27, 2015 Захотелось переделать стандартный Nametag и вот столкнулся с проблемой отображения его на расстоянии. Как видно на скриншотах, если стоять вблизи персонажа, то тэг отображается нормально. Но стоит отбежать на дистанцию, как этот тэг наслаивается на самого персонажа и это выглядит уродливо. Как бы по сути, исходя из моего кода, это и должно происходить, ведь нужно вычислять правильные координаты зависящие от расстояния, но я этого не знаю как делать Хотелось бы чтобы этот текст поднимался или масштабировался по мере отдаления/приближения. Выкладываю мой код и скрины, может кто поможет: local sx,sy = guiGetScreenSize() function draw3DText() for _,element in ipairs(getElementsByType("player",root)) do local x,y,z = getElementPosition(element) local cx,cy,cz = getCameraMatrix() local distance = getDistanceBetweenPoints3D(cx,cy,cz,x,y,z) if distance<40 and element~=localPlayer then local wx,wy = getScreenFromWorldPosition(x,y,z+1.2) if wx and wy and isLineOfSightClear(cx,cy,cz,x,y,z,true,true,false,false,false) then dxDrawFramedText("Ололош_Ололоев",wx,wy,wx,wy,255,255,255,1.1,"default-bold","center","top") -- Кастомная функция отрисовки текста "с рамочкой". dxDrawRectangle ( wx-16/1024*sx, wy+19/768*sy, 32/1024*sx, 6/768*sy , tocolor(0,0,0) ) dxDrawRectangle ( wx-15/1024*sx, wy+20/768*sy, 30*getElementHealth(element)/100/1024*sx, 4/768*sy, tocolor(200,0,0) ) dxDrawRectangle ( wx-16/1024*sx, wy+12/768*sy, 32/1024*sx, 6/768*sy , tocolor(20,20,20) ) dxDrawRectangle ( wx-15/1024*sx, wy+13/768*sy, 30*getPedArmor(element)/100/1024*sx, 4/768*sy, tocolor(255,255,255) ) end end end end addEventHandler("onClientRender",root,draw3DText) Link to comment
N1kS Posted January 29, 2015 Share Posted January 29, 2015 Попробуй в цикле поменять: local x, y, _ = getElementPosition( element ); local z = getPedBonePosition( element, 5 ) + 0.5; И так же рекомендовал бы тебе все таки учесть checkObjects в isLineOfSightClear Т.к если в дальнейшем объекты будут заменены и между игроками будет большой объект, то ты сам понял. Так же есть смысл менять размер и непрозрачностью прямоугольников в процентом соотношении в зависимости от расстояния. Link to comment
obuhhh Posted February 9, 2015 Share Posted February 9, 2015 Бери дистанцию от точки отображения Nametag'a до твоей камеры и изменяй размер Nametag'a относительно дистанции: чем меньше дистанция - тем больше Nametag. Для текста - просто, а вот с НР и броней чуть сложнее... хотя. getDistanceBetweenPoints3D -- взять дистанцию между двумя точками scale = 1 / (dist * 0.1) -- scale - размер Nametag'a -- dist - естесьно дистанция. -- с этими циферками надо поэкспериментировать, что-бы добиться нужного.. Link to comment
N1kS Posted February 9, 2015 Share Posted February 9, 2015 И самое главное - не используй elseif, только таблицы! Link to comment
AMARANT Posted February 9, 2015 Author Share Posted February 9, 2015 Ребят, спасибо за советы. Все получилось. И правда, это всего лишь математика и масштабирование всех элементов зависит от дистанции. И самое главное - не используй elseif, только таблицы! Естественно) И так же рекомендовал бы тебе все таки учесть checkObjects в isLineOfSightClear Т.к если в дальнейшем объекты будут заменены и между игроками будет большой объект, то ты сам понял. Так же есть смысл менять размер и непрозрачностью прямоугольников в процентом соотношении в зависимости от расстояния. Проверку объектов просто пропустил. Потом уже заметил и исправил, когда из-за дерева был виден ник. В общем, все равно спасибо. Link to comment
N1kS Posted February 9, 2015 Share Posted February 9, 2015 Естественно) Я не шучу, вообще то! Link to comment
Elengar Posted February 9, 2015 Share Posted February 9, 2015 Естественно) Я не шучу, вообще то! Ваше блюдо готово. Приятного аппетита. if var == 22 then var2 = 10 elseif var == 20 then var2 = 20 elseif var == 23 then var2 = 5 elseif var == 9 then var2 = 20 elseif var == 7 then var2 = 14 elseif var == 12 then var2 = 16 elseif var == 10 then var2 = 13 elseif var == 24 then var2 = 23 elseif var == 16 then var2 = 18 elseif var == 4 then var2 = 16 elseif var == 1 then var2 = 7 elseif var == 4 then var2 = 21 elseif var == 4 then var2 = 11 elseif var == 4 then var2 = 3 elseif var == 25 then var2 = 6 elseif var == 13 then var2 = 21 end Link to comment
N1kS Posted February 9, 2015 Share Posted February 9, 2015 Окей, усложним. После каждой проверки мы вызываем уникальную функцию (она не может повторятся) и триггерим уникальный эвент, переделайте, пожалуйста. Link to comment
Elengar Posted February 10, 2015 Share Posted February 10, 2015 Окей, усложним. После каждой проверки мы вызываем уникальную функцию (она не может повторятся) и триггерим уникальный эвент, переделайте, пожалуйста. Я и obuhhh не говорили вообще отказаться от элсифов, просто там, откуда ты выдрал его сообщение, используют их именно так. А про "переделайте" case = { [1] = function() uniqueFunc() triggerSomeEvent() end, [2] = function() uniqueFunc2() triggerSomeEvent2() end, } Только не нужно говорить "а если нужно проверить несколько переменных". Хотя и такое можно сделать, только там уже лишние проблемы, нежели удобство. Link to comment
Kernell Posted February 10, 2015 Share Posted February 10, 2015 Окей, усложним. После каждой проверки мы вызываем уникальную функцию (она не может повторятся) и триггерим уникальный эвент, переделайте, пожалуйста. Зачем? if`ы будут работать быстрее и потре:Oть меньше памяти, нежели вариант с таблицей и функциями Человек явно с другой планеты. Меньше слушайте подобных доморощенных "экспертов". Link to comment
STAWR Posted June 25, 2015 Share Posted June 25, 2015 у нормальных скриптеров массивы, а не таблицы Link to comment
Kernell Posted June 25, 2015 Share Posted June 25, 2015 у нормальных скриптеров массивы, а не таблицы А программисты знают разницу между массивами и таблицами Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now