Jump to content

Требуется помощь в скрипте


Recommended Posts

Я создал скрипт банковой системы,сделал интерфейс из плоского виртуальный,тоесть все гуишки летают в 3д мире,и у меня появился один баг,когда я смотрю на эти гуишки и резко поворачиваю камеру более 90*(тоесть в другую сторону) на экране остаётся этот гуи

Как мне это исправить?

c88940732e49.jpg

00431c586599.jpg

Link to comment
  • Replies 92
  • Created
  • Last Reply

Top Posters In This Topic

Да я это уже пытался сделать,даже если поставить событие - дело в том что если обычно поверно камеру то на экране нечего не будет,но если со всей скорости повернуть то вот такой отпечаток остаётся =),я поставил проверку что если гуишки близки к границам экрана то они должны физический удаляться ,но это не помогает

Link to comment

В getScreenFromWorldPosition задай 4ый параметр на среднюю ширину гуи элемента (это чтобы красивее смотрелось и гуи уходило за экран а не исчезало около краев), и когда эта функция начинает возвращать false а гуи еще видно, скрывай его.

Link to comment
  
local myWindow = guiCreateWindow ( 0, 0, 100, 50, "boo", false ) 
guiSetVisible ( myWindow, false ) 
  
addEventHandler ( "onClientRender", getRootElement(), function() 
    local width = guiGetSize ( myWindow, false ) 
    local x, y = getScreenFromWorldPosition ( 10, 10, 3, width ) 
    if ( x ) then -- Если координаты есть 
        guiSetVisible ( myWindow, true ) -- показываем 
        guiSetPosition ( myWindow, x, y, false ) -- задаем позицию 
    else -- Если координат нет 
        guiSetVisible ( myWindow, false ) -- скрываем 
    end 
end ) 
  

Link to comment
Напишите пожалуйста пример использования проверки на false функции getScreenFromWorldPosition

допустим, твой 2Д элемент экрана имеет размеры 300*300, укажешь 4ым параметром в функции getScreenFromWorldPosition эти 300. Тогда функция может возвращать координаты, расположенные вне видимости экрана, но не дальше чем на 300 пикселей (которые ты указал) от границы экрана. Дальше 300 пикселей за границей экрана функция будет возвращать false.

Link to comment

Вот часть кода

function virtual_interface() 
  lolka = getElementByID("lolka") 
  local prxpt, prypt, przpt = getElementPosition (lolka) 
  local camx, camy, camz = getCameraMatrix() 
  local dist = getDistanceBetweenPoints3D( camx, camy, camz, prxpt, prypt, przpt ) 
  local px, py = getScreenFromWorldPosition( prxpt, prypt, przpt, 80.0 ,false ) 
      if (px) then 
        if (rightclick ~= 1) then 
          if ((dist >= 1) and (dist <= 10)) then 
            guiSetPosition ( LabelW, px-125, py-100, false ) 
            guiSetPosition ( LabelD, px+25, py-100, false ) 
            guiSetPosition ( LabelS, px-150, py-50, false ) 
            guiSetPosition ( LabelSM, px+50, py-50, false ) 
            guiSetPosition ( LabelOK, px+40, py-70, false ) 
            guiSetPosition ( amount_money, px-50, py-75, false ) 
            guiSetPosition ( sendnick1, px, py-25, false ) 
            guiSetPosition ( sendmoney1, px+100, py-25, false ) 
            guiSetPosition ( balance, px-200, py-25, false ) 
            guiSetPosition ( LabelSEND, px+140, py+10, false ) 
            --guiSetPosition ( RadioW, px-145, py-100, false ) 
            --guiSetPosition ( RadioS, px-170, py-50, false ) 
            --guiSetPosition ( RadioD, px+115, py-100, false ) 
            --guiSetPosition ( RadioSM, px+125, py-50, false ) 
            ----------------------------------------------------- 
            guiSetVisible ( LabelW, true ) 
            guiSetVisible ( LabelD, true ) 
            guiSetVisible ( LabelS, true ) 
            guiSetVisible ( LabelSM, true ) 
            guiSetVisible ( LabelOK, true ) 
            guiSetVisible ( amount_money, true ) 
            guiSetVisible ( sendnick1, true ) 
            guiSetVisible ( sendmoney1, true ) 
            guiSetVisible ( balance, true ) 
            guiSetVisible ( LabelSEND, true ) 
            --guiSetVisible ( RadioW, true ) 
            --guiSetVisible ( RadioS, true ) 
            --guiSetVisible ( RadioD, true ) 
            --guiSetVisible ( RadioSM, true ) 
          else 
          guiSetVisible ( LabelW, false ) 
          guiSetVisible ( LabelD, false ) 
          guiSetVisible ( LabelS, false ) 
          guiSetVisible ( LabelSM, false ) 
          guiSetVisible ( LabelOK, false ) 
          guiSetVisible ( amount_money, false ) 
          guiSetVisible ( sendnick1, false ) 
          guiSetVisible ( sendmoney1, false ) 
          guiSetVisible ( balance, false ) 
          guiSetVisible ( LabelSEND, false ) 
          --guiSetVisible ( RadioW, false ) 
          --guiSetVisible ( RadioS, false ) 
          --guiSetVisible ( RadioD, false ) 
          --guiSetVisible ( RadioSM, false ) 
        end 
      end   
    end 
  end 
  

Link to comment

А если какой-нибудь из предыдущих if'ов не пустит то до этого else'a никогда не дойдет, я бы сделал вот так

  
function virtual_visible ( visible ) 
  guiSetVisible ( LabelW, visible ) 
  guiSetVisible ( LabelD, visible ) 
  guiSetVisible ( LabelS, visible ) 
  guiSetVisible ( LabelSM, visible ) 
  guiSetVisible ( LabelOK, visible ) 
  guiSetVisible ( amount_money, visible ) 
  guiSetVisible ( sendnick1, visible ) 
  guiSetVisible ( sendmoney1, visible ) 
  guiSetVisible ( balance, visible ) 
  guiSetVisible ( LabelSEND, visible ) 
  --guiSetVisible ( RadioW, visible ) 
  --guiSetVisible ( RadioS, visible ) 
  --guiSetVisible ( RadioD, visible ) 
  --guiSetVisible ( RadioSM, visible ) 
end 
  
function virtual_interface() 
  lolka = getElementByID("lolka") 
  local prxpt, prypt, przpt = getElementPosition (lolka) 
  local camx, camy, camz = getCameraMatrix() 
  local dist = getDistanceBetweenPoints3D( camx, camy, camz, prxpt, prypt, przpt ) 
  local px, py = getScreenFromWorldPosition( prxpt, prypt, przpt, 80.0 ,false ) 
  if (px) then 
    if (rightclick ~= 1) then 
      if ((dist >= 1) and (dist <= 10)) then 
        virtual_visible ( true ) 
        guiSetPosition ( LabelW, px-125, py-100, false ) 
        guiSetPosition ( LabelD, px+25, py-100, false ) 
        guiSetPosition ( LabelS, px-150, py-50, false ) 
        guiSetPosition ( LabelSM, px+50, py-50, false ) 
        guiSetPosition ( LabelOK, px+40, py-70, false ) 
        guiSetPosition ( amount_money, px-50, py-75, false ) 
        guiSetPosition ( sendnick1, px, py-25, false ) 
        guiSetPosition ( sendmoney1, px+100, py-25, false ) 
        guiSetPosition ( balance, px-200, py-25, false ) 
        guiSetPosition ( LabelSEND, px+140, py+10, false ) 
        --guiSetPosition ( RadioW, px-145, py-100, false ) 
        --guiSetPosition ( RadioS, px-170, py-50, false ) 
        --guiSetPosition ( RadioD, px+115, py-100, false ) 
        --guiSetPosition ( RadioSM, px+125, py-50, false ) 
        return 
      end 
    end   
  end 
  virtual_visible ( false ) 
end 
  

А еще, ты все свои вот эти элементы можешь поместить на одни большой text label и двигать/скрывать сразу все

Link to comment

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

Link to comment
Так вот, решил я сделать простенький скрипт, чтоб люди могли подойдя к скамейкам усаживаться на них, но возникла проблема такого плана;- когда применяется анимация то садиться можно только на краюшек скамьи. Ясное дело скажете вы указать новую позицию игроку. Я бы такое уже давно сделал. Только вот проблема никогда не знаешь куда будет повернуты скамейки. отсюда вытекает что нужна какая то формула чтобы можно было вычислить точку перед игроком вне зависимости от поворота игрока.

Не думаю что формула в данном случае послужит панацеей. Фактически у каждого отдельного объекта оси разнятся, соответственно качественно определить необходимое вращение достаточно сложно. Если объектов, требующих взаимодействия много, логично создать таблицу, где для каждой модели указать определенный угол. Функция Attach поможет определить смещение, которое опять таки нужно занести в таблицу.

Link to comment

А вы в реальности попробуйте сесть на скамейку, не зная где она находится! Вот тут также, откуда сервер или клиент знает, что перед игроком скамейка? Нет такой функции, которая бы дала список ближайших стандартных объектов, и нет такого функции, чтобы из этого списка найти ИД или название объекта, который является скамейкой. Вот если бы скамейки были созданы с помощью МЕ, тогда такой список ближайших объектов можно получить и узнать, возле какой скамейки стоит игрок и, стессна, грамотно усадить его на нее..

Link to comment
А вы в реальности попробуйте сесть на скамейку, не зная где она находится! Вот тут также, откуда сервер или клиент знает, что перед игроком скамейка? Нет такой функции, которая бы дала список ближайших стандартных объектов, и нет такого функции, чтобы из этого списка найти ИД или название объекта, который является скамейкой. Вот если бы скамейки были созданы с помощью МЕ, тогда такой список ближайших объектов можно получить и узнать, возле какой скамейки стоит игрок и, стессна, грамотно усадить его на нее..

Ну если бы была функция управления стандартными объектами карты.. Кстати не помешало бы такое, например что бы удалить эти светофоры и поставить свои или что бы удалить нафиг всё :D

Link to comment

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...