Пропадает строка сразу после появления

Ninthmoon

Известный
Автор темы
462
126
Версия MoonLoader
.026-beta
Строка показывающая как изменилось количество денег пропадает сразу после появления, как вывести строку на время, например на 1 секунду?
Одиночная игра
Lua:
local imgui = require "imgui"
local main_window_state = imgui.ImBool(true)
local oldMoneyAmount = 0

function main()
    while true do wait(0)
        imgui.Process = main_window_state.v
    end
end

function imgui.OnDrawFrame()
    if main_window_state.v then
        imgui.SetNextWindowSize(imgui.ImVec2(150, 50), imgui.Cond.FirstUseEver)
        imgui.Begin("Window", main_window_state)
        showMoneyDifference()
        imgui.ShowCursor = false
        imgui.End()
    end
end

function showMoneyDifference()
    moneyAmount = getPlayerMoney(PLAYER_HANDLE)
    if oldMoneyAmount ~= moneyAmount then
        if oldMoneyAmount < moneyAmount then
            imgui.Text(string.format("+%s", moneyAmount - oldMoneyAmount))
            elseif oldMoneyAmount > moneyAmount then
            imgui.Text(string.format("-%s", oldMoneyAmount - moneyAmount))
        end
        oldMoneyAmount = moneyAmount
    end
end
 
Решение
спасибо всем кто ответил здесь, у меня получилось достигнуть своей цели
Lua:
local imgui = require "imgui"
local main_window_state = imgui.ImBool(true)
local oldMoneyAmount = 0
local moneyAmount = 0
local string_money = ""
local show_money_change = false
local timeOver = 0

function main()
    while true do wait(0)
        if show_money_change == false then
            oldMoneyAmount = moneyAmount
            moneyAmount = getPlayerMoney(PLAYER_HANDLE)
            if oldMoneyAmount ~= moneyAmount then
                if oldMoneyAmount < moneyAmount then
                    string_money = string.format("+%s", moneyAmount - oldMoneyAmount)
                    show_money_change = true
                    timeOver = os.clock() + 3...

Yuriy Code

Известный
755
926
Создай переменную, в которой будет значение 0.
Когда деньги прибавляются, делай ей значение 20, например.
В imgui.OnDrawFrame() проверяй, чтобы переменная не была равна 0.
Если она не равна 0, то показывается текст, который тебе нужен.

А вот в бесконечном цикле отнимай от неё 1, пока она не 0.
 

Ninthmoon

Известный
Автор темы
462
126
Создай переменную, в которой будет значение 0.
Когда деньги прибавляются, делай ей значение 20, например.
В imgui.OnDrawFrame() проверяй, чтобы переменная не была равна 0.
Если она не равна 0, то показывается текст, который тебе нужен.

А вот в бесконечном цикле отнимай от неё 1, пока она не 0.
попробовал, не совсем понял как это должно выглядеть, не работает
честно говоря я думал реализовать это с помощью таймера, но не получалось
Lua:
local imgui = require "imgui"
local main_window_state = imgui.ImBool(true)
local oldMoneyAmount = 0
local moneyAmount = 0
local miniTimer = 0

function main()
    while true do wait(0)
        imgui.Process = main_window_state.v
    end
end

function imgui.OnDrawFrame()
    if main_window_state.v then
        imgui.SetNextWindowSize(imgui.ImVec2(150, 50), imgui.Cond.FirstUseEver)
        imgui.Begin("Window", main_window_state)
        showMoneyDifference()
        while miniTimer ~= 0 do
            if oldMoneyAmount < moneyAmount then
            imgui.Text(string.format("+%s", moneyAmount - oldMoneyAmount))
            elseif oldMoneyAmount > moneyAmount then
            imgui.Text(string.format("-%s", oldMoneyAmount - moneyAmount))
            end
            miniTimer = miniTimer - 1
        end
        oldMoneyAmount = moneyAmount
        imgui.ShowCursor = false
        imgui.End()
    end
end

function showMoneyDifference()
    moneyAmount = getPlayerMoney(PLAYER_HANDLE)
    if oldMoneyAmount ~= moneyAmount then
        miniTimer = 1000
    end
end
 

Yuriy Code

Известный
755
926
Lua:
local string_money = "", show_money_change = false, count = 0
function imgui.OnDrawFrame()
    if main_window_state.v then
        imgui.SetNextWindowSize(imgui.ImVec2(150, 50), imgui.Cond.FirstUseEver)
        imgui.Begin("Window", main_window_state)
        showMoneyDifference()

            if oldMoneyAmount < moneyAmount then
                string_money = string.format("+%s", moneyAmount - oldMoneyAmount)
                show_money_change = true
                count = 20
            elseif oldMoneyAmount > moneyAmount then
                string_money = string.format("-%s", oldMoneyAmount - moneyAmount)
                show_money_change = true
                count = 20
            end

            if show_money_change then
                 imgui.Text(string_money)
            end
           
        if count > 0 then
            count = count - 1
            if count <= 0 then
                 count = 0
                 show_money_change = false
            end
        end

        oldMoneyAmount = moneyAmount
        imgui.ShowCursor = false
        imgui.End()
    end
end
 

zTechnology

Известный
1,101
485
Строка показывающая как изменилось количество денег пропадает сразу после появления, как вывести строку на время, например на 1 секунду?
Одиночная игра
Lua:
local imgui = require "imgui"
local main_window_state = imgui.ImBool(true)
local oldMoneyAmount = 0

function main()
    while true do wait(0)
        imgui.Process = main_window_state.v
    end
end

function imgui.OnDrawFrame()
    if main_window_state.v then
        imgui.SetNextWindowSize(imgui.ImVec2(150, 50), imgui.Cond.FirstUseEver)
        imgui.Begin("Window", main_window_state)
        showMoneyDifference()
        imgui.ShowCursor = false
        imgui.End()
    end
end

function showMoneyDifference()
    moneyAmount = getPlayerMoney(PLAYER_HANDLE)
    if oldMoneyAmount ~= moneyAmount then
        if oldMoneyAmount < moneyAmount then
            imgui.Text(string.format("+%s", moneyAmount - oldMoneyAmount))
            elseif oldMoneyAmount > moneyAmount then
            imgui.Text(string.format("-%s", oldMoneyAmount - moneyAmount))
        end
        oldMoneyAmount = moneyAmount
    end
end
Lua:
local imgui = require "imgui"
local main_window_state = imgui.ImBool(true)
local oldMoneyAmount = 0

function main()
    while true do wait(0)
        imgui.Process = main_window_state.v
    end
end

function imgui.OnDrawFrame()
    if main_window_state.v then
        imgui.SetNextWindowSize(imgui.ImVec2(150, 50), imgui.Cond.FirstUseEver)
        imgui.Begin("Window", main_window_state)
        showMoneyDifference()
        imgui.ShowCursor = false
        imgui.End()
    end
end

function showMoneyDifference()
    local moneyAmount = 0
    if moneyAmount == 0 then
        moneyAmount = getPlayerMoney(PLAYER_HANDLE)
    end
    if oldMoneyAmount ~= moneyAmount then
        if oldMoneyAmount < moneyAmount then
            imgui.Text(string.format("+%s", moneyAmount - oldMoneyAmount))
            elseif oldMoneyAmount > moneyAmount then
            imgui.Text(string.format("-%s", oldMoneyAmount - moneyAmount))
        end
        oldMoneyAmount = moneyAmount
    end
end

Ты постоянно ставишь значение у moneyAmount и из-за этого и слетает оно
 

Ninthmoon

Известный
Автор темы
462
126
Lua:
local string_money = "", show_money_change = false, count = 0
function imgui.OnDrawFrame()
    if main_window_state.v then
        imgui.SetNextWindowSize(imgui.ImVec2(150, 50), imgui.Cond.FirstUseEver)
        imgui.Begin("Window", main_window_state)
        showMoneyDifference()

            if oldMoneyAmount < moneyAmount then
                string_money = string.format("+%s", moneyAmount - oldMoneyAmount)
                show_money_change = true
                count = 20
            elseif oldMoneyAmount > moneyAmount then
                string_money = string.format("-%s", oldMoneyAmount - moneyAmount)
                show_money_change = true
                count = 20
            end

            if show_money_change then
                 imgui.Text(string_money)
            end
    
        if count > 0 then
            count = count - 1
            if count <= 0 then
                 count = 0
                 show_money_change = false
            end
        end

        oldMoneyAmount = moneyAmount
        imgui.ShowCursor = false
        imgui.End()
    end
end
теперь индикатор всегда показывает одно и то же количество, даже когда оно изменилось

Lua:
local imgui = require "imgui"
local main_window_state = imgui.ImBool(true)
local oldMoneyAmount = 0
local moneyAmount = 0
local string_money = ""
local show_money_change = false
local count = 0

function main()
    while true do wait(0)
        imgui.Process = main_window_state.v
    end
end

function imgui.OnDrawFrame()
    if main_window_state.v then
        imgui.SetNextWindowSize(imgui.ImVec2(150, 50), imgui.Cond.FirstUseEver)
        imgui.Begin("Window", main_window_state)
        if show_money_change == false then --если разница денег не показываеться
            oldMoneyAmount = moneyAmount --старое количество обновляется
            moneyAmount = getPlayerMoney(PLAYER_HANDLE) --текущее количество обновляется
        end
        if oldMoneyAmount ~= moneyAmount then --если старое количество не равно текущему
            if oldMoneyAmount < moneyAmount then --если старое количество меньше
                string_money = string.format("+%s", moneyAmount - oldMoneyAmount) --считаем разницу, формируем строку
                show_money_change = true --разница денег будет показываться
                count = 5 --счётчик равен 5
            end
            if oldMoneyAmount > moneyAmount then --если старое количество больше
                string_money = string.format("-%s", oldMoneyAmount - moneyAmount)--считаем разницу, формируем строку
                show_money_change = true --разница денег будет показываться
                count = 5 --счётчик равен 5
            end
            if show_money_change then --если разница денег должна показываться
                imgui.Text(string_money) -- показываем строку с разницей
            end
        end
        if count > 0 then -- если счётчик больше 0
            count = count - 1 -- отнимаем от него 1
            if count <= 0 then -- если счётчик меньше либо равен 0
                count = 0 -- счётчик равен 0 (зачем? если он и так 0)
                show_money_change = false -- разница денег больше не показываеться
            end
        end
        imgui.ShowCursor = false
        imgui.End()
    end
end

Ты постоянно ставишь значение у moneyAmount и из-за этого и слетает оно
учтено

проблема с тем что показывает одно и то же решена, проблема с тем что строка всё равно сразу пропадает вернулась)
ставить число для счётчика больше не имеет смысла, даже от 1000000 отнимая по одному это займёт 0,01 секунду, а игре такие большие значения просто не нравятся и она вылетает или зависает на момент подсчёта
выход из положения я вижу только один - использовать ВРЕМЯ, но я не знаю как его использовать в этом вашем луа

Lua:
local imgui = require "imgui"
local main_window_state = imgui.ImBool(true)
local oldMoneyAmount = 0
local moneyAmount = 0
local string_money = ""
local show_money_change = false
local count = 0

function main()
    while true do wait(0)
        imgui.Process = main_window_state.v
    end
end

function imgui.OnDrawFrame()
    if main_window_state.v then
        imgui.SetNextWindowSize(imgui.ImVec2(150, 50), imgui.Cond.FirstUseEver)
        imgui.Begin("Window", main_window_state)
        if show_money_change == false then --если разница денег не показываеться
            oldMoneyAmount = moneyAmount --старое количество обновляется
            moneyAmount = getPlayerMoney(PLAYER_HANDLE) --текущее количество обновляется
            if oldMoneyAmount ~= moneyAmount then --если старое количество не равно текущему
            if oldMoneyAmount < moneyAmount then --если старое количество меньше
                string_money = string.format("+%s", moneyAmount - oldMoneyAmount) --считаем разницу, формируем строку
                show_money_change = true --разница денег будет показываться
                count = 100 --счётчик равен 100
            end
            if oldMoneyAmount > moneyAmount then --если старое количество больше
                string_money = string.format("-%s", oldMoneyAmount - moneyAmount)--считаем разницу, формируем строку
                show_money_change = true --разница денег будет показываться
                count = 100 --счётчик равен 100
            end
            if show_money_change then --если разница денег должна показываться
                imgui.Text(string_money) -- показываем строку с разницей
            end
        end
        if count > 0 then -- если счётчик больше 0
            count = count - 1 -- отнимаем от него 1
            if count == 0 then -- если счётчик равен 0
                show_money_change = false -- разница денег больше не показываеться
            end
        end
        end
        imgui.ShowCursor = false
        imgui.End()
    end
end
 
Последнее редактирование:

Royan_Millans

Известный
145
182
теперь индикатор всегда показывает одно и то же количество, даже когда оно изменилось

Lua:
local imgui = require "imgui"
local main_window_state = imgui.ImBool(true)
local oldMoneyAmount = 0
local moneyAmount = 0
local string_money = ""
local show_money_change = false
local count = 0

function main()
    while true do wait(0)
        imgui.Process = main_window_state.v
    end
end

function imgui.OnDrawFrame()
    if main_window_state.v then
        imgui.SetNextWindowSize(imgui.ImVec2(150, 50), imgui.Cond.FirstUseEver)
        imgui.Begin("Window", main_window_state)
        if show_money_change == false then --если разница денег не показываеться
            oldMoneyAmount = moneyAmount --старое количество обновляется
            moneyAmount = getPlayerMoney(PLAYER_HANDLE) --текущее количество обновляется
        end
        if oldMoneyAmount ~= moneyAmount then --если старое количество не равно текущему
            if oldMoneyAmount < moneyAmount then --если старое количество меньше
                string_money = string.format("+%s", moneyAmount - oldMoneyAmount) --считаем разницу, формируем строку
                show_money_change = true --разница денег будет показываться
                count = 5 --счётчик равен 5
            end
            if oldMoneyAmount > moneyAmount then --если старое количество больше
                string_money = string.format("-%s", oldMoneyAmount - moneyAmount)--считаем разницу, формируем строку
                show_money_change = true --разница денег будет показываться
                count = 5 --счётчик равен 5
            end
            if show_money_change then --если разница денег должна показываться
                imgui.Text(string_money) -- показываем строку с разницей
            end
        end
        if count > 0 then -- если счётчик больше 0
            count = count - 1 -- отнимаем от него 1
            if count <= 0 then -- если счётчик меньше либо равен 0
                count = 0 -- счётчик равен 0 (зачем? если он и так 0)
                show_money_change = false -- разница денег больше не показываеться
            end
        end
        imgui.ShowCursor = false
        imgui.End()
    end
end


учтено

проблема с тем что показывает одно и то же решена, проблема с тем что строка всё равно сразу пропадает вернулась)
ставить число для счётчика больше не имеет смысла, даже от 1000000 отнимая по одному это займёт 0,01 секунду, а игре такие большие значения просто не нравятся и она вылетает или зависает на момент подсчёта
выход из положения я вижу только один - использовать ВРЕМЯ, но я не знаю как его использовать в этом вашем луа

Lua:
local imgui = require "imgui"
local main_window_state = imgui.ImBool(true)
local oldMoneyAmount = 0
local moneyAmount = 0
local string_money = ""
local show_money_change = false
local count = 0

function main()
    while true do wait(0)
        imgui.Process = main_window_state.v
    end
end

function imgui.OnDrawFrame()
    if main_window_state.v then
        imgui.SetNextWindowSize(imgui.ImVec2(150, 50), imgui.Cond.FirstUseEver)
        imgui.Begin("Window", main_window_state)
        if show_money_change == false then --если разница денег не показываеться
            oldMoneyAmount = moneyAmount --старое количество обновляется
            moneyAmount = getPlayerMoney(PLAYER_HANDLE) --текущее количество обновляется
            if oldMoneyAmount ~= moneyAmount then --если старое количество не равно текущему
            if oldMoneyAmount < moneyAmount then --если старое количество меньше
                string_money = string.format("+%s", moneyAmount - oldMoneyAmount) --считаем разницу, формируем строку
                show_money_change = true --разница денег будет показываться
                count = 100 --счётчик равен 100
            end
            if oldMoneyAmount > moneyAmount then --если старое количество больше
                string_money = string.format("-%s", oldMoneyAmount - moneyAmount)--считаем разницу, формируем строку
                show_money_change = true --разница денег будет показываться
                count = 100 --счётчик равен 100
            end
            if show_money_change then --если разница денег должна показываться
                imgui.Text(string_money) -- показываем строку с разницей
            end
        end
        if count > 0 then -- если счётчик больше 0
            count = count - 1 -- отнимаем от него 1
            if count == 0 then -- если счётчик равен 0
                show_money_change = false -- разница денег больше не показываеться
            end
        end
        end
        imgui.ShowCursor = false
        imgui.End()
    end
end

Привет, тебе надо делать все вычисления и проверки ИСКЛЮЧИТЕЛЬНО в цикле функции main(). Готовые значения записывай в переменные, и уже их просто выводи на экран в imgui.OnDrawFrame().

Почему так? Дело в том, что функция imgui.OnDrawFrame() вызывается каждый кадр для отрисовки контента на экране. Поэтому во-первых это неочевидный бесконечный цикл, во-вторых: любая задержка в этой функции = смерть GTA (Что у тебя и происходит)
 
  • Нравится
Реакции: Ninthmoon

Ninthmoon

Известный
Автор темы
462
126
спасибо всем кто ответил здесь, у меня получилось достигнуть своей цели
Lua:
local imgui = require "imgui"
local main_window_state = imgui.ImBool(true)
local oldMoneyAmount = 0
local moneyAmount = 0
local string_money = ""
local show_money_change = false
local timeOver = 0

function main()
    while true do wait(0)
        if show_money_change == false then
            oldMoneyAmount = moneyAmount
            moneyAmount = getPlayerMoney(PLAYER_HANDLE)
            if oldMoneyAmount ~= moneyAmount then
                if oldMoneyAmount < moneyAmount then
                    string_money = string.format("+%s", moneyAmount - oldMoneyAmount)
                    show_money_change = true
                    timeOver = os.clock() + 3
                end
                if oldMoneyAmount > moneyAmount then
                    string_money = string.format("-%s", oldMoneyAmount - moneyAmount)
                    show_money_change = true
                    timeOver = os.clock() + 3
                end
            end
        imgui.Process = main_window_state.v
        end
    end
end

function imgui.OnDrawFrame()
    if main_window_state.v then
        imgui.SetNextWindowSize(imgui.ImVec2(150, 100), imgui.Cond.FirstUseEver)
        imgui.Begin("Window", main_window_state)
        if show_money_change and timeOver > os.clock() then
            imgui.Text(string_money)
            elseif timeOver <= os.clock() then
            show_money_change = false
        end
        imgui.ShowCursor = false
        imgui.End()
    end
end
 
  • Нравится
Реакции: Royan_Millans