Jump to content

Помогите с Nametag HUD


Recommended Posts

Захотелось переделать стандартный 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) 

9eb22f091c42.jpg

4d715487b21b.jpg

Link to comment

Попробуй в цикле поменять:

local x, y, _ = getElementPosition( element ); 
local z = getPedBonePosition( element, 5 ) + 0.5; 

И так же рекомендовал бы тебе все таки учесть checkObjects в

isLineOfSightClear 

Т.к если в дальнейшем объекты будут заменены и между игроками будет большой объект, то ты сам понял. Так же есть смысл менять размер и непрозрачностью прямоугольников в процентом соотношении в зависимости от расстояния.

Link to comment
  • 2 weeks later...

Бери дистанцию от точки отображения Nametag'a до твоей камеры и изменяй размер Nametag'a относительно дистанции: чем меньше дистанция - тем больше Nametag. Для текста - просто, а вот с НР и броней чуть сложнее... хотя.

getDistanceBetweenPoints3D -- взять дистанцию между двумя точками 
  
scale = 1 / (dist * 0.1) 
-- scale - размер Nametag'a  
-- dist - естесьно дистанция. 
-- с этими циферками надо поэкспериментировать, что-бы добиться нужного.. 
  

Link to comment

Ребят, спасибо за советы. Все получилось. И правда, это всего лишь математика и масштабирование всех элементов зависит от дистанции.

И самое главное - не используй elseif, только таблицы!

Естественно)

И так же рекомендовал бы тебе все таки учесть checkObjects в
isLineOfSightClear 

Т.к если в дальнейшем объекты будут заменены и между игроками будет большой объект, то ты сам понял. Так же есть смысл менять размер и непрозрачностью прямоугольников в процентом соотношении в зависимости от расстояния.

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

Link to comment
Естественно)

Я не шучу, вообще то!

ltiIxwR-prw.jpg

Ваше блюдо готово. Приятного аппетита.

  
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

Окей, усложним. После каждой проверки мы вызываем уникальную функцию (она не может повторятся) и триггерим уникальный эвент, переделайте, пожалуйста.

Link to comment
Окей, усложним. После каждой проверки мы вызываем уникальную функцию (она не может повторятся) и триггерим уникальный эвент, переделайте, пожалуйста.

Я и obuhhh не говорили вообще отказаться от элсифов, просто там, откуда ты выдрал его сообщение, используют их именно так.

А про "переделайте"

case = { 
[1] = function()  uniqueFunc() triggerSomeEvent() end, 
[2] = function()  uniqueFunc2() triggerSomeEvent2() end, 
} 

Только не нужно говорить "а если нужно проверить несколько переменных". Хотя и такое можно сделать, только там уже лишние проблемы, нежели удобство.

Link to comment
Окей, усложним. После каждой проверки мы вызываем уникальную функцию (она не может повторятся) и триггерим уникальный эвент, переделайте, пожалуйста.

Зачем? if`ы будут работать быстрее и потре:Oть меньше памяти, нежели вариант с таблицей и функциями

ltiIxwR-prw.jpg

Человек явно с другой планеты. Меньше слушайте подобных доморощенных "экспертов".

Link to comment
  • 4 months later...

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...