Lua Roblox API: как я могу заблокировать игрока / персонажа, который сталкивается с ящиком - PullRequest
1 голос
/ 04 августа 2020

Фон: минимальные объекты. Просто игрок и его часть (прямоугольная angular призма), которая парит в воздухе и закреплена.

Я, честно говоря, не понимаю, что происходит под капотом, так что это сложно понять. Без debounce при срабатывании события функция обратного вызова вызывается функцией connect () или обработчиком события (не уверен), а без устранения debounc функция вызывается несколько раз, поскольку операторы печати повторяются в поле вывода. Итак, с переменной (типа boolean), которая хранит флаг противодействия, это решает. Затем я пытаюсь «снять дебаунс», когда модель игрока находится вне модели коробки. Но я не знаю, как это сделать правильно.

Вот моя попытка кода:

local box = game.Workspace.BoxModel;
local debounce = false;

local function onTouchedDebounced()
    if (debounce == false)
    then
        debounce = true;
        print("Hello! onTouchedDebounced() has ran.");
        print("box.Touched:", box.Touched);
        print("box.Touched:Connect()", box.Touched:Connect(onTouchedDebounced));
        print("debounce = ", debounce);
    end
end

local function onTouchedUndebounced()
    if (debounce==true) 
    then
        print("Hello! onTouchedUndebounced() has ran.");
        debounce=false;
        print("wait(10) finished. debounce =",debounce);    
    end
        
end


box.Touched:Connect(onTouchedDebounced);
box.TouchEnded:Connect(onTouchedUndebounced);

1 Ответ

2 голосов
/ 05 августа 2020

Суть того, что вы делаете, звучит: начинайте блокировать после первого события и разблокируйте через некоторое время. Если бы это было с помощью нажатия кнопок или щелчков мышью, ваше решение сработало бы нормально. Это осложняется событием Touched, поскольку оно срабатывает любой частью, которая касается его, и персонаж игрока может иметь несколько точек касания.

The Touched и TouchEndeded события дают вам ссылку на экземпляр, который коснулся детали.

Если цель состоит в том, чтобы запустить событие коробки только один раз для каждого игрока или один раз, когда кто-либо его касается, вы можете сохранить словарь частей, которые в настоящее время касаясь коробки. Когда деталь касается, вы увеличиваете счетчик. Когда часть останавливается, вы уменьшаете ее. Вы удаляете флаг отмены только после удаления всех точек касания.

local box = game.Workspace.BoxModel
local playersTouching = {} --<string playerName, int totalParts>

local function onTouchedDebounced(otherPart)
    -- check that the thing that touched is a player
    local playerModel = otherPart.Parent
    if not playerModel:IsA("Model") then
        warn(otherPart.Name .. " isn't a child of a character. Exiting")
        return
    end

    -- check whether this player is already touching the box
    local playerName = playerModel.Name
    local total = playersTouching[playerName]
    if total and total > 0 then
        warn(playerName .. " is already touching the box")
        playersTouching[playerName] = total + 1
        return
    end

    -- handle a new player touching the box
    playersTouching[playerName] = 1

    -- Do a thing here that you only want to happen once per event...
    print(string.format("Hello! onTouchedDebounced() has ran with %s and %s", playerName, otherPart.Name))    
end

local function onTouchedUndebounced(otherPart)
    -- decrement the counter for this player
    local playerName = otherPart.Parent.Name
    if playersTouching[playerName] == nil then
        return
    end

    local newTotal = playersTouching[playerName] - 1
    playersTouching[playerName] = newTotal

    -- if the total is back down to zero, clear the debounce flag
    if newTotal == 0 then
        playersTouching[playerName] = nil
        print(string.format("Hello! onTouchedUndebounced() has ran and %s has no more touching parts", playerName))
    end
end


box.Touched:Connect(onTouchedDebounced)
box.TouchEnded:Connect(onTouchedUndebounced)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...