sir135 Posted February 7, 2011 Share Posted February 7, 2011 Я создал скрипт банковой системы,сделал интерфейс из плоского виртуальный,тоесть все гуишки летают в 3д мире,и у меня появился один баг,когда я смотрю на эти гуишки и резко поворачиваю камеру более 90*(тоесть в другую сторону) на экране остаётся этот гуи Как мне это исправить? Link to comment
MX_Master Posted February 7, 2011 Share Posted February 7, 2011 ты хоть их выключаешь, если они на экране не видны физически? Link to comment
sir135 Posted February 7, 2011 Author Share Posted February 7, 2011 Да я это уже пытался сделать,даже если поставить событие - дело в том что если обычно поверно камеру то на экране нечего не будет,но если со всей скорости повернуть то вот такой отпечаток остаётся =),я поставил проверку что если гуишки близки к границам экрана то они должны физический удаляться ,но это не помогает Link to comment
lil Toady Posted February 7, 2011 Share Posted February 7, 2011 В getScreenFromWorldPosition задай 4ый параметр на среднюю ширину гуи элемента (это чтобы красивее смотрелось и гуи уходило за экран а не исчезало около краев), и когда эта функция начинает возвращать false а гуи еще видно, скрывай его. Link to comment
MX_Master Posted February 7, 2011 Share Posted February 7, 2011 хотя бы кусочек кода еще бы нужен Link to comment
sir135 Posted February 7, 2011 Author Share Posted February 7, 2011 Напишите пожалуйста пример использования проверки на false функции getScreenFromWorldPosition Link to comment
lil Toady Posted February 7, 2011 Share Posted February 7, 2011 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
MX_Master Posted February 7, 2011 Share Posted February 7, 2011 Напишите пожалуйста пример использования проверки на false функции getScreenFromWorldPosition допустим, твой 2Д элемент экрана имеет размеры 300*300, укажешь 4ым параметром в функции getScreenFromWorldPosition эти 300. Тогда функция может возвращать координаты, расположенные вне видимости экрана, но не дальше чем на 300 пикселей (которые ты указал) от границы экрана. Дальше 300 пикселей за границей экрана функция будет возвращать false. Link to comment
sir135 Posted February 7, 2011 Author Share Posted February 7, 2011 Вот часть кода 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
lil Toady Posted February 7, 2011 Share Posted February 7, 2011 У тебя else не для того if'a Link to comment
sir135 Posted February 7, 2011 Author Share Posted February 7, 2011 это else для if distance Link to comment
lil Toady Posted February 7, 2011 Share Posted February 7, 2011 А если какой-нибудь из предыдущих 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
sir135 Posted February 7, 2011 Author Share Posted February 7, 2011 Lil_Toady Спасибо за помощь но все же этот баг остался при резком перемещении мышки, можно я вам в личку кину весь скрипт? Link to comment
lil Toady Posted February 7, 2011 Share Posted February 7, 2011 Не думаю что тут кто-то украдет для себя.. Но если очень хочется, кидай Link to comment
lil Toady Posted February 7, 2011 Share Posted February 7, 2011 Даже не знаю, попробуй 0 в getScreenFromWorldPosition а не 80.0, будет ли так работать. И нет ли ошибок в debugscript'e? Link to comment
sir135 Posted February 7, 2011 Author Share Posted February 7, 2011 (edited) а у меня ваш вариант уже не багается большое спасибо за помощь Edited February 8, 2011 by Guest Link to comment
sir135 Posted February 7, 2011 Author Share Posted February 7, 2011 и удалите тему плиз Link to comment
sir135 Posted February 8, 2011 Author Share Posted February 8, 2011 Так вот, решил я сделать простенький скрипт, чтоб люди могли подойдя к скамейкам усаживаться на них, но возникла проблема такого плана;- когда применяется анимация то садиться можно только на краюшек скамьи. Ясное дело скажете вы указать новую позицию игроку. Я бы такое уже давно сделал. Только вот проблема никогда не знаешь куда будет повернуты скамейки. отсюда вытекает что нужна какая то формула чтобы можно было вычислить точку перед игроком вне зависимости от поворота игрока. Link to comment
TEDERIs Posted February 8, 2011 Share Posted February 8, 2011 Так вот, решил я сделать простенький скрипт, чтоб люди могли подойдя к скамейкам усаживаться на них, но возникла проблема такого плана;- когда применяется анимация то садиться можно только на краюшек скамьи. Ясное дело скажете вы указать новую позицию игроку. Я бы такое уже давно сделал. Только вот проблема никогда не знаешь куда будет повернуты скамейки. отсюда вытекает что нужна какая то формула чтобы можно было вычислить точку перед игроком вне зависимости от поворота игрока. Не думаю что формула в данном случае послужит панацеей. Фактически у каждого отдельного объекта оси разнятся, соответственно качественно определить необходимое вращение достаточно сложно. Если объектов, требующих взаимодействия много, логично создать таблицу, где для каждой модели указать определенный угол. Функция Attach поможет определить смещение, которое опять таки нужно занести в таблицу. Link to comment
MX_Master Posted February 8, 2011 Share Posted February 8, 2011 А вы в реальности попробуйте сесть на скамейку, не зная где она находится! Вот тут также, откуда сервер или клиент знает, что перед игроком скамейка? Нет такой функции, которая бы дала список ближайших стандартных объектов, и нет такого функции, чтобы из этого списка найти ИД или название объекта, который является скамейкой. Вот если бы скамейки были созданы с помощью МЕ, тогда такой список ближайших объектов можно получить и узнать, возле какой скамейки стоит игрок и, стессна, грамотно усадить его на нее.. Link to comment
Kernell Posted February 8, 2011 Share Posted February 8, 2011 А вы в реальности попробуйте сесть на скамейку, не зная где она находится! Вот тут также, откуда сервер или клиент знает, что перед игроком скамейка? Нет такой функции, которая бы дала список ближайших стандартных объектов, и нет такого функции, чтобы из этого списка найти ИД или название объекта, который является скамейкой. Вот если бы скамейки были созданы с помощью МЕ, тогда такой список ближайших объектов можно получить и узнать, возле какой скамейки стоит игрок и, стессна, грамотно усадить его на нее.. Ну если бы была функция управления стандартными объектами карты.. Кстати не помешало бы такое, например что бы удалить эти светофоры и поставить свои или что бы удалить нафиг всё Link to comment
MX_Master Posted February 8, 2011 Share Posted February 8, 2011 самый простой способ - дать управление положением игрока на скамейке - самому игроку. 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