Баг с улетанием диалога или imgui окна

Double Tap Inside

Известный
Автор темы
Проверенный
1,916
1,256
Версия SA-MP
  1. 0.3.7 (R1)
Баг с улетанием диалога или imgui окна. Когда игра свернута со включенным антиафк и появляется диалог, то он появляется совсем не там где надо.
Как это победить?

sa-mp-196.png
 
Последнее редактирование:
  • Ха-ха
  • Нравится
Реакции: Flonker и HatakeKakashi
Решение
Представляю вашему вниманию более менее костыльный метод для imgui. Может как-то и для обычных диалогов скостылить можно, пока надобности нет. Мне для imgui пока актуальная такая тема.
Поэкспериментировал с windows событиями. разгрёб среди говна, которое флудит при всяких движениях на компе, событие под номерами 6, 28, 134. Хз в чём разница между ними, не углублялся , главное работает. Выбрал 6 - WM_ACTIVATE.
При сворачивании игры в параметрах возвращает 0, при разворачивании сначала даёт хер знает какой-то число, а потом 1.
Объявил булевую переменную gta, которая зависит от статуса окна игры.
Ну и собственно, когда окно сворачивается, gta на false ставится и imgui окно больше не рендерится, разворачиваешь - рендерится.
Я думал также...

Double Tap Inside

Известный
Автор темы
Проверенный
1,916
1,256
Если у тебя так:
Lua:
imgui.SetNextWindowPos(imgui.ImVec2(resX / 2, resY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
Тогда убери resX и resY и замени их на координаты экрана ( или че там )
С имгуи я обошел этот баг через хитровыебаную систему костылей. А вот с диалогами нет. Если решения не будет, то придецца перерисовывать диалог заново после разворота игры. Но блять.
 

Myradov|

Известный
361
106
С имгуи я обошел этот баг. А вот с диалогами нет. Если решения не будет, то придецца перерисовывать диалог заново после разворота игры. Но блять.
Ну насчет диалогов хз, еще никогда не видел фикса данной проблемы
 
  • Нравится
Реакции: Double Tap Inside

Hatiko

Известный
Проверенный
1,512
628
Да встречался с таким багом, именно с диалогом. Обычно когда окно появляется в тот момент, когда игра свёрнута. Если окно было открыто до сворачивания, то такого трабла нет.
Вот с imgui такая херь похуже, тут уже улетает в угла в любом случае, если включено анти-афк и сворачиваешь.
К данному вопросу не приступал, но планирую. Думаю можно заюзать функцию с C++ через ffi либу, которая будет проверять на свёрнутость окна или же попробовать заюзать события windows, если получится.

Вот на счёт диалога может тоже как-то обработать по двух последним упомянутых способах через raknet событие или хук по функции.
 
  • Нравится
Реакции: Double Tap Inside

Double Tap Inside

Известный
Автор темы
Проверенный
1,916
1,256
Да встречался с таким багом, именно с диалогом. Обычно когда окно появляется в тот момент, когда игра свёрнута. Если окно было открыто до сворачивания, то такого трабла нет.
Вот с imgui такая херь похуже, тут уже улетает в угла в любом случае, если включено анти-афк и сворачиваешь.
К данному вопросу не приступал, но планирую. Думаю можно заюзать функцию с C++ через ffi либу, которая будет проверять на свёрнутость окна или же попробовать заюзать события windows, если получится.

Вот на счёт диалога может тоже как-то обработать по двух последним упомянутых способах через raknet событие или хук по функции.
суть как то в том, что самп думает, что когда окно свернуто то оно имеет другое разрешение. Возможно 0х0 или 32х32 не суть. И оно кидает элементы не туда куда надо, так как кидает их по центру. Как я и говорил с имгуи я порешал костылями, но это только для своих скриптов. А надо бы решить это более адекватно, чтобы елементы всегда правильно появлялись исходя из разрешения игры. Отмечу, что мунлодер при свернутой игре выдает правильное разрешение getScreenResolution()
 
  • Нравится
Реакции: HatakeKakashi

Double Tap Inside

Известный
Автор темы
Проверенный
1,916
1,256
Если не секрет, как ты с imgui решил трабл этот, поставил на проверку активности окна игры?


Код проверен, он работает. Возможно ли что то сделать лучше? Скорее всего да, но пока мне светлая мысль в голову не придет - я не мучаю жопу.
/test - команда для теста этой штуки -__-
Lua:
imgui = require "imgui"


imw_menu = imgui.ImBool(false)
pos_menu = nil -- переменная с координатами окна


function imgui.OnDrawFrame()
    local w, h = getScreenResolution()

    if imw_menu.v then
        imgui.SetNextWindowSize(imgui.ImVec2(800, 600), imgui.Cond.Always)
        
        
        ---------------------Позиция окна----------------------------------------
        if pos_menu then -- Если пользователь перемещал уже окно хоть раз
        
            if imgui.IsMouseDown(0) then -- Если левая мышка нажата, то окно можно перетаскивать
                imgui.SetNextWindowPos(imgui.ImVec2(pos_menu.x, pos_menu.y), imgui.Cond.FirstUseEver)
                
            else -- Если не нажата левая мышка, то окно перетаскивать нельзя и никуда оно не улетит.
                imgui.SetNextWindowPos(imgui.ImVec2(pos_menu.x, pos_menu.y), imgui.Cond.Always)
            end
            
        else -- Если пользователь не перемещал окно еще ниразу
            imgui.SetNextWindowPos(imgui.ImVec2(w/2, h/2), imgui.Cond.Always, imgui.ImVec2(0.5, 0.5)) -- ставлю окно по центру (по дефолту, до тех пор пока пользователь не передвинет его, и новые координаты будут записаны в переменную pos_menu)
        end
        
        
        ------------------------------ Окно -------------------------------------
        imgui.Begin("Menu ##imw_menu", imw_menu, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)
        
        
            -- << Тут твой код интерфейса
            
            
            ----------------------- запись позиции окна ------------------------
            if imgui.IsRootWindowOrAnyChildHovered() then   
                if imgui.IsMouseDown(0) then -- Если левая кнопка мышки нажата на окне, то начать записывать новые координаты окна
                    local window_pos = imgui.GetWindowPos()
                    
                    if (not pos_menu) or (pos_menu.x ~= window_pos.x) or (pos_menu.y ~= window_pos.y)  then
                        pos_menu = {x = window_pos.x, y = window_pos.y}
                    end   
                end
            end
        imgui.End()
        
    end
end

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then
        return
    end
    
    while not isSampAvailable() do
        wait(0)
    end
    
    ---
    
    imgui.Process = true -- я так делаю и никогда не выключаю Process, решает кое какие проблемы
    
    sampRegisterChatCommand("test", function() imw_menu.v = not imw_menu.v end)
    
    
    ---
    
    while true do
        wait(0)
        
        if imw_menu.v then
            imgui.ShowCursor = true
            
        else
            imgui.ShowCursor = false
        end
    end
end
 

Вложения

  • test.lua
    2.3 KB · Просмотры: 1
  • Нравится
Реакции: LagoonNR