GridTalk.de
Menu erstellen,wie;) - Druckversion

+- GridTalk.de (https://www.gridtalk.de)
+-- Forum: Werkstatt (https://www.gridtalk.de/forumdisplay.php?fid=4)
+--- Forum: Scripting (https://www.gridtalk.de/forumdisplay.php?fid=23)
+--- Thema: Menu erstellen,wie;) (/showthread.php?tid=77)



Menu erstellen,wie;) - Ezry Aldrin - 09.08.2010

Huhu

Also ich wuerde gerne eine Menu bauen das angezeigt wird,dazu soll es dann ein Script geben das dann HG Adressen oder Radiostationen zur verfuegung stellt,ich hatte das aus SL,aber des funzte nicht in OS,daher muesste ich das selber schreiben,wer schoen wenn mir das einer erklaeren koennte,wie das Geht

lg
Ezry


Re: Menu erstellen,wie;) - Gau Hax - 09.08.2010

ich würde sagen, so es ein freies Script ist, was du auch dann anderen zu Verfügung stellst, es hier mal zu posten, so das man es sich mal laden kann und die Fehler oder Änderungen machen kann.

als weiteres ist hier mal nen einfaches Menu script was OS tauglich ist

Code:
// menu script

integer CHANNEL = 42; // dialog channel
list MENU_MAIN = ["Color", "Alpha"]; // the main menu
list MENU_OPTIONS = ["Red", "Green", "Blue", "...Back"]; // a submenu
list MENU_ALPHA = ["Clear", "Translucent", "Opaque", "...Back"];

default
{
    state_entry()
    {
        llListen(CHANNEL, "", NULL_KEY, ""); // listen for dialog answers (from multiple users)
        llSetText("Dialog Test",<1,1,1>,1.0);
    }
    touch_start(integer total_number)
    {
        llDialog(llDetectedKey(0), "What do you want to do?", MENU_MAIN, CHANNEL); // present dialog on click
    }
    listen(integer channel, string name, key id, string message)
    {
        if (message == "Color")
        {
            llDialog(id, "Pick a color", MENU_OPTIONS, CHANNEL); // present submenu on request
        }
        else if (message == "Alpha")
        {
            llDialog(id, "Pick alpha", MENU_ALPHA, CHANNEL);
        }
        else if (message == "...Back")
        {
            llDialog(id, "Select option", MENU_MAIN, CHANNEL); // present main menu on request to go back
        }
        else if (message == "Red")
        {
            llSetColor(<1,0,0>,ALL_SIDES);
        }
        else if (message == "Green")
        {
            llSetColor(<0,1,0>,ALL_SIDES);
        }
        else if (message == "Blue")
        {
            llSetColor(<0,0,1>,ALL_SIDES);
        }
        else if (message == "Clear")
        {
            llSetAlpha(0.0, ALL_SIDES);
        }
        else if (message == "Translucent")
        {
            llSetAlpha(0.5, ALL_SIDES);
        }
        else if (message == "Opaque")
        {
            llSetAlpha(1.0, ALL_SIDES);
        }
    }
}

hier nochmal der Link " LSL Funktionen " zu der Seite von Opernsimulator, wo einzusehen ist, welche LSL Funktionen im OS genutzt werden können




Re: Menu erstellen,wie;) - Ezry Aldrin - 10.08.2010

hiu

thx,ich schau mal nach ob es frei war, wenn ich morgen oder so ins SL gehe. Meine aber das es frei ist,werde es dann gerne hier posten,sofern ichs hinbekomme*lach*

lg
Ezry


Re: Menu erstellen,wie;) - Rebekka Revnik - 10.08.2010

Mal auf die Schnelle mein Standardmenü, was ich auch im OSgrid nutze.
Als Demo wird die Liste DlgItems inm state_entry mit sinnlosen Zahlen gefüllt, da muss dann was anderes rein.
LG Reb

Code:
// Menu 1
// Ein Menü mit beliebig vielen Schaltflächen
// diese stehen in der Liste DlgItems

string NEXT = ">>>";                        // Schaltflächen für vor und zurück
string PREV = "<<<";
string DLGTITLE = "Drücke eine Taste..";    // Dialog-Text
integer DLGCHANNEL;                            // Chatkanal
integer TIME = 30;                            // Zeit nach der abgebrochen wird, wenn TIMEOUT = TRUE ist
integer TIMEOUT = TRUE;                        // soll ein Abbruch nach der Zeit TIME erfolgen?
integer MenuOn = FALSE;                        // kein neues Menu wenn schon eins da ist
list DlgItems = [];                            // die Schaltflächen des Dialogs
integer DlgPage = 0;                        // aktuelle Seite - wird vom Skript verwendet
integer Listener;

list DlgNice(list Dlg)                        // "schöneres" Aussehen
{
    list l = [];
    integer len = llGetListLength(Dlg);
    integer i;
    while(llGetListLength(Dlg) < 12) Dlg += [" "];
    integer ip = llListFindList(Dlg, [PREV]);
    integer in = llListFindList(Dlg, [NEXT]);
    if(in != -1)
    {
        Dlg = llDeleteSubList(Dlg, in, in);
        Dlg += [NEXT];
    }
    if(ip != -1)
    {
        Dlg = llDeleteSubList(Dlg, ip, ip);
        Dlg = llListInsertList(Dlg, [PREV], 9);
    }
    for(i = 0; i< 3; i++) l += llList2List(Dlg, i + 9, i + 9);
    for(i = 3; i< 6; i++) l += llList2List(Dlg, i + 3, i + 3);
    for(i = 6; i< 9; i++) l += llList2List(Dlg, i - 3, i - 3);
    for(i = 9; i< 12; i++) l += llList2List(Dlg, i - 9, i - 9);
    return l;
}

DlgShow(string msg, integer channel)        // die eigentliche Dialogprozedur
{
    if(MenuOn) return;
    MenuOn = TRUE;
    list Dlg = [];
    integer Count = llGetListLength(DlgItems);
    integer Start = (DlgPage - 1) * 10 + 11;
    if(DlgPage == 0)
    {
        Start = 0;
        if(Count < 13) Dlg = DlgItems;
        else Dlg = llList2List(DlgItems, 0, 1) + [NEXT] + llList2List(DlgItems, 2, 10);
    } else
    {
        if(Count < Start + 12) Dlg = [PREV] + llList2List(DlgItems, Start, Start + 11);
        else Dlg = [PREV] + llList2List(DlgItems, Start, Start) + [NEXT] + llList2List(DlgItems, Start + 1, Start + 9);
    }
    integer i;
    for(i = llGetListLength(Dlg) - 1; i >= 0; i--) Dlg = llListReplaceList(Dlg, [llGetSubString(llList2String(Dlg, i), 0, 23)], i, i);
    if(TIMEOUT) llSetTimerEvent(TIME);
    llListenRemove(Listener);
    llListen(channel, "", llGetOwner(), "");
    // der Standard-Dialog, den ich nicht mag
    // llDialog(llGetOwner(), msg, Dlg, channel);
    // wenns schöner aussehen soll:
    llDialog(llGetOwner(), msg, DlgNice(Dlg), channel);
}

integer DlgMain(string msg)
{
    MenuOn = FALSE;
    llSetTimerEvent(0);
    llListenRemove(Listener);
    if(msg == PREV)
    {
        DlgPage--;
        DlgShow(DLGTITLE, DLGCHANNEL);
        return TRUE;
    } else if(msg == NEXT)
    {
        DlgPage++;
        DlgShow(DLGTITLE, DLGCHANNEL);
        return TRUE;
    } else if(msg == " ")
    {
        DlgShow(DLGTITLE, DLGCHANNEL);
        return TRUE;
    }
    else return FALSE;
}

default
{
    state_entry()
    {
        integer i;
        DLGCHANNEL = (integer)llFrand(10000) + 999;
        DlgItems = [];
        // nur zum Test
        for(i = 0; i < 35; i++) DlgItems += (string)i;
    }
    touch_start(integer total_number)
    {
        if(!MenuOn && llDetectedKey(0) == llGetOwner())
        {
            DlgPage = 0;
            DlgShow(DLGTITLE, DLGCHANNEL);
        }
    }
    listen(integer channel, string name, key id, string message)
    {
        if(DlgMain(message)) return;
        // hier werden die Schaltflächen ausgewertet

        // Wenn das Menü erneut aufgerufen werden soll, dann die nächste Zeile verwenden
        // DlgShow(DLGTITLE, DLGCHANNEL);
    }
    timer()
    {
        llSetTimerEvent(0);
        llListenRemove(Listener);
        MenuOn = FALSE;
        llOwnerSay("Die Zeit für das Menü ist abgelaufen. Bitte nochmals aufrufen.");
    }
}