如何在Roblox Lua中复制“撤消”(Ctrl + Z)功能?

我一直在尝试制作一个通常在文本编辑器和程序中具有的'撤消'功能。我已经完成了某种'撤消'功能,但它只能一次删除一个字母,这不是我的目标。我要做的是一次删除整个单词。

我在我输入文本的文本框上使用了GetPropertyChangedSignal并将字符串存储在其中,然后每当玩家按下ctrl + z时,我首先将文本框的文本设置为表的最后一个值,然后删除它。

以下是我使用的代码(不是精确的,变量当然是不同的):

local Tab = {};

Box:GetPropertyChangedSignal("Text"):Connect(function()
    Tab[#Tab + 1] = Box.Text;
end);

game:service'Players'.LocalPlayer:GetMouse().KeyDown:Connect(function(key)
    if key == "z" then -- i will add a ctrl check later.
        Box.Text = #Tab > 0 and Tab[#Tab] or "";
        Tab[#Tab] = nil;
    end;
end);

正如我之前提到的,我希望它一次删除整个单词。我考虑使用模式匹配(string.gsubstring.match%s+%w+)一次删除整个单词。

这就是我已经得到的。非常感谢您的帮助。

点赞
用户2858170
用户2858170

存储一系列操作。为了撤销,撤回最后的行动;为了恢复,重复执行它们。如果您希望仅在单词级别上撤销,可以自由地合并形成单词的操作。

H -> 追加“H”
He -> 追加“e”
Hel -> 追加“l”
Helli -> 追加“i”
Hell -> 删除最后一个“i”
Hello -> 追加“ ”
Hello -> 追加“o”
Hello W -> 追加“W”

如果可以移动光标,则需要插入操作,必须在其中存储位置。

另一个解决方案是将任何新单词存储在表格中。

{"H"}
{"He"}
{"Hel"}
{"Hell"}
{"Hello"}
{"Hello", " "}
{"Hello", " ", "w"}
{"Hello", " ", "wo"}
{"Hello", " ", "wol"}
{"Hello", " ", "wo"}
{"Hello", " ", "wor"}
{"Hello", " ", "worl"}
{"Hello", " ", "world"}

每次在空格和非空格字符之间切换时开始/添加一个新项目。要撤消输入的最后一个单词,请从列表中删除它。如果您想要撤销删除,您将不得不保留第二个副本以便恢复。

您还可以实现链接列表或诸如此类的其他数据结构。这可以变得任意复杂。

2019-04-16 22:24:14