How to Create a Dialog LT

From SA-MP Wiki

Revision as of 14:16, 4 March 2013; view current revision
←Older revision | Newer revision→
Jump to: navigation, search

Contents

Kas yra GUI?

GUI tai vienas iš mano manymu geriausių 0.3 versijos privalomų. GUI sistema žaidėjui leidžia turėti daugiau galimybių žaidime, atsiranda galimybė kontroliuoti savo veiksmus pele naršant per GUI 'langus'.

GUI langai bei jų rūšys

Žaidime norint parodyti žaidėjui GUI 'langą' reikia išsirinkti jo tipą, vieną iš 3 variantų:

#define DIALOG_STYLE_MSGBOX	0    // Paprastas GUI 'langas'
#define DIALOG_STYLE_INPUT	1    // GUI 'langas' su teksto įvedimo laukeliu
#define DIALOG_STYLE_LIST	2    // GUI 'langas' su pasirinkimų sąrašu

Funkcijos bei callback'ai

SA-MP modifikacijoje GUI scriptinimas yra labai paprastas. Tereikia mokėti vieną funkciją ir vieną callback'ą. Dabar apie funkciją... Norint žaidėjui parodyti GUI langą - naudosime ShowPlayerDialog funkciją. Joje kaip matome yra nemažai parametrų:

ShowPlayerDialog(playerid, dialogid, style, caption[], info[], button1[], button2[])
playeridParametras nurodo žaidėjo id, kuriam bus parodomas GUI langas.
dialogidTai langų skiriamasis požymis pagal kurį atskirsime langus vieną nuo kito.
styleGUI lango stilius.
caption[]Tai tekstas kuris bus rodomas GUI lango viršuje.
info[]Tai tekstas, kuris bus matomas pačiame GUI lange.
button1[]Kairiojo GUI lange esančio mygtuko tekstas.
button2[]Dešiniojo GUI lange esančio mygtuko tekstas.


Kaip jau minėjau, GUI scriptinime yra ir vienas callback'as - OnDialogResponse. Dabar apie parametrus:

OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
playeridŽaidėjo id, kuriam atidarytas GUI langas.
dialogidGUI lango id nurodytas ShowPlayerDialog funkcijoje.
responseParameteras rodantis, kurį lango mygtuką žaidėjas paspaudė. 1 pirmasis mygtukas, 0 antrasis.
listitemPasirinkimas, kuris buvo pasirinktas iš GUI lango su sąrašu.
inputtext[]Tekstas, kurį žaidėjas įvedė į GUI langą su teksto įvedimo laukeliu.


Paprastas GUI langas

Dabar pabandykime sukurti paprastą GUI langą su bet kokiu tekstu. Visų pirmą sugalvokime kur norėsime parodyti GUI lang'ą. Aš nusprendžiau jį parodyti žaidėjui vos tik jam prisijungus. Todėl ShowPlayerDialog funkciją naudosiu OnPlayerConncet callback'e. Taigi pradėkime...

Pirmiausia įrašau savo GUI lango norimą ID. Vėliau pasirenku lango tipą - DIALOG_STYLE_MSGBOX. Toliau užrašome norimą tekstą, kuris bus rodomas lango viršuje. Maniškis bus toks - "Serverio taisyklės". Poto užrašome visas taisykles - "Nesukčiauk ir būsi nenubaustas!" ir galiausiai duodame mygtukams pavadinimus - "Sutinku" bei "Nesutinku". Jūsų kodas turėtų būti panašus į manąjį:

public OnPlayerConnect(playerid)
{
    ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,"Serverio taisyklės","Nesukčiauk ir būsi nenubaustas!","Sutinku","Nesutinku");
    return 1;
}

Dabar belieka parašyti kodą, kuris suveiks žaidėjui panaudojus GUI langą, OnDialogResponse callback'e. Visų pirmą patikrinime ar "dialogid" lygus mūsų nustatytam (t.y. ar lygus 0), toliau tikriname, kurį mygtuką žaidėjas paspaudė naudodami "response". Aš padarysiu, jei žaidėjas paspaudė mygtuką "Nesutinku", jis bus išspiriamas iš serverio. Taigi scriptas atrodys štai taip:

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if(dialogid == 0) //Jei dialogid bus lygus 0
    {
        if(!response) //Jei paspaudė mygtuką "Nesutinku"
        {
            Kick(playerid);
        }
        return 1;
    }
    return 0;
}

GUI langas su teksto įvedimo laukeliu

Dabar pabandykime sukurti GUI langą su teksto įvedimo laukeliu. Vėl gi naudosime tą pačią funkciją ShowPlayerDialog. Šį kartą tiesiog perrašykime tą eilutę iš buvusio pavyzdžio ir pakeiskime GUI lango tipą į DIALOG_STYLE_INPUT.

Jūsų kodas turėtų atrodyti taip:

public OnPlayerConnect(playerid)
{
    ShowPlayerDialog(playerid,0,DIALOG_STYLE_INPUT,"Serverio taisyklės","Nesukčiauk ir būsi nenubaustas!","Sutinku","Nesutinku");
    return 1;
}

Telieka sutvarkyti OnDialogResponse callback'ą. Aš jame parašysiu scriptą, kuris atspauzdins žaidėjo įvestą tekstą chatbox'e. Taigi scriptas toks:

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if(dialogid == 0) //Jei dialogid bus lygus 0
    {
        if(response) //Jei paspaudė mygtuką "Sutinku"
        {
            new string[128]; //Sukuriame string'ą
            format(string, 128, "Tu įvedei: %s", inputtext); //Formatuojame string'ą
            SendClientMessage(playerid, GREEN, string); //Nusiunčiame string'ą žinutės pavidalu
        }
        return 1;
    }
    return 0;
}

Pasirinkimų sąrašas GUI lange

Kuriant šį langą, viską ką reikia žinoti yra "\n" simbolis, kuris reiškia naują eilutę. Vėl perrašome ShowPlayerDialog funkciją ir šį kartą GUI lango tipą pakeičiame į DIALOG_STYLE_LIST. Toliau vietoj pagrindinio GUI lango tekstą galime surašyti pasirinkimus. Juos rašant reikia atskirti "\n" simboliu, tarkim "1 pasirinkimas\n2Pasirinkimas\n3Pasirinkimas". Aš pabandysiu padaryti tokius pasirinkimus "Žaisti\nIšeiti".

Kodas turėtų būti toks:

public OnPlayerConnect(playerid)
{
    ShowPlayerDialog(playerid,0,DIALOG_STYLE_LIST,"Serverio taisyklės","Žaisti\nIšeiti","Rinktis","Atgal");
    return 1;
}

Dabar sutvarkome OnDialogResponse callback'ą.

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if(dialogid == 0) //Jei dialogid bus lygus 0
    {
        if(response) //Jei paspaudė mygtuką "Sutinku"
        {
            if(listitem == 0) //Jei pirmas pasirinkimas
            {
                SendClientMessage(playerid, GREEN, "Gero žaidimo!" );
            }
            else if(listitem == 1) //Jei antras pasirinkimas
            {
                Kick(playerid);
            }
        }
        return 1;
    }
    return 0;
}

Papildomi dalykai

GUI limitai:

caption64 simboliai
info2024 simboliai
input box128 simboliai


Jei norėsite uždaryti žaidėjui GUI langą, tiesiog naudokite ShowPlayerDialog ir nustatyikite dialogid į -1. Norint jog kodas esantis OnDialiogResponse callback'e vyktų greičiau, patartina naudoti switch() bei case funkcijas ir jomis išskirti dialogid parametrą.



Blantas

Personal tools