Вопрос о правильности написания кода

SunRays

Новичок
Автор темы
11
0
Версия MoonLoader
.026-beta
Здравствуйте, многоуважаемые читатели этого поста и эксперты помогающие мне. Я хочу чтобы Вы как более опытные оценили мой код и указали на мои ошибки, как можно было бы переделать или другие варианты реализации моей идеи.


CODE:
script_author('SunRays && BlastHk')

-------------------------------------------------------------------------------------------------------

require 'lib.moonloader'

local keys = require 'vkeys'
local imgui = require 'imgui'
local inicfg = require 'inicfg'
local sampev = require 'lib.samp.events'

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

-------------------------------------------------------------------------------------------------------

local prefix = "{595959}| Help. | ==> {FFFFFF}";

local main_window = imgui.ImBool(false)
local secondary_window = imgui.ImBool(false)

local themes = import "RavenHelp/themes.lua"

-------------------------------------------------------------------------------------------------------

if not doesDirectoryExist("moonloader/Help") then
    sampAddChatMessage(prefix .."Инициализация создания директории скрипта[Папка: moonloader].", -1)
    createDirectory("moonloader/Help")
end

local mainini = inicfg.load({
    config =
    {
        theme = 1,
        style = 1
    }
}, 'RavenCFG.ini')

local status = inicfg.load(mainini, 'CFG.ini')
if not doesFileExist('CFG.ini') then
    inicfg.save(mainini, 'CFG.ini')
end

local savefile = 'CFG.ini'

-------------------------------------------------------------------------------------------------------

local theme = imgui.ImFloat(mainini.config.theme)
local style = imgui.ImFloat(mainini.config.style)

local checked_radio = imgui.ImInt(mainini.config.theme)

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

    sampAddChatMessage(prefix .."Инициализация скрипта {1db00c}успешна{FFFFFF}.", -1)
    sampAddChatMessage(prefix .."Подсказка: Используйте F5 | //rhelp.", -1)

    _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
    nick = sampGetPlayerNickname(id)

    imgui.SwitchContext()
    themes.SwitchColorTheme(mainini.config.theme)

    sampRegisterChatCommand('/rhelp', function()
        main_window.v = not main_window.v
        imgui.Process = main_window.v
    end)

    while true do
        wait(0)
    end
end

function imgui.OnDrawFrame()

    if not main_window.v and not secondary_window.v then
        imgui.Process = false
    end

    local sw, sh = getScreenResolution()

    if main_window.v then
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(600, 250), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'Меню', main_window, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoBringToFrontOnFocus + imgui.WindowFlags.NoSavedSettings)
        
        if not menu then menu = 1 end

        imgui.BeginChild('#Menu', imgui.ImVec2(150, 215), true)
            if imgui.Button(u8'Настройки',imgui.ImVec2(134, 25)) then
                menu = 1
            end
            if imgui.Button(u8'Автор',imgui.ImVec2(134, 25)) then
                menu = 2
            end
        imgui.EndChild()

        imgui.SameLine()

        imgui.BeginChild('#Desktop', imgui.ImVec2(429, 215), true)
            if menu == 1 then
                for i, value in ipairs(themes.colorThemes) do
                    if imgui.RadioButton(value, checked_radio, i) then
                        themes.SwitchColorTheme(i)
                        mainini.config.theme = checked_radio.v
                        inicfg.save(mainini, savefile)
                    end
                end
            end

            if menu == 2 then

            end
        imgui.EndChild()

        imgui.End()
    end

    if secondary_window.v then
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(600, 400), imgui.Cond.FirstUseEver)
        imgui.Begin('-', secondary_window, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoBringToFrontOnFocus + imgui.WindowFlags.NoSavedSettings)
        imgui.End()
    end
    
end



В данный момент на данной стадии разработки я с помощью TCG сделал систему выбора темы, но к тому же добавил сохранение вашего выбора, и поэтому хотел бы узнать ваше мнение. Может где говнокод надо убрать или плохие привычки. Приму любую критику, но опять же с аргументацией :) Заранее спасибо
 

RedHolms

Известный
Проверенный
617
360
Здравствуйте, многоуважаемые читатели этого поста и эксперты помогающие мне. Я хочу чтобы Вы как более опытные оценили мой код и указали на мои ошибки, как можно было бы переделать или другие варианты реализации моей идеи.


CODE:
script_author('SunRays && BlastHk')

-------------------------------------------------------------------------------------------------------

require 'lib.moonloader'

local keys = require 'vkeys'
local imgui = require 'imgui'
local inicfg = require 'inicfg'
local sampev = require 'lib.samp.events'

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

-------------------------------------------------------------------------------------------------------

local prefix = "{595959}| Help. | ==> {FFFFFF}";

local main_window = imgui.ImBool(false)
local secondary_window = imgui.ImBool(false)

local themes = import "RavenHelp/themes.lua"

-------------------------------------------------------------------------------------------------------

if not doesDirectoryExist("moonloader/Help") then
    sampAddChatMessage(prefix .."Инициализация создания директории скрипта[Папка: moonloader].", -1)
    createDirectory("moonloader/Help")
end

local mainini = inicfg.load({
    config =
    {
        theme = 1,
        style = 1
    }
}, 'RavenCFG.ini')

local status = inicfg.load(mainini, 'CFG.ini')
if not doesFileExist('CFG.ini') then
    inicfg.save(mainini, 'CFG.ini')
end

local savefile = 'CFG.ini'

-------------------------------------------------------------------------------------------------------

local theme = imgui.ImFloat(mainini.config.theme)
local style = imgui.ImFloat(mainini.config.style)

local checked_radio = imgui.ImInt(mainini.config.theme)

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

    sampAddChatMessage(prefix .."Инициализация скрипта {1db00c}успешна{FFFFFF}.", -1)
    sampAddChatMessage(prefix .."Подсказка: Используйте F5 | //rhelp.", -1)

    _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
    nick = sampGetPlayerNickname(id)

    imgui.SwitchContext()
    themes.SwitchColorTheme(mainini.config.theme)

    sampRegisterChatCommand('/rhelp', function()
        main_window.v = not main_window.v
        imgui.Process = main_window.v
    end)

    while true do
        wait(0)
    end
end

function imgui.OnDrawFrame()

    if not main_window.v and not secondary_window.v then
        imgui.Process = false
    end

    local sw, sh = getScreenResolution()

    if main_window.v then
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(600, 250), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'Меню', main_window, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoBringToFrontOnFocus + imgui.WindowFlags.NoSavedSettings)
       
        if not menu then menu = 1 end

        imgui.BeginChild('#Menu', imgui.ImVec2(150, 215), true)
            if imgui.Button(u8'Настройки',imgui.ImVec2(134, 25)) then
                menu = 1
            end
            if imgui.Button(u8'Автор',imgui.ImVec2(134, 25)) then
                menu = 2
            end
        imgui.EndChild()

        imgui.SameLine()

        imgui.BeginChild('#Desktop', imgui.ImVec2(429, 215), true)
            if menu == 1 then
                for i, value in ipairs(themes.colorThemes) do
                    if imgui.RadioButton(value, checked_radio, i) then
                        themes.SwitchColorTheme(i)
                        mainini.config.theme = checked_radio.v
                        inicfg.save(mainini, savefile)
                    end
                end
            end

            if menu == 2 then

            end
        imgui.EndChild()

        imgui.End()
    end

    if secondary_window.v then
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(600, 400), imgui.Cond.FirstUseEver)
        imgui.Begin('-', secondary_window, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoBringToFrontOnFocus + imgui.WindowFlags.NoSavedSettings)
        imgui.End()
    end
   
end



В данный момент на данной стадии разработки я с помощью TCG сделал систему выбора темы, но к тому же добавил сохранение вашего выбора, и поэтому хотел бы узнать ваше мнение. Может где говнокод надо убрать или плохие привычки. Приму любую критику, но опять же с аргументацией :) Заранее спасибо
Есть золотое правило: Твоё мнение - это твой мнение, чужое мнение - идёт нахуй
Пиши как хочешь, главное смотри чужие скрипты более опытных разрабов и смотри что там да как, с опытом придёт понимание что и как лучше
Ну и естестна, главное что бы работало, а что там под капотом не сильно важно
 

SunRays

Новичок
Автор темы
11
0
Есть золотое правило: Твоё мнение - это твой мнение, чужое мнение - идёт нахуй
Пиши как хочешь, главное смотри чужие скрипты более опытных разрабов и смотри что там да как, с опытом придёт понимание что и как лучше
Ну и естестна, главное что бы работало, а что там под капотом не сильно важно
Спасибо за совет :)
 

VRush

https://t.me/vrushscript
Проверенный
2,343
1,091
Здравствуйте, многоуважаемые читатели этого поста и эксперты помогающие мне. Я хочу чтобы Вы как более опытные оценили мой код и указали на мои ошибки, как можно было бы переделать или другие варианты реализации моей идеи.


CODE:
script_author('SunRays && BlastHk')

-------------------------------------------------------------------------------------------------------

require 'lib.moonloader'

local keys = require 'vkeys'
local imgui = require 'imgui'
local inicfg = require 'inicfg'
local sampev = require 'lib.samp.events'

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

-------------------------------------------------------------------------------------------------------

local prefix = "{595959}| Help. | ==> {FFFFFF}";

local main_window = imgui.ImBool(false)
local secondary_window = imgui.ImBool(false)

local themes = import "RavenHelp/themes.lua"

-------------------------------------------------------------------------------------------------------

if not doesDirectoryExist("moonloader/Help") then
    sampAddChatMessage(prefix .."Инициализация создания директории скрипта[Папка: moonloader].", -1)
    createDirectory("moonloader/Help")
end

local mainini = inicfg.load({
    config =
    {
        theme = 1,
        style = 1
    }
}, 'RavenCFG.ini')

local status = inicfg.load(mainini, 'CFG.ini')
if not doesFileExist('CFG.ini') then
    inicfg.save(mainini, 'CFG.ini')
end

local savefile = 'CFG.ini'

-------------------------------------------------------------------------------------------------------

local theme = imgui.ImFloat(mainini.config.theme)
local style = imgui.ImFloat(mainini.config.style)

local checked_radio = imgui.ImInt(mainini.config.theme)

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

    sampAddChatMessage(prefix .."Инициализация скрипта {1db00c}успешна{FFFFFF}.", -1)
    sampAddChatMessage(prefix .."Подсказка: Используйте F5 | //rhelp.", -1)

    _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
    nick = sampGetPlayerNickname(id)

    imgui.SwitchContext()
    themes.SwitchColorTheme(mainini.config.theme)

    sampRegisterChatCommand('/rhelp', function()
        main_window.v = not main_window.v
        imgui.Process = main_window.v
    end)

    while true do
        wait(0)
    end
end

function imgui.OnDrawFrame()

    if not main_window.v and not secondary_window.v then
        imgui.Process = false
    end

    local sw, sh = getScreenResolution()

    if main_window.v then
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(600, 250), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'Меню', main_window, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoBringToFrontOnFocus + imgui.WindowFlags.NoSavedSettings)
       
        if not menu then menu = 1 end

        imgui.BeginChild('#Menu', imgui.ImVec2(150, 215), true)
            if imgui.Button(u8'Настройки',imgui.ImVec2(134, 25)) then
                menu = 1
            end
            if imgui.Button(u8'Автор',imgui.ImVec2(134, 25)) then
                menu = 2
            end
        imgui.EndChild()

        imgui.SameLine()

        imgui.BeginChild('#Desktop', imgui.ImVec2(429, 215), true)
            if menu == 1 then
                for i, value in ipairs(themes.colorThemes) do
                    if imgui.RadioButton(value, checked_radio, i) then
                        themes.SwitchColorTheme(i)
                        mainini.config.theme = checked_radio.v
                        inicfg.save(mainini, savefile)
                    end
                end
            end

            if menu == 2 then

            end
        imgui.EndChild()

        imgui.End()
    end

    if secondary_window.v then
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(600, 400), imgui.Cond.FirstUseEver)
        imgui.Begin('-', secondary_window, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoBringToFrontOnFocus + imgui.WindowFlags.NoSavedSettings)
        imgui.End()
    end
   
end



В данный момент на данной стадии разработки я с помощью TCG сделал систему выбора темы, но к тому же добавил сохранение вашего выбора, и поэтому хотел бы узнать ваше мнение. Может где говнокод надо убрать или плохие привычки. Приму любую критику, но опять же с аргументацией :) Заранее спасибо
не используешь поток, поставь -1
while true do
wait(-1)

1655235587790.png

Добавь еще название скрипта

1655235605371.png

Замени на что-то типа "--Libs--" "--Imgui--" и т.д
 
Последнее редактирование:
  • Нравится
Реакции: SunRays

RTD

Нестандартное звание
Модератор
391
414
1. Придерживайся единого стиля. Если у тебя в начале скобки одинарные кавычки, то и везде должны быть одинарные
require с этого же правила правильнее использовать
Lua:
require("lib") --а не require"lib"
, ведь ты не делаешь
Lua:
doesDirectoryExist"moonloader/Help"
Мунлоадер удаляет слово "lib." из require, по этому не пиши его
2. Не делай require если тебе не нужна библиотека. Я не вижу чтобы у тебя где-то использовались константы require("moonloader") и require("vkeys"), так же и с samp.events. Не то чтобы критично сильно, но это может сбить с толку, когда будешь указывать зависимости для работы скрипта
3.
_, id = sampGetPlayerIdByCharHandle(PLAYER_PED) nick = sampGetPlayerNickname(id)
Почему у тебя тут нет local, но в коде выше ты локальными переменными пользуешься? Возникает чувство что ты не совсем понимаешь разницу глобальных и локальных переменных, и какие последствия могут быть
4.
imgui.Begin желательно использовать так, а особенно если у тебя у окна есть возможность "сворачиваться"
Lua:
if imgui.Begin(....) then
      ....
      imgui.End()
end
С BeginChild такая же ситуация. Почему так? Почитай документацию имгуи
5.
if not menu then menu = 1 end
menu должна инициализироваться не в фрейме имгуи. И подумай лучше над ее названием, смотря на код не совсем понятно о каком menu идет речь(тоже может быть применимо и к другим названиям переменных)
6.
if menu == 1 then for i, value in ipairs(themes.colorThemes) do if imgui.RadioButton(value, checked_radio, i) then themes.SwitchColorTheme(i) mainini.config.theme = checked_radio.v inicfg.save(mainini, savefile) end end end if menu == 2 then end
Если ты делаешь
Lua:
if menu == 1 then
, то делай
Lua:
elseif menu == 2 then
. menu не может быть одновременно и 1 и 2, elseif избавит твой компьютер от лишних вычислений проверок
7.
local status = inicfg.load(mainini, 'CFG.ini') if not doesFileExist('CFG.ini') then inicfg.save(mainini, 'CFG.ini') end local savefile = 'CFG.ini'
Зачем ты получаешь status, если потом его нигде не используешь? К тому же выше по коду видно, что ты загрузил настройки, зачем их еще раз получать?
Не совсем понятна логика: попытаться сначала загрузить настройки, а потом проверить что файл настроек CFG.ini существует???
Почему savefile не объявлена до этого? И получается в начале скрипта ты используешь inicfg.save(mainini, 'CFG.ini'), а в конце inicfg.save(mainini, savefile).
+ лучше вынести этот кусок кода с загрузкой/сохранением настроек в функцию и вызывай ее, а не прямой вызов inicfg.save как сейчас. В дальнейшем если захочешь переходить на json, тебе не придется везде заменять вызовы inicfg.save, а просто отредактируешь функцию которая занимается сохранение настроек
8. Почему ты используешь устаревший moon imgui, а не mimgui? Рано или поздно тебе придется перейти, лучше на начальном этапе переходи
9.
sampAddChatMessage(prefix .."Инициализация создания директории скрипта[Папка: moonloader].", -1)
sampAddChatMessage(prefix .."Инициализация скрипта {1db00c}успешна{FFFFFF}.", -1)
Со стороны юзера не совсем понятно, зачем мне в чат выводить и зачем мне знать что ты там что-то создаешь/инициализируешь? Эту информацию выводи лучше в консоль, либо не выводи
10. Еще бы советовал пользоваться нечто похожим на ООП, но к этому ты скорее всего сам придешь, по мере того как накопится слишком много кода и переменных
 
  • Нравится
Реакции: SunRays

SunRays

Новичок
Автор темы
11
0
1. Придерживайся единого стиля. Если у тебя в начале скобки одинарные кавычки, то и везде должны быть одинарные
require с этого же правила правильнее использовать
Lua:
require("lib") --а не require"lib"
, ведь ты не делаешь
Lua:
doesDirectoryExist"moonloader/Help"
Мунлоадер удаляет слово "lib." из require, по этому не пиши его
2. Не делай require если тебе не нужна библиотека. Я не вижу чтобы у тебя где-то использовались константы require("moonloader") и require("vkeys"), так же и с samp.events. Не то чтобы критично сильно, но это может сбить с толку, когда будешь указывать зависимости для работы скрипта
3.

Почему у тебя тут нет local, но в коде выше ты локальными переменными пользуешься? Возникает чувство что ты не совсем понимаешь разницу глобальных и локальных переменных, и какие последствия могут быть
4.

imgui.Begin желательно использовать так, а особенно если у тебя у окна есть возможность "сворачиваться"
Lua:
if imgui.Begin(....) then
      ....
      imgui.End()
end
С BeginChild такая же ситуация. Почему так? Почитай документацию имгуи
5.

menu должна инициализироваться не в фрейме имгуи. И подумай лучше над ее названием, смотря на код не совсем понятно о каком menu идет речь(тоже может быть применимо и к другим названиям переменных)
6.

Если ты делаешь
Lua:
if menu == 1 then
, то делай
Lua:
elseif menu == 2 then
. menu не может быть одновременно и 1 и 2, elseif избавит твой компьютер от лишних вычислений проверок
7.

Зачем ты получаешь status, если потом его нигде не используешь? К тому же выше по коду видно, что ты загрузил настройки, зачем их еще раз получать?
Не совсем понятна логика: попытаться сначала загрузить настройки, а потом проверить что файл настроек CFG.ini существует???
Почему savefile не объявлена до этого? И получается в начале скрипта ты используешь inicfg.save(mainini, 'CFG.ini'), а в конце inicfg.save(mainini, savefile).
+ лучше вынести этот кусок кода с загрузкой/сохранением настроек в функцию и вызывай ее, а не прямой вызов inicfg.save как сейчас. В дальнейшем если захочешь переходить на json, тебе не придется везде заменять вызовы inicfg.save, а просто отредактируешь функцию которая занимается сохранение настроек
8. Почему ты используешь устаревший moon imgui, а не mimgui? Рано или поздно тебе придется перейти, лучше на начальном этапе переходи
9.


Со стороны юзера не совсем понятно, зачем мне в чат выводить и зачем мне знать что ты там что-то создаешь/инициализируешь? Эту информацию выводи лучше в консоль, либо не выводи
10. Еще бы советовал пользоваться нечто похожим на ООП, но к этому ты скорее всего сам придешь, по мере того как накопится слишком много кода и переменных
Уважаемый RTD, взял на заметку ваши советы, но так же хотел бы узнать о возможности связи с вами тет-а-тет, это возможно? А если да, то каким образом.

1. Придерживайся единого стиля. Если у тебя в начале скобки одинарные кавычки, то и везде должны быть одинарные
require с этого же правила правильнее использовать
Lua:
require("lib") --а не require"lib"
, ведь ты не делаешь
Lua:
doesDirectoryExist"moonloader/Help"
Мунлоадер удаляет слово "lib." из require, по этому не пиши его
2. Не делай require если тебе не нужна библиотека. Я не вижу чтобы у тебя где-то использовались константы require("moonloader") и require("vkeys"), так же и с samp.events. Не то чтобы критично сильно, но это может сбить с толку, когда будешь указывать зависимости для работы скрипта
3.

Почему у тебя тут нет local, но в коде выше ты локальными переменными пользуешься? Возникает чувство что ты не совсем понимаешь разницу глобальных и локальных переменных, и какие последствия могут быть
4.

imgui.Begin желательно использовать так, а особенно если у тебя у окна есть возможность "сворачиваться"
Lua:
if imgui.Begin(....) then
      ....
      imgui.End()
end
С BeginChild такая же ситуация. Почему так? Почитай документацию имгуи
5.

menu должна инициализироваться не в фрейме имгуи. И подумай лучше над ее названием, смотря на код не совсем понятно о каком menu идет речь(тоже может быть применимо и к другим названиям переменных)
6.

Если ты делаешь
Lua:
if menu == 1 then
, то делай
Lua:
elseif menu == 2 then
. menu не может быть одновременно и 1 и 2, elseif избавит твой компьютер от лишних вычислений проверок
7.

Зачем ты получаешь status, если потом его нигде не используешь? К тому же выше по коду видно, что ты загрузил настройки, зачем их еще раз получать?
Не совсем понятна логика: попытаться сначала загрузить настройки, а потом проверить что файл настроек CFG.ini существует???
Почему savefile не объявлена до этого? И получается в начале скрипта ты используешь inicfg.save(mainini, 'CFG.ini'), а в конце inicfg.save(mainini, savefile).
+ лучше вынести этот кусок кода с загрузкой/сохранением настроек в функцию и вызывай ее, а не прямой вызов inicfg.save как сейчас. В дальнейшем если захочешь переходить на json, тебе не придется везде заменять вызовы inicfg.save, а просто отредактируешь функцию которая занимается сохранение настроек
8. Почему ты используешь устаревший moon imgui, а не mimgui? Рано или поздно тебе придется перейти, лучше на начальном этапе переходи
9.


Со стороны юзера не совсем понятно, зачем мне в чат выводить и зачем мне знать что ты там что-то создаешь/инициализируешь? Эту информацию выводи лучше в консоль, либо не выводи
10. Еще бы советовал пользоваться нечто похожим на ООП, но к этому ты скорее всего сам придешь, по мере того как накопится слишком много кода и переменных
С 8 пунктом большие проблемы, возможно - я додик что не понимает гениальности этой графической LIB, но я даже элементарно код не могу прочитать, а если говорить о imgui, то я его читаю как текст на русском языке, т.е на 100 проц. Рассмотрев всё это сейчас очень трудно что-то решить, тут такая же штука как с каким нибудь предметом в школе или ВУЗе, ты не можешь понять логику работы этой отрасли и т.п. Надеюсь я нормально объяснил. Но опять же возможно тут дело в моём методе обучения, но так как у меня нету никого знакомого в этой отрасли я кувыркаюсь как могу, с койки на койку, с темы на тему и т.п.

1. Придерживайся единого стиля. Если у тебя в начале скобки одинарные кавычки, то и везде должны быть одинарные
require с этого же правила правильнее использовать
Lua:
require("lib") --а не require"lib"
, ведь ты не делаешь
Lua:
doesDirectoryExist"moonloader/Help"
Мунлоадер удаляет слово "lib." из require, по этому не пиши его
2. Не делай require если тебе не нужна библиотека. Я не вижу чтобы у тебя где-то использовались константы require("moonloader") и require("vkeys"), так же и с samp.events. Не то чтобы критично сильно, но это может сбить с толку, когда будешь указывать зависимости для работы скрипта
3.

Почему у тебя тут нет local, но в коде выше ты локальными переменными пользуешься? Возникает чувство что ты не совсем понимаешь разницу глобальных и локальных переменных, и какие последствия могут быть
4.

imgui.Begin желательно использовать так, а особенно если у тебя у окна есть возможность "сворачиваться"
Lua:
if imgui.Begin(....) then
      ....
      imgui.End()
end
С BeginChild такая же ситуация. Почему так? Почитай документацию имгуи
5.

menu должна инициализироваться не в фрейме имгуи. И подумай лучше над ее названием, смотря на код не совсем понятно о каком menu идет речь(тоже может быть применимо и к другим названиям переменных)
6.

Если ты делаешь
Lua:
if menu == 1 then
, то делай
Lua:
elseif menu == 2 then
. menu не может быть одновременно и 1 и 2, elseif избавит твой компьютер от лишних вычислений проверок
7.

Зачем ты получаешь status, если потом его нигде не используешь? К тому же выше по коду видно, что ты загрузил настройки, зачем их еще раз получать?
Не совсем понятна логика: попытаться сначала загрузить настройки, а потом проверить что файл настроек CFG.ini существует???
Почему savefile не объявлена до этого? И получается в начале скрипта ты используешь inicfg.save(mainini, 'CFG.ini'), а в конце inicfg.save(mainini, savefile).
+ лучше вынести этот кусок кода с загрузкой/сохранением настроек в функцию и вызывай ее, а не прямой вызов inicfg.save как сейчас. В дальнейшем если захочешь переходить на json, тебе не придется везде заменять вызовы inicfg.save, а просто отредактируешь функцию которая занимается сохранение настроек
8. Почему ты используешь устаревший moon imgui, а не mimgui? Рано или поздно тебе придется перейти, лучше на начальном этапе переходи
9.


Со стороны юзера не совсем понятно, зачем мне в чат выводить и зачем мне знать что ты там что-то создаешь/инициализируешь? Эту информацию выводи лучше в консоль, либо не выводи
10. Еще бы советовал пользоваться нечто похожим на ООП, но к этому ты скорее всего сам придешь, по мере того как накопится слишком много кода и переменных
Говоря о 7 пункте Вы имели ввиду такую конструкцию


CODE:
function cfgsave()
    inicfg.save(mainini, 'MyToolsCFG.ini')
end

function cfgload()
    local mainini = inicfg.load({
        config =
        {
            theme = 1
        }
    }, 'MyToolsCFG.ini')
    cfgsave()
end



Если нет, то дайте пример, пожалуйста.
 
Последнее редактирование:

RedHolms

Известный
Проверенный
617
360
1. Придерживайся единого стиля. Если у тебя в начале скобки одинарные кавычки, то и везде должны быть одинарные
require с этого же правила правильнее использовать
Lua:
require("lib") --а не require"lib"
, ведь ты не делаешь
Lua:
doesDirectoryExist"moonloader/Help"
Мунлоадер удаляет слово "lib." из require, по этому не пиши его
2. Не делай require если тебе не нужна библиотека. Я не вижу чтобы у тебя где-то использовались константы require("moonloader") и require("vkeys"), так же и с samp.events. Не то чтобы критично сильно, но это может сбить с толку, когда будешь указывать зависимости для работы скрипта
3.

Почему у тебя тут нет local, но в коде выше ты локальными переменными пользуешься? Возникает чувство что ты не совсем понимаешь разницу глобальных и локальных переменных, и какие последствия могут быть
4.

imgui.Begin желательно использовать так, а особенно если у тебя у окна есть возможность "сворачиваться"
Lua:
if imgui.Begin(....) then
      ....
      imgui.End()
end
С BeginChild такая же ситуация. Почему так? Почитай документацию имгуи
5.

menu должна инициализироваться не в фрейме имгуи. И подумай лучше над ее названием, смотря на код не совсем понятно о каком menu идет речь(тоже может быть применимо и к другим названиям переменных)
6.

Если ты делаешь
Lua:
if menu == 1 then
, то делай
Lua:
elseif menu == 2 then
. menu не может быть одновременно и 1 и 2, elseif избавит твой компьютер от лишних вычислений проверок
7.

Зачем ты получаешь status, если потом его нигде не используешь? К тому же выше по коду видно, что ты загрузил настройки, зачем их еще раз получать?
Не совсем понятна логика: попытаться сначала загрузить настройки, а потом проверить что файл настроек CFG.ini существует???
Почему savefile не объявлена до этого? И получается в начале скрипта ты используешь inicfg.save(mainini, 'CFG.ini'), а в конце inicfg.save(mainini, savefile).
+ лучше вынести этот кусок кода с загрузкой/сохранением настроек в функцию и вызывай ее, а не прямой вызов inicfg.save как сейчас. В дальнейшем если захочешь переходить на json, тебе не придется везде заменять вызовы inicfg.save, а просто отредактируешь функцию которая занимается сохранение настроек
8. Почему ты используешь устаревший moon imgui, а не mimgui? Рано или поздно тебе придется перейти, лучше на начальном этапе переходи
9.


Со стороны юзера не совсем понятно, зачем мне в чат выводить и зачем мне знать что ты там что-то создаешь/инициализируешь? Эту информацию выводи лучше в консоль, либо не выводи
10. Еще бы советовал пользоваться нечто похожим на ООП, но к этому ты скорее всего сам придешь, по мере того как накопится слишком много кода и переменных
На счёт 4-го

Это не то что-бы не рекомендовано imgui, это запрещено
Написано в хеадере:
Begin() return false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting anything to the window. Always call a matching End() for each Begin() call, regardless of its return value!
Конечно, внутренность самого окна можно и не рисовать, но вызывать End обязательно
 
  • Нравится
Реакции: SunRays

RTD

Нестандартное звание
Модератор
391
414
На счёт 4-го

Это не то что-бы не рекомендовано imgui, это запрещено
Написано в хеадере:

Конечно, внутренность самого окна можно и не рисовать, но вызывать End обязательно
........
Если читать и сравнивать с кодом автора темы, то можно заметить, в 4 указано, что желательно писать if с imgui.Begin, а у автора этого нет. Про imgui.End я ничего не писал, более того он указан в том примере, которому желательно следовать.
Говоря о 7 пункте Вы имели ввиду такую конструкцию
+-, нормально
Уважаемый RTD, взял на заметку ваши советы, но так же хотел бы узнать о возможности связи с вами тет-а-тет, это возможно? А если да, то каким образом.
Личка на форуме. Возможно еще телеграм, но лучше в личку форума
С 8 пунктом большие проблемы, возможно - я додик что не понимает гениальности этой графической LIB, но я даже элементарно код не могу прочитать, а если говорить о imgui, то я его читаю как текст на русском языке, т.е на 100 проц. Рассмотрев всё это сейчас очень трудно что-то решить, тут такая же штука как с каким нибудь предметом в школе или ВУЗе, ты не можешь понять логику работы этой отрасли и т.п. Надеюсь я нормально объяснил. Но опять же возможно тут дело в моём методе обучения, но так как у меня нету никого знакомого в этой отрасли я кувыркаюсь как могу, с койки на койку, с темы на тему и т.п.
Ну значит отложи это