ImGui

Nagenbl4

Новичок
Автор темы
107
2
Lua:
require "lib.moonloader"
local sampev = require "lib.samp.events"

local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local main_window_state = imgui.ImBool(false)
local text_buffer = imgui.ImBuffer(256)


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    imgui.Process = false

    while true do
        wait(0)
        if main_window_state.v == false then
            imgui.Process = false
        end
    end
end



function sampev.onShowDialog(dialogid, dialogstyle, title, b1, b2, text)
    if dialogid == 14 and dialogstyle == 1 then
        playerId, var = text:match(".+%[(%d+)%]%s+(.+)")
        nickname = sampGetPlayerNickname(playerId)
        main_window_state.v = not main_window_state.v
        imgui.Process = main_window_state.v
    end
end

function imgui.OnDrawFrame()
    if dialogid == 14 and dialogstyle == 1 then
        imgui.Begin(u8"Заголовок")
        if imgui.Button(u8"Передать текст") then
            sampAddChatMessage("Розыск: " .. nickname .. "[" .. playerId .. "]: " .. var, -1)
            imgui.End()
        end
    end
end

При открытии диалога с ID 14 не высвечивается imgui. В чём может быть проблема?
 

Nagenbl4

Новичок
Автор темы
107
2
После того, как диалог был закрыт, окно imgui осталось, как это исправить?

Lua:
function imgui.OnDrawFrame()
    if main_window_state.v then
        imgui.Begin(u8"Заголовок", main_window_state)
        if imgui.Button(u8"Передать текст") then
            sampAddChatMessage("Розыск: " .. nickname .. "[" .. playerId .. "]: " .. var, -1)
        end
        imgui.End()
    end
end
Тем более мне нужно открывать это окно только тогда, когда открыт диалог с ID 14, а не тогда, когда main_window_state = true.
 

Nagenbl4

Новичок
Автор темы
107
2
Кстати не подумал даже, спасибо на счёт sampGetCurrentDialogId() и sampGetCurrentDialogType() .
Тогда у меня 3 вопроса ещё появились:
1) Как сделать так, чтобы imgui окно не могло двигаться, то есть нельзя было бы его перетащить;
2) Как сделать так, если бы диалоговое окно было бы закрыто, то imgui закрывался так же;
3) Как узнать координаты, чтобы грамотно поставить окно imgui в определённой точке экрана.
 

Adventurer

Известный
151
69
1. Добавляешь флаг третьим параметром в imgui.Begin()
imgui.Begin('название', state, FLAGS).
imgui.Begin(u8"Заголовок", main_window_state, imgui.WindowFlags.NoMove)

2. Зачем тебе эта морока? сделай условие на диалог: if main_window_state.v and sampIsDialogActive() then

3. Математика, и только математика. Как пример, центр экрана:
x: (screenWidth - windowWidth)/2
y: (screenHeight - windowHeght)/2

screenWidth, screenHeight = getScreenResolution()
а вместо windowHeight, windowWidth подставляешь высоту и ширину своего окна соответственно
 

Nagenbl4

Новичок
Автор темы
107
2
Ок, да, странно тогда у меня получается, окно imgui открывается ровно через один раз, как открывается диалог с ID 14. То есть диалог с ID 14 открылся, открылось окно imgui, диалог закрылся, закрылось окно, после опять диалог открылся, но уже не открылось окно.
Lua:
function imgui.OnDrawFrame()
    imgui.ShowCursor = false
    if sampGetCurrentDialogId() == 14 and sampGetCurrentDialogType() == 1 and sampIsDialogActive() then
        imgui.SetNextWindowSize(imgui.ImVec2(200, 250), imgui.Cond.FirstUseEver)
        imgui.ShowCursor = true
        imgui.Begin(u8"Заголовок")
        imgui.Text(u8"Какой-то текст:")
        if imgui.Button(u8"Кнопка 1.") then
            sampSendChat("/b [Розыск]: " .. nickname .. "[" .. playerId .. "]: " .. var)
        end
        if imgui.Button(u8"Кнопка 2.") then
            sampSetCurrentDialogEditboxText("Текст 2." .. mynick .. ".")
        end
        if imgui.Button(u8"Кнопка 3.") then
            sampSetCurrentDialogEditboxText("Текст 3.")
        end
        if imgui.Button(u8"Кнопка 4.") then
            sampSetCurrentDialogEditboxText("Текст 4.")
        end
        if imgui.Button(u8"Кнопка 5.") then
            sampSetCurrentDialogEditboxText("Текст 5.")
        end
        imgui.ShowCursor = false
        imgui.End()
    end
    if not sampIsDialogActive() then
        imgui.ShowCursor = false
    end
end
 

MLOKLI

Новичок
10
0
Я ещё тот хацкер, НО зачем проверять какой диалог открыт в функции ImGui? Есть же функция для диалогов, проверяешь, если открыт то переменной true, если закрыт false. А в ImGui проверяешь эту переменную.
(Писал с мобилы, буду с ПК - прочекаю)

UPD
Взял твой первоначальный скрипт. Сам не тестил, попробуй. Если совсем нет - отпиши, проверять буду у себя.

Код:
local main_window_state = imgui.ImBool(false)
function sampev.onShowDialog(dialogid, dialogstyle, title, b1, b2, text)
    if dialogid == 14 and title:find["Название твоего окна (можно частично)"] then
        playerId, var = text:match(".+%[(%d+)%]%s+(.+)")
        nickname = sampGetPlayerNickname(playerId)
        main_window_state.v = not main_window_state.v
        imgui.Process = main_window_state.v
    end
end

function imgui.OnDrawFrame()
    if main_window_state.v then
        imgui.Begin(u8"Заголовок")
        if imgui.Button(u8"Передать текст") then
            sampAddChatMessage("Розыск: " .. nickname .. "[" .. playerId .. "]: " .. var, -1)
            imgui.End()
        end
    end
end
 

Nagenbl4

Новичок
Автор темы
107
2
Я ещё тот хацкер, НО зачем проверять какой диалог открыт в функции ImGui? Есть же функция для диалогов, проверяешь, если открыт то переменной true, если закрыт false. А в ImGui проверяешь эту переменную.
(Писал с мобилы, буду с ПК - прочекаю)

UPD
Взял твой первоначальный скрипт. Сам не тестил, попробуй. Если совсем нет - отпиши, проверять буду у себя.

Код:
local main_window_state = imgui.ImBool(false)
function sampev.onShowDialog(dialogid, dialogstyle, title, b1, b2, text)
    if dialogid == 14 and title:find["Название твоего окна (можно частично)"] then
        playerId, var = text:match(".+%[(%d+)%]%s+(.+)")
        nickname = sampGetPlayerNickname(playerId)
        main_window_state.v = not main_window_state.v
        imgui.Process = main_window_state.v
    end
end

function imgui.OnDrawFrame()
    if main_window_state.v then
        imgui.Begin(u8"Заголовок")
        if imgui.Button(u8"Передать текст") then
            sampAddChatMessage("Розыск: " .. nickname .. "[" .. playerId .. "]: " .. var, -1)
            imgui.End()
        end
    end
end
Прикол в том, что title = нулюl, его чисто нету. :)
Именно по этому через стиль проверку делал.
 

James Hawk

Известный
919
217
Lua:
if dialogid == 14 and dialogstyle == 1 then
        playerId, var = text:match(".+%[(%d+)%]%s+(.+)")
        nickname = sampGetPlayerNickname(playerId)
        main_window_state.v = not main_window_state.v --ошибочно присвоил
        imgui.Process = main_window_state.v
    end
Потому и открывается через раз. Диалог открылся, значение стало true и имгуи показалось, диалог закрылся. Диалог снова открылся, значение уже стало false и имгуи не показывается, диалог закрылся
 
Последнее редактирование:

MLOKLI

Новичок
10
0
Прикол в том, что title = нулюl, его чисто нету. :)
Именно по этому через стиль проверку делал.
Тогда проверку по тексту сделать можно.
Lua:
if dialogid == 14 and dialogstyle == 1 then
        playerId, var = text:match(".+%[(%d+)%]%s+(.+)")
        nickname = sampGetPlayerNickname(playerId)
        main_window_state.v = not main_window_state.v --ошибочно присвоил
        imgui.Process = main_window_state.v
    end
Потому и открывается через раз. Диалог открылся, значение стало true и имгуи показалось, даилог закрылся. Диалог снова открылся, значение уже стало false и имгуи не показывается, диалог закрылся
Кстити да, нужно проверять закрытие диалога :(
Можно просто вынести в осн.функцию если диалога нет - устанавливать фалсе
 
Последнее редактирование: