ROBLOX Lua - 图像透明功能

Posted

技术标签:

【中文标题】ROBLOX Lua - 图像透明功能【英文标题】:ROBLOX Lua - Image Transparency Function 【发布时间】:2017-03-21 03:16:47 【问题描述】:

我正在尝试这样当你触摸砖块时,它会冻结你的角色,然后在 ModuleScript 中运行一个 函数 来生成 ImageLabel 当你的角色被传送到该建筑物的内部/外部时,它会慢慢出现然后消失。到目前为止,我已经设法让它冻结你的角色并调用该函数,但是使图像出现和消失的代码不起作用。这是代码:

_G.BeginFade =

_G.BeginFade.GlobalFunction = function()

`local Image = game.StarterGui.Fade.FadeImage`
Image.Visible = true
repeat
    Image.ImageTransparency = Image.ImageTransparency - 0.1
    wait(0.2)
until
    Image.ImageTransparency == 0
wait(2)
repeat
    Image.ImageTransparency = Image.ImageTransparency + 0.1
until
    Image.ImageTransparency == 1

end

我使用 _G.BeginFade.GlobalFunction() 调用该函数,并从不同的脚本调用它。包含该函数的 ModuleScript 位于 StarterGui 中。它返回此错误:

Workspace.Home Teleport.tele2.Teleport pad Script:47: attempt to index field 'BeginFade' (a nil value)

【问题讨论】:

【参考方案1】:
local player = game.Players.LocalPlayer
local Image = player.StarterGui.Fade.FadeImage
local i = 0 --have i as a stopper for the repeat function, it tends to go over it.
script.Parent.Door1.Touched:connect(function(hit)
if hit.Humanoid ~= nil then
Image.Visible = true
repeat
Image.Transparency = Image.Transparency - 0.1
i = i + 1
wait(0.1)
until i == 10
end
end)

script.Parent.Door2.Touched:connect(function(hit)
if hit.Humanoid ~= nil then
Image.Visible = true
repeat
Image.Transparency = Image.Transparency - 0.1
i = i - 1
wait(0.1)
until i == 0 
end
end)

【讨论】:

谢谢,但我需要它作为一个函数,这样我就可以从其他脚本中调用它。如果我将它的一部分放入一个函数中,这会起作用吗?【参考方案2】:

您可能需要研究的是,如果全局是在函数执行时声明的,因为如果您在单独的线程中声明它,它仍有可能为 nil。

其实给出的错误码和你给的sn-p代码没有关系。

如果您向我们提供了整个模块和您的声明,那么我们可以在此处为您提供直接补丁...但在那之前,请注意您的声明是否在线程之间同步。

【讨论】:

【参考方案3】:

正确执行此操作的方法是使用模块,因为 _G 仅在特定组/类脚本之间共享。

例如:

在服务器脚本中:

_G.kek = true;
print(_G.topkek);

在客户端脚本中:

_G.topkek = false;
print(_G.kek);

结果:

server: attempt to index boolean 'topkek': a nil value
client: attempt to index boolean 'kek': a nil value

如果你运行它,它会抛出一个错误,因为这不是在服务器和客户端边界之间共享的,但是它是在客户端到客户端和服务器到服务器之间共享的

例如:

在服务器脚本 1 中:

_G.kek = true;
wait(.1); -- add a bit of delay just in case
print(_G.topkek);

在服务器脚本 2 中:

_G.topkek = false;
wait(.1); -- same here
print(_G.kek);

结果:

server script 1: 'false'
server script 2: 'true'

不仅如此,还在于您使用了 game.StarterGui 而不是使用 Player 的 PlayerGui。而且,您使用了“重复”,但没有等待()。在没有 wait() 的情况下使用任何类型的循环(如果为 true,则重复直到,for i in math.huge)会导致游戏冻结和崩溃。

所以,要清除所有其他内容,您应该这样做:

在名为“fade”的 ModuleScript 中,位于 ReplicatedStorage:

local api = ;

api.BeginFade = function(image)
    local alpha = 30; -- Change this to the number of cycles before fully transparency. Higher = longer time that the image will take to fade in and out.
    image.Visible = true;
    image.ImageTransparency = 1;

    for i = 1, alpha do
        image.ImageTransparency = image.ImageTransparency - 1/alpha;
        wait(); -- We use 'wait()' here to prevent the loop from ending in 0 seconds.
    end;
    wait(0.7); -- I've worked with games that have screens like this, and I believe 0.7 time is better than 2 seconds. Trust me, I've got 200 places. lol
    for i = 1, alpha do
        image.ImageTransparency = image.ImageTransparency + 1/alpha;
        wait();
    end;
    image.ImageTransparency = 1; -- Not necessary too, but works as a 'extra check'.
    return image; -- We gotta return something, right? (not necessary)
end;

return api;

在 telport pad 内的脚本中:

local pad = script.Parent;
local rep = game:service("ReplicatedStorage");
local fade = rep:WaitForChild("fade");
fade = require(fade); -- Extract the table of the Module which contains functions

pad.Touched:connect(function(ht)
    local hit = ht.Parent;
    if hit.ClassName == "Model" then
        if hit:FindFirstChildOfClass("Humanoid")then
            local name = hit.Name;
            local plr = nil;

            for _,v in pairs(game:service("Players"):GetPlayers())do
                if v.Name == name then
                    plr = v;
                end;
            end;
            if plr ~= nil then
                local img = plr.PlayerGui.Fade.FadeImage;
                fade.BeginFade(img);
                wait(0.1); -- Add a bit of cooldown
            end;
        end;
    end;
end);

在大多数情况下应该这样做。虽然,利用者可以删除 Fade 模块,但修复它需要 RemoteEvents 和大量空闲时间,现在我的时间不多了,所以我希望我的回答对你有所帮助。

【讨论】:

以上是关于ROBLOX Lua - 图像透明功能的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 lua 检查 Roblox 中是不是存在对象?

C# 模拟 Windows 中的默认拖放功能(拖动过程中的透明图像)

如何使用JS将图像制作成具有透明背景的轮廓

在图像周围添加透明边框

如何设置JPanel的透明背景?

opencv ios透明图片加载不透明