Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Menu erstellen,wie;)
#4
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.");
    }
}
Leider ist meine Signatur ausserhalb Sachsens nicht verfügbar.
Zitieren


Nachrichten in diesem Thema
Menu erstellen,wie;) - von Ezry Aldrin - 09.08.2010, 22:39
Re: Menu erstellen,wie;) - von Gau Hax - 09.08.2010, 23:05
Re: Menu erstellen,wie;) - von Ezry Aldrin - 10.08.2010, 00:52
Re: Menu erstellen,wie;) - von Rebekka Revnik - 10.08.2010, 12:50

Möglicherweise verwandte Themen…
Thema Verfasser Antworten Ansichten Letzter Beitrag
  Sourcecode mit KI erstellen Manfred Aabye 7 1.023 21.04.2024, 12:57
Letzter Beitrag: Manfred Aabye

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste