Šioje temoje bus peržvelgiami įvairūs lentelių ypatumai, jų tvarkymo būdai ir tipai.
Turinys
- Tipai
- Sąrašas
- Lygiuotas sąrašas
- Lygiuotas sąrašas su antraštėmis
- Informacija
- Įvedamas tekstas
- Slaptažodis
- Sąrašas
- Tvarkymo būdai
- ID rašymas
- Define pagalba
- Y_inline biblioteka
1. Tipai
SAMP mums suteikia keturis lentelių tipus, du iš jų skirti įvedinėti tekstui.
1.1 Sąrašas
DIALOG_STYLE_LIST
Kaip pavadinimas ir rodo, šis stilius skirtas sąrašams su pasirenkamais variantais. Tarkime parodom tokią lentelę žaidėjui:
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_LIST, "Vaisiai", "Kriaušės\nObuoliai\nBananai", "Imu", "Išeiti");
Atkreipkit dėmesį į simbolius "\n", jis reiškią naują eilutę, todėl visos trys vaisių rūšys bus skirtingose eilutėse. Gerai, kyla klausimas: kaip žinoti kurį vaisių jis pasirinko?
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == 1)
{
if(!response) // Jei žaidėjas pasirinko mygtuką "Išeiti", nieko nebedarom ir grąžinam 1.
return 1;
// Parametras "listitem" yra pasirinkto elemento numeris. Jie prasideda nuo nulio.
// Kriaušės - 0
// Obuoliai - 1
// Bananai - 2
new kaina, string[70];
// Pagal tai ką pasirinko, nustakime kainą.
switch(listitem)
{
case 0: kaina = 5;
case 1: kaina = 3;
case 2: kaina = 7;
}
GivePlayerMoney(playerid, -kaina);
// Manau norėtųsi žinoti kaip vadinas pasirinktas elementas. Žinoma mes dabar žinome kas buvo sąraše,
// Nes jį kūrėme šalia. Bet yra atvejų kai mums reikia prekės pavadinimo. Būtent tas pavadinimas bus "inputtext" parametre.
format(string, sizeof(string), "Nusipirkote prekę '%s' ir sumokėjote %d", inputtext, kaina);
SendClientMessage(playerid, -1, string);
return 1;
}
return 0;
}
Štai ir viskas ką reikia žinoti su šiuo stiliumi, kad būtų galima lengvai kurti lenteles.
1.2 Lygiuotas sąrašas
Šis lentelių tipas buvo pridėtas 0.3.7 versijoje!
Šis tipas atitinka sąrašo tipą ir skiriasi tik tuo jog elementai jame bus teisingai sulygiuoti. Norint atskirti stulpelius, naudojamas "tab" simbolis "\t".
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_TABLIST, "Vaisiai", "Kriaušės\t10LT\nObuoliai\t10LT\nBananai\t5LT", "Imu", "Išeiti");
1.3 Lygiuotas sąrašas su antraštėmis.
Šis lentelių tipas buvo pridėtas 0.3.7 versijoje!
Šis tipas yra dar viena sąrašo versija. Jame taip pat naudojamas lygiavimas kaip TABLIST stiliaus, tačiau naudojant šį tipą galima pridėti ir stulpelių pavadinimus kurių pasirinkti neįmanoma:
1.4 Informacija
DIALOG_STYLE_MSGBOX
Šis stilius yra ko gero pats paprasčiausias. Jis skirtas tik parodyti informaciją, jokių ypatumų neturi.
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_MSGBOX, "Informacija", "Tekstas\nČia irgi galimos naujos eilutės.", "Gerai", "");
Neįprasta yra tik tai, kad antro mygtuko gali nebūti, t.y. jei paliksite paskutinį parametrą tuščia, antras mygtukas nebus rodomas.
1.5 Įvedamas tekstas
DIALOG_STYLE_INPUT
Abi, LIST ir MSGBOX, stiliaus lentelės buvo skirtos rodyti tekstą žaiėjui ar leisti pasirinkti. Šis stilius prideda daugiau laisvės, žaidėjas gali įrašyti visiškai bet kokį tekstą. Tačiau jo limitas yra 128 simboliai.
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Klausimas", "Įveskite savo elektroninį pašto adresą:", "Tęsti", "Išeiti");
Tai parodys lentelę, prie kurios įvedimo lauko bus parašyta "Įveskite savo eletroninį pašto adresą".
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == 1)
{
if(!reponse) // Jei žaidėjas pasirinko mygtuką "Išeiti", nieko nebedarom ir grąžinam 1.
return 1;
// Šiuo atveju, "inputtext" bus viskas ką žaidėjas įvedė į lentelę.
// Tai yra string tipo kintamasis.
new string[148];
format(string, sizeof(string), "Jūsų el paštas: %s", inputtext);
SendClientMessage(playerid, -1, string);
return 1;
}
return 0;
}
Žinoma įvedinėjant tokius dalykus kaip elektroninį paštą reikėtų tikrint ką žaidėjas įvedė, jei išvis ką nors įvedė. Bet dėl paprastumo, šį kartą to nedarau. Rašant realų kodą visada reikėtų tikrinti ką žaidėja įvedė.
1.6 Slaptažodis
DIALOG_STYLE_PASSWORD
Šis stilius yra labai panašus į STYLE_INPUT, tiesą sakant jie turi tik vieną skirtumą. Viskas ką žaidėjas įrašo į šią lentelę, jam bus nerodoma. Viskas bus pakeista į vienodus simbolius.
Kaip pavadinimas ir rodo, šis stilius naudojamas saugomiems duomenims kaip slaptažodžiai.
2. Tvarkymo būdai
Rašant modifikacija prisikaupie nemažai lentelių, kadangi jos tvarkomos kitur(OndialogResponse), nei rodomos jas atskiriame pagal ID. Žinoma žmogui sunku įsiminti tiek daug skaičių, todėl yra keli variantai kaip supaprastinti jų skyrimą.
2.1 ID rašymas
Šis būdas yra ko gero blogiausias, bet ir populiariausias. Aprašau jį tik tam kad būtų galima palyginti su kitais. Jo esmė visur naudoti skaičius, tai yra ir ShowPlayerDialog ir OnDialogResponse tiesiog rašyti skaičių, kaip buvo daroma šioje pamokoje. Tai atrodo elementaru, kai turime vieną lentelę... O kai jų bus 100, ar 1000? Ar galėsite žiūrėdami į skaičius OnDialogResponse atsiminti kuri lentelė kam skirta? O jeigu reikės pakeisti ID ar surasti laisvą?
Šis būdas realiai neturi nei vieno privalumo, tik tai kad reikalaja mažiausiai pastangų.
2.2 Define pagalba
Tai yra lengva alternatyva pirmajam būdui, reikalaujanti minimalių pastangų. Jos principas visų lentelių ID aprašyti vienoje vietoje define pagalba. PVZ:
#define DIALOG_VAISIAI 1
#define DIALOG_REGISTRACIJA 2
#define DIALOG_PRISIJUNGIMAS 3
#define DIALOG_EL_PASTAS 4
ShowPlayerDialog(playerid, DIALOG_VAISIAI, DIALOG_STYLE_LIST, ...);
public OnDialogresponse(playerid, dialogid, resopnse, listitem, inputtext[])
{
if(dialogid == DIALOG_VAISIAI)
{
return 1;
}
return 0;
}
Matomi keli privalumai. Pirmiausia ID me rašysime tik vieną kartą. Antras privalumas, kad vietoj skaičių naudojame žodžius, kurie mums padeda suprasti kam ta lentelė skirta. Įprasta šiuos define pradėti su "DIALOG_" kad žinotumėt jog tai yra lentelė.
2.3 Y_inline biblioteka
Ši biblioteka yra YSI dalis ir ją parsisiųsti galima iš čia
Ši biblioteka padaro daug daugiau nei tik palengvina ID sekimą... Ją naudojant ID net nelieka, bet be to ji panaikian ir OnDialogResponse prasmę. Visas lenteles galima tvarkyti ten pat kur jas ir parodėte, tačiau kai jų daug vienoje vietoje kodas gali atrodyti nepatogus.
inline Response(pid, dialogid, response, listitem, string:inputtext[])
{
#pragma unused pid, dialogid, response, listitem, inputtext
return 1;
}
Dialog_ShowCallback(playerid, using inline Response, DIALOG_STYLE_MSGBOX, "Informacija", "Paprasta GUI lentele", "Gerai", "");
inline funkcija visada turi būti PRIEŠ Dialog_ShowCallback. Kaip žinome OnDialogResponse turi "playerid" parametrą, todėl kad nebūtų problemų čia jį pervadinome į "pid", kadangi dviejų kintamųjų su tuo pačiu pavadinimu būti negali. Be to, nepanaudos kintamųjų iš inline funkcijos, gausite "symbol x is never used" įspėjimą, juos pašaliname su #pragma direktyvu.
Dar vienas didelis privalumas y_inline yra tai jog inline funkcijoje galima naudoti kintamuosius iš funkcijos kurioje ji yra. PVZ:
public OnPlayerSpawn(playerid)
{
new skaicius = 124;
inline Response(pid, dialogid, response, listitem, string:inputtext[])
{
#pragma unused pid, dialogid, response, listitem, inputtext
printf("Skaicius yra %d", skaicius);
return 1;
}
Dialog_ShowCallback(playerid, using inline Response, DIALOG_STYLE_MSGBOX, "Informacija", "Paprasta GUI lentele", "Gerai", "");
}
Kol kas tiek. Jei manote kad praleidau kokią dalį svarbią šia tema, rašykite.
Pamoka bus tobulinama.
Padėkos
Arvydas - už gramatinę klaidą.