Здравствуйте, гость ( Вход | Регистрация )

> Hint
DarkMaster
сообщение 29.6.2024, 13:45
Сообщение #1


***********

Модератор UOPilot
Сообщений: 9.742
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29647
Пользователь №: 11.279



Собственно луашный хинт претендующий на некоторую полноценность. На данный момент доведено до состояния "вроде что-то работает". Было бы очень хорошо, если кто-то потестил. Сам я хинтом практически никогда не пользуюсь так, что тестить мне его в реальных условиях сложновато, но люди время от времени просят.
Использование:
Код
local hint = require[[hint]]
hint_obj = hint(ваш_конфиг) -- вывести сообщение. Описание cfg{} ниже. Вернет hint_obj.
hint_obj = hint.hide()      -- скрыть сообщение. Вернет hint_obj.
hint.destroy()              -- уничтожить поток с сообщением.
Окно можно таскать мышкой, повторые вызовы будут в тех же координатах, куда вы поместили окно. При нажатии правой кнопкой мыши - позиция будет восстановлена.

cfg - таблица с параметрами окна, сообщения. Все параметры являются опциональными, если они не будут указаны, то будут загружены значения по умолчанию.
cfg.text = "0a123456789abcT" -- текст сообщения
cfg.font = "Arial"           -- название шрифта который будет использован.
cfg.font_size = 36           -- размер шрифта
cfg.font_color = 0xcc6020    -- цвет шрифта
cfg.font_alpha = 255         -- прозрачность шрифта
cfg.bold = 700               -- насколько жирным делать шрифт. Стандартно 100-900 с шагом 100.
cfg.anchor = "bottom_left"   -- якорь от которого считать pox_x, pos_y. Размер окна может быть разным из-за разного текста, и если мы хотим, например,
видеть окно в правом нижнем углу, то мы можем задать, что окно должно "заканчиваться" в этих координатах, а не начинаться. top_left/top_right/bottom_left/bottom_right.
cfg.align_h = "right"        -- выравнить текст по горизонтали. left/right/center
cfg.align_v = "center"       -- выровнить текст по вертикали. top/bottom/center
cfg.pos_x = 300              -- позиция на экране x
cfg.pos_y = 300              -- позиция на экране y
cfg.width = 0                -- ширина. 0 - подгонит под размер текста
cfg.height = 50              -- высота. 0 - подгонит под размер текста
cfg.border_h = 0.15          -- размер горизонтального поля. При >-1 и <1 создаст поле пропорционально шрифту. При значениях больше - поле в пикселях
cfg.border_v = -5            -- размер вертикального поля. При >-1 и <1 создаст поле пропорционально шрифту. При значениях больше - поле в пикселях
cfg.bg_color = 0x40A65C      -- цвет фона
cfg.bg_alpha = 220           -- прозрачность фона
cfg.sticky = 20              -- Расстояние на котором прилеплять окно к краю экрана при перемещении мышкой.
cfg.timeout = 1000           -- время жизни окна в мс (1000 = 1 сек).

hint поддерживает вывод нескольких сообщений одновременно. Для дальнейшего понимания его работы необходимо немного углубиться в его структуру:
hint - это массив с объектами которые выводят сообщения. Каждый объект является независимым от других и запущен в отдельном потоке.
Каждый из этих объектов имеет методы: hint(), hide(), destroy().
По умолчанию во время запуска созадется объект default и добавляет несколько ссылок для упрощенного вызова.
hint()         - это hint.default() -> hint.default.hint()
hint.default() - это hint.default.hint()
hint.hide()    - это hint.default.hide()
hint.destroy() - это hint.default.destroy()
local hint_obj = hint.default.hint()
hint_obj       - это hint.default
-- соответственно вызов:
local hint_obj = hint.name()
-- создаст:
hint_obj           = hint.name
hint_obj()         = hint.name()
hint_obj.hint()    = hint.name.hint()
hint_obj.hide()    = hint.name.hide()
hint_obj.destroy() = hint.name.destroy()

Для вызова еще одного окна одновременно достаточно вызвать:
local second_hint = hint.name(ваш_конфиг)
Вместо "name" укажите любое незанятое имя (default, hide, destroy заняты сразу после старта).

Из известных проблем:
1) При повторном вызове хинта может быть на мгновение отображено прошлое состояние. Почему - не знаю. Я сначала перерисовываю окно, потом делаю hint, но оно все равно на один фрейм шансово показывает старое изображение.
2) При повторных вызовах на один первый фрейм может исчезнуть текст.
3) Бэкраунд и текст являются двумя разными окнами. Устанавливать прозрачность фона отдельно от прозрачности текста при использовании одного окна не получилось.
4) Не работает стандартный флаг вертикального выравнивания текста. Написан костыль реализующий этот функционал.
5) Окно хинта стартует в подвисшем состоянии (часики при наведении). Отмирает если навести на него мышку, убрать. Причины данного поведения мне не ясны. Фикшу путем вызова user32.SendMessageA(window, WM_SETCURSOR , 0, 0).
6) Если тащите окно и в это время был повторный вызов - окно переместится.
7) cdef содержит кучу мусора. При релизе почищу.
По факту это мой первый хоть сколько-то объемный код с использование winapi и работой с окнами в частности. Я не сомневаюсь, что там куча кривых моментов. С удовольствием выслушаю, как надо было.

пример вызова
Код

--lua
local hint = require[[hint]]

    hint()
    wait(300)

    cfg = {}
    cfg.font_size  = 72
    cfg.border_h   = 0.15
    cfg.border_v   = -5
    cfg.text       = "ZZZZZZZZZZZZZZ"
    cfg.pos_x      = 600
    cfg.pos_y      = 600
    cfg.width      = 0
    cfg.height     = 0
    cfg.bg_color   = 0x990099 --math.random(0xffffff)
    cfg.bg_alpha   = 100
    cfg.bold       = 700
    cfg.font       = "Courier New"--"Courier New"
    cfg.font_color = 0x999999 --math.random(0xffffff)
    cfg.font_alpha = 170
    cfg.align_h    = "center"
    cfg.align_v    = "center"
    cfg.sticky     = 20
    cfg.anchor     = "bottom_left"
    cfg.timeout    = 5000
    print"hint call"
    local second = hint.second(cfg)
    print("second", second)
    wait(300)
    second.hide()
    second.destroy()
    wait(300)
    print("second second call", second)
    second = hint.second(cfg)
    wait(300)
    print("second second hide", second)
    second.hide()
    --C.Sleep(1000)



    cfg = {}
    cfg.font_size  = 72
    cfg.border_h   = 0.15
    cfg.border_v   = -5
    cfg.text       = "AAAAAAAAAAAAAA"
    cfg.pos_x      = 300
    cfg.pos_y      = 300
    cfg.width      = 0
    cfg.height     = 0
    cfg.bg_color   = 0x000099 --math.random(0xffffff)
    cfg.bg_alpha   = 30
    cfg.bold       = 700
    cfg.font       = "Courier New"--"Courier New"
    cfg.font_color = 0x009900 --math.random(0xffffff)
    cfg.font_alpha = 170
    cfg.align_h    = "center"
    cfg.align_v    = "center"
    cfg.sticky     = 20
    cfg.anchor     = "bottom_left"
    cfg.timeout    = 2000
print"hint.y"
    hint.y(cfg)

    C.Sleep(20000)


Сообщение отредактировал DarkMaster - 27.10.2024, 3:19


Прикрепленные файлы
Прикрепленный файл  hint_0.9.3.zip ( 13,79 килобайт ) Кол-во скачиваний: 96


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
DarkMaster
сообщение 7.2.2025, 23:23
Сообщение #2


***********

Модератор UOPilot
Сообщений: 9.742
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29647
Пользователь №: 11.279



Цитата
P.S. перестают запускаться остальные скрипты при копировании hint.lua в папку пилота.

Всмысле? Скрипту пофигу, что там лежит в какой папке, если вы не вызываете явным образом работу с этим файлом через require/io.open/dofile и т.д.
Цитата
Также пилот вылетает.

Когда? При каких обстоятельствах? От кнопки стоп - он будет вылетать, там проблемы внутри самого пилота.
Цитата
Это что в каждом скрипте надо добавлять это?

Заголовки которые я привл - да. Шапку и одну строку в конце скрипта.
Цитата
Работает. Но хотелось бы человеческую строку вызова хинта)

Я бы очень поспорил по поводу человечности вызова особенно учитывая количество параметров для конфигурации. Специально для вас:
Код

local my_hint = function(text, size, pos_x, pos_y, width, height)
    local cfg = {}
    cfg.text = text                -- текст сообщения
    cfg.font_size = size           -- размер шрифта
    cfg.pos_x = pos_x              -- позиция на экране x
    cfg.pos_y = pos_y              -- позиция на экране y
    cfg.width = width              -- ширина. 0 - подгонит под размер текста
    cfg.height = height            -- высота. 0 - подгонит под размер текста
    hint(cfg)
end


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме
DarkMaster   Hint   29.6.2024, 13:45
Cockney   При всем уважении к труду - все это можно описать ...   5.7.2024, 22:55
DarkMaster   на данный момент есть переписанные функции работы...   6.7.2024, 16:34
Cockney   Вот в этом то и загвоздка - попытка тянуть в одног...   6.7.2024, 17:26
DarkMaster   Насколько помню он уже им не паковался достаточно...   6.7.2024, 17:34
фонарик   Скачал файлик hint.lua (56.1 кб), положил его в па...   21.7.2024, 0:59
DarkMaster   Прикольно... Писал не в пилоте - там таких проблем...   21.7.2024, 3:39
DarkMaster   Пробуй. Часть структур была объявлена внутри пилот...   21.7.2024, 7:22
DarkMaster   0.9.3 версия Было много чего подчищено и переработ...   27.10.2024, 3:17
dron4938   А простой пример вызова можно увидеть? Типа такого...   3.2.2025, 1:51
DarkMaster   hint("Вася") local msg_cfg = {} msg_cf...   3.2.2025, 1:57
dron4938   https://i.imgur.com/ZyDN9h6.png   3.2.2025, 2:08
DarkMaster   поправил пример   3.2.2025, 11:43
dron4938   Просто закрывается пилот при запуске   3.2.2025, 13:07
DarkMaster   вы строки поместили для совместимости с пилотом?   3.2.2025, 15:05
dron4938   Решил заново всё скачать и тут такое дело: https:/...   3.2.2025, 18:11
DarkMaster   вы че прикалываетесь? внутри текстовый файл https...   5.2.2025, 4:55
DarkMaster   что за браузер? кому не лень скачайте, интересно ...   7.2.2025, 4:25
Madeus   Фаерфокс качает без проблем.   7.2.2025, 5:20
dron4938   Еще раз пробнул всё норм скачалось, хрен знает что...   7.2.2025, 15:16
DarkMaster   полный код дайте, как именно запускаете.   7.2.2025, 16:29
dron4938   --lua --stop_script () local hint = requir...   7.2.2025, 18:11
DarkMaster   Вы сделали 2 ошибки: 1) Hint выполняется асинхронн...   7.2.2025, 21:22
dron4938   Работает. Но хотелось бы человеческую строку вызов...   7.2.2025, 21:45
dron4938   --lua imageToString = require("luaPlugins...   11.2.2025, 16:20
DarkMaster   --lua imageToString = require("luaPlugins...   12.2.2025, 5:20
dron4938   https://i.imgur.com/LiQPWt4.png если находит числ...   12.2.2025, 16:57
DarkMaster   потому что на вход ожидается текст, а не число. Д...   13.2.2025, 0:29


Ответить в эту темуОткрыть новую тему
5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 6.7.2025, 4:53
Designed by Nickostyle