AMARANT Posted September 8, 2011 Share Posted September 8, 2011 Не знал как назвать тему, простите... Я давно хотел сделать для некоторых моих GUI-менюшек на сервере следующее: при наводке курсором на ГУИ-элемент (например image) чтобы над курсором выбивалась текстовая надпись с нужным мне текстом и следовала бы за курсором до тех пор, пока он на этом элементе (image). Я даже не знаю как объяснить, но думаю что это какя-то мелочь, потому как где-то это видел, только вот не помню точно где. В общем, может рисунок поможет понять о чем я Link to comment
Kernell Posted September 9, 2011 Share Posted September 9, 2011 Можно в OnClientRender обрабатывать позицию курсора, и когда он в пределах кнопки (сверять координаты), то отрисовываешь dx текст по координатам курсора. Link to comment
lil Toady Posted September 9, 2011 Share Posted September 9, 2011 Можно в OnClientRender обрабатывать позицию курсора, и когда он в пределах кнопки (сверять координаты), то отрисовываешь dx текст по координатам курсора. Это трудный путь, а вот легкий: OnClientMouseEnter и OnClientMouseLeave P.S. это называют tooltip Link to comment
MX_Master Posted September 9, 2011 Share Posted September 9, 2011 И такой ресурс даже есть в стандартных ресурсах, просто посмотреть как с ним работать. Link to comment
Kernell Posted September 9, 2011 Share Posted September 9, 2011 Можно в OnClientRender обрабатывать позицию курсора, и когда он в пределах кнопки (сверять координаты), то отрисовываешь dx текст по координатам курсора. Это трудный путь, а вот легкий: OnClientMouseEnter и OnClientMouseLeave P.S. это называют tooltip Я об этих событиях думал, но автору нужно чтобы текст следовал за курсором, поэтому на мой взгляд, проще уже будет через рендер. чтобы над курсором выбивалась текстовая надпись с нужным мне текстом и следовала бы за курсором до тех пор, пока он на этом элементе (image). OnClientMouseEnter, OnClientMouseLeave - вроде как вызываются один раз когда курсор попал/вышел из фокуса элемента? Как вариант ешё OnClientMouseMove - закрепить событие на нужный элемент (Но надпись будет только когда курсор двигается). Link to comment
StUNt71 Posted September 9, 2011 Share Posted September 9, 2011 Можно в OnClientRender обрабатывать позицию курсора, и когда он в пределах кнопки (сверять координаты), то отрисовываешь dx текст по координатам курсора. Это трудный путь, а вот легкий: OnClientMouseEnter и OnClientMouseLeave P.S. это называют tooltip Я об этих событиях думал, но автору нужно чтобы текст следовал за курсором, поэтому на мой взгляд, проще уже будет через рендер. чтобы над курсором выбивалась текстовая надпись с нужным мне текстом и следовала бы за курсором до тех пор, пока он на этом элементе (image). OnClientMouseEnter, OnClientMouseLeave - вроде как вызываются один раз когда курсор попал/вышел из фокуса элемента? Как вариант ешё OnClientMouseMove - закрепить событие на нужный элемент (Но надпись будет только когда курсор двигается). + к этоме guiCreateLabel, guiSetPosition. Link to comment
AMARANT Posted September 9, 2011 Author Share Posted September 9, 2011 Как бы с событиями понял, но не могу отрисовать текст функцией dxDrawText с событием onCientRender. Дело в том что непонятно как там прописать в аргументах координаты курсора. Ведь у getCursorPosition() пять аргументов float, а у функции dxDrawText для координат только я как понял четыре параметра int left, int top, int right=left, int bottom=top. Поэтому не получается ничего пока. Link to comment
StUNt71 Posted September 9, 2011 Share Posted September 9, 2011 Читал значения возвращаемых аргументов, нет? Видимо нет, почитай. И почитай мой пост который выше. Link to comment
MX_Master Posted September 9, 2011 Share Posted September 9, 2011 Мы, наверное, недостаточно убедили (: есть стандартный ресурс, называется tooltip. Весь функционал там уже создан. В нем есть экспорт функции для создания/изменения DX подсказок, которые можно юзать из других ресурсов. Надеюсь, вы умеете юзать экспорт функции из других ресурсов, если нет, то покажем. Link to comment
StUNt71 Posted September 9, 2011 Share Posted September 9, 2011 Кароче вот тебе готовый код local gui_s = {image = nil, label = nil} addEventHandler("onClientResourceStart", getResourceRootElement(), function (resource) gui_s.image = guiCreateStaticImage(Коор. X, Коор. Y, Ширина, Высота, "Путь", false, nil) gui_s.label = guiCreateLabel(0.0, 0.0, Ширина, Высота, "Текст", false, nil) addEventHandler("onClientMouseMove", gui_s.image, s_onClientMouseMove, false) showCursor(true) end ) function s_onClientMouseMove(x, y) guiSetPosition(gui_s.label, x, y, false) end Вроде правильно, не тестил, писал в браузере. В теории должно работать, если не перепутал названия событий и функций. Link to comment
Kernell Posted September 9, 2011 Share Posted September 9, 2011 + к этоме guiCreateLabel, guiSetPosition. Нет, я уже выше написал про dxDrawText. Это более аргономичное решение. Мы, наверное, недостаточно убедили (: есть стандартный ресурс, называется tooltip. Весь функционал там уже создан. В нем есть экспорт функции для создания/изменения DX подсказок, которые можно юзать из других ресурсов. Надеюсь, вы умеете юзать экспорт функции из других ресурсов, если нет, то покажем. Разве текст будет бегать за курсором в нужной области? Помоему он там просто появится в одной точке и изчезнет через некоторое время. Link to comment
Evgeni_Degerev Posted September 9, 2011 Share Posted September 9, 2011 local descinfo={} descinfo.lbl = guiCreateLabel(0.0, 0.0,200,40, "Текст", false, nil) addEventHandler("onClientMouseEnter",getRootElement(),function(x, y) if(descinfo[source]) then guiSetPosition(descinfo.lbl, x, y, false) guiSetText(descinfo.lbl,descinfo[source]) guiBringToFront(descinfo.lbl) descinfo.current=source else guiSetText(descinfo.lbl,"") end end) addEventHandler("onClientMouseLeave", getRootElement(), function() if(source==descinfo.current) then descinfo.current=nil guiSetText(descinfo.lbl,"") end end) addEventHandler("onClientMouseMove",getRootElement(),function(x,y) if(descinfo.current==source) then guiSetPosition(descinfo.lbl,x,y,false) end end) function setDescription(elem,desc) assert(elem) descinfo[elem]=desc end -- хак, по желанию descinfo.showcursor=showCursor showCursor=function(show) showCursor(show) if(not show) guiSetText(descinfo.lbl,"") end end setDescription(guiCreateButton( 0.7, 0.1, 0.2, 0.1, "Test!", true )," Не нажимать! бесполезно!") мой вариант, проверен через runcode Link to comment
AMARANT Posted September 9, 2011 Author Share Posted September 9, 2011 Читал значения возвращаемых аргументов, нет?Видимо нет, почитай. Ага уже прочитал: "Returns 5 values: cursorX, cursorY, worldX, worldY, worldZ. The first two values are the 2D relative screen coordinates of the cursor: cursorX goes from 0 (left side of the screen) to 1 (right side), cursorY goes from 0 (top) to 1 (bottom). The 3 values that follow are the 3D world map coordinates that the cursor points at. If the cursor isn't showing, returns false as the first value." - думал что первые две - это абсолютные коорды, а они относительные, т.е. не подходят, поэтому отловил самим событием onClientMouseMove. Разве текст будет бегать за курсором в нужной области? Помоему он там просто появится в одной точке и изчезнет через некоторое время. Не бегает зараза, он просто появляется и исчезает когда мышкой двигаешь по элементу. А надо чтоб всегда был пока ты навел курсором на этот элемент. Нет, я уже выше написал про dxDrawText. Это более аргономичное решение. Им и делаю, но отрисовка не дает возможности всегда быть надписи, пока курсор наведен на мою кнопку. Вот мой код если что: addEventHandler( "onClientMouseMove", getRootElement(), function(aX, aY) if (source == MyButton[1]) then dxDrawText ( "Button", aX, aY-25 , 0, 0, tocolor ( 255, 0, 0, 255 ), 1, "pricedown", "left", "top", false, false, true ) end end ) Link to comment
Kernell Posted September 10, 2011 Share Posted September 10, 2011 Вообщем самый простой и самый правильный на мой взгляд вариант решения: local scrX, scrY = guiGetScreenSize(); // ButtonX реальная (не относительная) позиция кнопки X // ButtonY реальная (не относительная) позиция кнопки Y // SizeX ширина кнопки // SizeY высота кнопки function draw() local x, y = getCursorPosition" class="kw4">getCursorPosition(); // возвращает relative if x and y then x, y = scrX * x, scrY * y; // из relative в absolute if x >= ButtonX and x <= ButtonX + SizeX and y >= ButtonY and y <= ButtonY + SizeY then dxDrawText( 'Example', x, y ); end end end addEventHandler( 'onClientRender', root, draw ); P.S. Это примерный код. Link to comment
AMARANT Posted September 10, 2011 Author Share Posted September 10, 2011 Kernell, к сожалению, твой код вообще не работает и по-моему из-за этой строки: local x, y = getCursorPosition" class="kw4">getCursorPosition(); // возвращает relative Вообще не пойму тут синтаксиса. Link to comment
DakiLLa Posted September 10, 2011 Share Posted September 10, 2011 local x, y = getCursorPosition(); -- возвращает relative getCursorPosition неправильно отображается в [/lua] теге. Link to comment
MX_Master Posted September 10, 2011 Share Posted September 10, 2011 Мы, наверное, недостаточно убедили (: есть стандартный ресурс, называется tooltip. Весь функционал там уже создан. В нем есть экспорт функции для создания/изменения DX подсказок, которые можно юзать из других ресурсов. Надеюсь, вы умеете юзать экспорт функции из других ресурсов, если нет, то покажем. Разве текст будет бегать за курсором в нужной области? Помоему он там просто появится в одной точке и изчезнет через некоторое время. Там есть экспорт функция для изменения позиции подсказки. Вот ее и нужно менять согласно позиции курсора в любом onRender событии. Это легче чем снова изобретать этот же ресурс. Я думаю, пока код готовый не показать, все так и будут придумывать заново этот готовый ресурс.. Link to comment
StUNt71 Posted September 10, 2011 Share Posted September 10, 2011 А мой вариант не катит, да? Если есть gui зачем делать в dx? Не понимаю. Link to comment
MX_Master Posted September 10, 2011 Share Posted September 10, 2011 dx это простое рисование на экране, а gui это система элементов Link to comment
StUNt71 Posted September 10, 2011 Share Posted September 10, 2011 local gui_s = {image = nil, pos_x = 0.0, pos_y = 0.0} addEventHandler("onClientResourceStart", getResourceRootElement(), function (resource) gui_s.image = guiCreateStaticImage(Коор. X, Коор. Y, Ширина, Высота, "Путь", false, nil) addEventHandler("onClientMouseMove", gui_s.image, s_onClientMouseMove, false) showCursor(true) end ) addEventHandler("onClientRender", getRootElement(), function() dxDrawText("TEXT", gui_s.pos_x, gui_s.pos_y, gui_s.pos_x, gui_s.pos_y, tocolor(255, 255, 255, 255), 1.0, "default-bold", "center", "center", false, false, true) end ) function s_onClientMouseMove(x, y) gui_s.pos_x = x gui_s.pos_y = y end Link to comment
Kernell Posted September 10, 2011 Share Posted September 10, 2011 Kernell, к сожалению, твой код вообще не работает и по-моему из-за этой строки:local x, y = getCursorPosition" class="kw4">getCursorPosition(); // возвращает relative Вообще не пойму тут синтаксиса. Это баг тега lua. Наверное не сложно догадаться что там. 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