1

我想用 LSL 制作一个射手,所以我想测量鼠标左键单击开始和结束之间的时间,以设置投掷速度。

我还想更新一个 gui(或至少显示文本Power: 55%等),假设每增加 5%。

我怎样才能做到这一点?

我真的无法展示我所做的任何事情,因为我不太了解 LSL,所以我无法尝试任何事情。我能找到的最接近的是llTakeControls的这个页面,但我不确定如何使用它。

提前感谢您的帮助,

编辑

根据@BlindWanderer 的回答,我尝试对其进行修改(希望control()在鼠标关闭时会重复调用它),但显然情况并非如此:

default
{
    state_entry()
    {
        llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);
    }
    run_time_permissions(integer perm)
    {
        if(PERMISSION_TAKE_CONTROLS & perm)
        {
            llTakeControls(CONTROL_LBUTTON, TRUE, TRUE);
        }
    }
    control(key id, integer level, integer edge)
    {
        integer start = level & edge;
        integer end = ~level & edge;
        integer held = level & ~edge;
        integer untouched = ~(level | edge);
        if(start & CONTROL_LBUTTON) {
            llResetTime();
        }
        if(end & CONTROL_LBUTTON) {
            llOwnerSay((string)llGetTime());
        }
        // --- My attempt to display the time peridoically
        float timerval = llGetTime();
        llOwnerSay((string)timerval); // this doesn t fire
        if(llRound(timerval*100) % 5 == 0){
            llOwnerSay((string)timerval); // this neither
        }

    }
}

我的第二次尝试(在意识到有一个名为 的变量之后held),但我再次无法使其工作:/

default
{
    state_entry()
    {
        llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);
    }
    run_time_permissions(integer perm)
    {
        if(PERMISSION_TAKE_CONTROLS & perm)
        {
            llTakeControls(CONTROL_LBUTTON, TRUE, TRUE);
        }
    }
    control(key id, integer level, integer edge)
    {
        integer start = level & edge;
        integer end = ~level & edge;
        integer held = level & ~edge;
        integer untouched = ~(level | edge);
        if(start & CONTROL_LBUTTON) {
            llResetTime();
        }
        if(end & CONTROL_LBUTTON) {
            llOwnerSay((string)llGetTime());
        }

        if(held & CONTROL_LBUTTON){
            llOwnerSay("check");
            float timerval = llGetTime();
            llOwnerSay((string)timerval); // this doesn t fire
            if(llRound(timerval*100) % 5 == 0){
                llOwnerSay((string)timerval); // this neither
            }
        }




    }
}
4

1 回答 1

1

从 llTakeControls 修改示例比解释如何修改示例更快。这是一种快速而肮脏的方式来获得时间。

default
{
    state_entry()
    {
        llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);
    }
    run_time_permissions(integer perm)
    {
        if(PERMISSION_TAKE_CONTROLS & perm)
        {
            llTakeControls(CONTROL_LBUTTON, TRUE, TRUE);
        }
    }
    control(key id, integer level, integer edge)
    {
        integer start = level & edge;
        integer end = ~level & edge;
        integer held = level & ~edge;
        integer untouched = ~(level | edge);
        if(start & CONTROL_LBUTTON) {
            llResetTime();
        }
        if(end & CONTROL_LBUTTON) {
            llOwnerSay((string)llGetTime());
        }
    }
}
于 2016-05-01T16:29:43.250 回答