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

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


***********

Модератор UOPilot
Сообщений: 9.740
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29642
Пользователь №: 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
сообщение 13.2.2025, 0:29
Сообщение #2


***********

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



Цитата
если находит числа то ошибку вываливает.

потому что на вход ожидается текст, а не число. Делайте tonumber позже или используйте tostring.
Цитата
если не находит то вместо "не найдено" пишит фигню какуюто:

разница в кодировках. Писалось не под пилот изначально отсюда проблемы. Возможно какие-то преобразования из https://forum.uokit.com/index.php?showtopic=71536 Системные. Массив sys. помогут, но скорее всего тут нужно ascii -> utf16.

Цитата
p.s. пока не найдено и пишет фигню, в игре минус 20 фпс) от этого кода

увеличить wait. Findstring достаточно много жрет по объективным причинам. Если нет необходимости сверх быстрого регирования - поставьте 1000.


--------------------
Скрипты 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
DarkMaster   Всмысле? Скрипту пофигу, что там лежит в какой па...   7.2.2025, 23:23
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


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

 

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