Используйте хранилище данных более эффективно - PullRequest
0 голосов
/ 13 января 2020

Я кодирую свою игру с lua на Roblox Stuido ide. Игра работает - вроде как, хотя я знаю, что код не очень хорош. Это игра для маленьких детей, в которой число отображается на знаке, и игрок должен go к платформе, которая соответствует числу. Одна из проблем, с которыми я столкнулся, заключается в том, что я хочу, чтобы был GUI, который отображал бы точки в больших количествах, поскольку статистику лидеров в верхнем углу было не так легко увидеть. Я хочу, чтобы игрок не просто видел свои очки, это было бы несколько проще, просто добавьте textLabel на стартовый плеер gui с помощью такого сценария:

while true do 
    wait(.1)
    script.Parent.Text = game.Players.LocalPlayer.leaderstats.Platforms.Value
end

со следующим кодом тоже:

game.Players.PlayerAdded:connect(function(player)
    local playerKey = "Player_" .. player.UserId
    local leaderstats = Instance.new("Folder",player)
    leaderstats.Name = "leaderstats"
    local Platforms = Instance.new("IntValue", leaderstats) 
    Platforms.Name = "Platforms"
    Platforms.Value = 0
    platformCount:SetAsync(player.UserId, 0)
    StartGui:FireAllClients(player)

end)

Пожалуйста, обратите внимание на последние пару строк этого блока, это то, что я придумал. Я не уверен, как это сделать лучше, но я чувствую, что они не соответствуют действительности.

Моя цель состоит в том, чтобы каждый игрок мог видеть не только свои обновленные оценки в режиме реального времени, но и результаты всех других игроков. Это то, что не полностью работает. Мой метод заключается в следующем. Когда игрок выходит на нужную платформу, у меня есть этот код на локальном скрипте

                allPlats[k].Eliminated = true
                player:WaitForChild("leaderstats"):FindFirstChild("Platforms").Value = player:WaitForChild("leaderstats"):FindFirstChild("Platforms").Value + 1 --increase leaderstats
                points = points + 1
                numIfScored:InvokeServer(column, row, teamColorReady, points, team)
                PlatformDeleted.OnClientEvent:Connect(platformTransparency)

Игнорировать строки, которые не относятся к вопросу. Важной частью этого вопроса является то, что я обращаюсь к intValue, созданному в лидерах, и увеличиваю его значение на единицу. Я также отправляю вызов на сервер с удаленной функцией, которая проходит там, где была платформа, цвет команды и т. Д. c ...

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

функция numIfScored.OnServerInvoke (plr, col, row, orignalTeamColor, points, team)

game.Workspace.TargetNumber.Value = getAnddisplayTarget(col, row)

PlatformDeleted:FireAllClients(col, row)

for k, v in pairs(allPlats) do 
    if v.Column == col and v.Row == row then
        v.Part.Transparency = 0
        v.Part.Material = "Neon"
        v.Part.BrickColor = BrickColor.new(orignalTeamColor)
    end
end
platformCount:SetAsync(plr.UserId, points)

end

Затем я запускаю отдельный блок кода в том же скрипте, который постоянно обновляет gui, собирая точки из хранилища данных:

while wait(.1) do   
    for _, player in pairs(Players:GetPlayers()) do

        local points = platformCount:GetAsync(player.UserId)
        UpdateGUI:FireAllClients(player.UserId,points, player.Team)
    end
end

У меня есть localscript, который является дочерним по отношению к текстовой метке, которая отображает оценки со следующим кодом:

local function UpdateLabel(plrId, points, team)

    if team.Name == "Really red Team" then
    game.Players.LocalPlayer.PlayerGui.ScreenGui.RedTeam.Text = points
    elseif team.Name == "Really blue Team" then
    game.Players.LocalPlayer.PlayerGui.ScreenGui.BlueTeam.Text = points
    end
end
StartGui.OnClientEvent:Connect(StartLabel)

Это работает, но глючит. Я играю дома с моим сыном, это вроде как работает, с небольшим отставанием, но как только я пытаюсь играть с другими игроками, такими как мой друг и его сын, система перестает работать хорошо. Одна вещь, которую я знаю, не очень хорошая, это то, что если вы начнете играть до того, как присоединится другой игрок, то этот игрок не сможет увидеть ваш прогресс до того, как он вошел. Другая проблема заключается в том, что первый игрок, который присоединится, будет виден игрокам, которые присоединятся позже. , но когда игроки присоединяются, которые не видят ярлыки игроков, которые присоединились ранее.

Существует ли намного более простой способ создать gui, который обновляет все оценки игроков во всех игроках gui ' s? Спасибо.

При необходимости могу выложить полный код.

1 Ответ

0 голосов
/ 27 января 2020

Нет необходимости в полном коде. Мне просто нужно было предложение «Это в LocalScript». Даже если вы изменяете текст меток в сценарии сервера, вы добавляете точки в локальный сценарий, что означает, что это изменит только точки для вас, а не для любого другого игрока. Вместо этого, если вы используете RemoteFunction и вызываете сервер для изменения точек, я более чем уверен, что он должен работать.

...