Roblox Wiki
Advertisement

Poradnik ten pokaże w jaki sposób można zbudować drzwi na kod. Jednakże nie jest to jedyne zastosowanie KeyPad'a, ponieważ możecie też zrobić np. atomówkę odpalaną, zatrzymywaną, uzbrajaną i rozbrajaną kodem. Tu jednak zajmiemy się kodem otwierającym drzwi.

Model[]

Na samym początku stwórzmy odpowiedni model. Zróbmy drzwi jako jeden blok i stwórzmy do drzwi ramkę, na której umieścimy keypad. Wszystkie bloki powinny być anchored. Przykład:

Gate1

Klocek, który będzie naszymi drzwiami nazwijmy Door. Drzwi wraz z ramką połączmy w jeden model(group) i nazwijmy go Gate. Teraz stwórzmy model naszego KeyPad'a. Po prost stwórzmy cienki blok i umieśćmy go na ramce drzwi. Na tym cienkim bloku umieśćmy na samej górze również cienki, podłóżny blok. Będzie to nasz wyświetlacz. Pod tym blokiem umieść 12 cienkich, małych bloków. To zaś będą nasze przyciski. 10 z tych przycisków nazwij numerami od zera do dziewięciu, a pozostałe dwa nazwij Clear i OK. Teraz na te przyciski należy nałożyć tekstury. Możesz je sam zauploadować na serwery ROBLOX, ale możesz też użyć darmowych decali. Tak też zrobimy. Otwórz okno Insert>My Models i w zakładce Search z listy wybierz Decals. Poszukajmy numerów, bo to o nie nam chodzi. Wpisz number i wyszukaj. Umieść tekstury na odpowiednich blokach. Powinieneś mieć podobny efekt:

Gate2



Następnie do każdego z dwunastu przycisków utwórz obiekty ClickDetector. Pozwolą one nam sprawdzić, czy gracz wcisnął przycisk.

Teraz połącz wszystkie bloki KeyPad'u w jeden model i nazwij go Keypad i umieść go w modelu Gate. Teraz wewnątrz bloku Display stwórz obiekt typu SurfaceGUI, a w nim utwórz obiekt TextLabel. Obiekty SurfaceGUI służą do wyświetlania na ścianie bloku. Na bloku Display powinno coś Ci się pojawić. Jeżeli kompletnie nic nie widzisz, to zmieniaj parametr Face obiektu SurfaceGUI do czasu aż pojawi Ci się "coś".

To "coś" będzie niemalże niewidoczne. Tym czymś jest obiekt TextLabel odpowiedzialny za wyświetlanie tekstu. Musimy go przeskalować na całą ścianę. W tym celu zmirń jego parametr Size na {1, 0},{1, 0} i wybierz 48 rozmiar czcionki(FontSize). Domyślam się, że nadal nie widzisz tekstu znajdującego się na tym bloku. To dlatego, że SurfaceGUI ma za wysoką rozdzielczość. Zaznacz obiekt SurfaceGUI i edytuj jego parametr CanvasSize. W moim przypadku dobrymi rozmiarami było 200, 100. Tekst powinien stać się teraz widoczny.

Jednak zanim zaczniemy pisać skrypty musimy zrobić jeszcze dwa małe kroki. Chcę, by po wpisanie dobrego kodu wyświetlił się napis "ACCESS APPROVED", a gdy wprowadzony zostanie błędny kod - "ACCESS DENIED". W tym celu nazwij obiekt TextLabel "Code" i zduplikuj go dwa razy. Powstałe dwa obiekty nazwij "Denied" i "Approved". Teraz jeden tekst nachodzi na drugi, a ten na trzeci i widać tylko jeden. Abyś mógł widzieć tylko "Approved" w obiektach "Code" i "Denied" odznacz pole Visible. Zmień parametr Text tego obiektu na "ACCESS APPROVED" i wybierz kolor tekstu(TextColor3) na zielony. Teraz zrób to samo z obiektem Denied, tyle że wpisz "ACCESS DENIED" i ustaw kolor na czerwony. Po tym wszystkim odznacz pola Visible zostawiając widoczny tylko obiekt "Code". Jeszcze tylko wyczyść pole Text obiektu "Code" i utwórz nowy obiekt IntValue w "Keypad" i nazwij go "KeyCode".

Skrypt[]

Nadszedł czas na najtrudniejszą część. Otóż musimy napisać skrypt do naszego modelu. Na początku zdobądźmy dostęp do naszego hasła:

KeyCode = script.Parent:FindFirstChild("KeyCode");

Utwórzmy jeszcze zmienną globalną, w której przechowywany będzie wpisywany kod. Niech nil będzie jej wartością początkową:

DynCode = nil;

Musimy jeszcze zrobić bardzo żmudną rzecz. Musimy stworzyć zmienne wskazujące na każdy z obiektów wykrywających naciśnięcie myszą. Wszystkie te obiekty umieśćmy w tablicy. Elementy 1-9 będą oznaczały odpowiadające im liczby, element 10 to 0, a element 11 to OK, a 12 to Clear:

button = {
    script.Parent:FindFirstChild("1"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("2"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("3"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("4"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("5"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("6"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("7"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("8"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("9"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("0"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("OK"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("Clear"):FindFirstChild("ClickDetector"),
}

Oraz wskażmy na nasze drzwi oraz na:

Door = script.Parent.Parent:FindFirstChild("Drzwi");

Oraz na obiekty tektów na wyświetlaczu:

Approved = script.Parent:FindFirstChild("Display"):FindFirstChild("SurfaceGui"):FindFirstChild("Approved");
Code = script.Parent:FindFirstChild("Display"):FindFirstChild("SurfaceGui"):FindFirstChild("Code");
Denied = script.Parent:FindFirstChild("Display"):FindFirstChild("SurfaceGui"):FindFirstChild("Denied");

Teraz napiszmy funkcję, która będzie wpisywała na koniec zmiennej z kodem cyfrę wprowadzoną jako argument:

 function addDigit(digit)
    
        if DynCode == nil then
            DynCode = digit;--jezeli wpisywany kod jest pusty, to wpisywana cyfra jest cala liczba
        else
            DynCode = DynCode * 10 + digit;
            --[[jezeli kod ma wartosc, to zostaje ona pomnozona przez 10 czego skutkiem jest
                  przesuniecie liczby w lewo i dodanie na koncu zera. W miejsce zera dodajemy
                 nowa cyfre
             --]]
        end
    
end

Napiszmy dwie funkcje, które będą odpowiadały na reakcje. Funkcja correct zostanie wywołana, gdy kod będzie poprawny. Spowoduje ona wyświetlenie tekstu Approved i zniknięcie reszty oraz wyłączenie kolizji i zmianę przezroczystości. Po określonym czasie(tu 4 sekundy) wszystko wróci do normy, a wpisany kod zostanie wyczyszczony:

 function correct()
    Approved.Visible=true;
    Code.Visible=false;
    Denied.Visible=false;
    Door.CanCollide=false;
    Door.Transparency = 0.4;
    wait(4);
    Approved.Visible=false;
    Code.Visible=true;
    Door.CanCollide=true;
    Door.Transparency = 0;
    DynCode=nil;
end

Funkcja incorrect spowoduje wypisanie na trzy sekundy tekstu Denied oraz wyczyszczenie kodu:

 function incorrect()
    Approved.Visible=false;
    Code.Visible=false;
    Denied.Visible=true;
    wait(3);
    Code.Visible=true;
    Denied.Visible=false;
    DynCode=nil;
end

Przejdźmy do głównego działanie skryptu. Będzie to zestaw reakcji na wciśnięcia przycisków. A więc zacznijmy od reakcji na cyfry:

button[1].MouseClick:connect(function()addDigit(1); end);
button[2].MouseClick:connect(function()addDigit(2); end);
button[3].MouseClick:connect(function()addDigit(3); end);
button[4].MouseClick:connect(function()addDigit(4); end);
button[5].MouseClick:connect(function()addDigit(5); end);
button[6].MouseClick:connect(function()addDigit(6); end);
button[7].MouseClick:connect(function()addDigit(7); end);
button[8].MouseClick:connect(function()addDigit(8); end);
button[9].MouseClick:connect(function()addDigit(9); end);
button[10].MouseClick:connect(function()addDigit(0); end);

Oraz na przyciski funkcyjne:

button[12].MouseClick:connect(function()DynCode=nil; end);

button[11].MouseClick:connect(function()
    if KeyCode.Value == DynCode then
        correct();
    else
        incorrect();
    end
end);

Na końcu stwórzmy pętlę, która co 0.1 sekundy będzie odświeżała tekst na wyświetlaczu. Trzeba jednak dodać, że string nie może przyjąć wartości nil. Dlatego też trzeba rozważyć możliwość o jego wystąpieniu i w takim wypadku wypisać pusty tekst:

while true do
    wait(0.1);
    if DynCode==nil then
        Code.Text="";
    else
        Code.Text=DynCode;
    end
end

Cały skrypt[]

KeyCode = script.Parent:FindFirstChild("KeyCode");
DynCode = nil;
button = {
    script.Parent:FindFirstChild("1"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("2"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("3"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("4"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("5"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("6"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("7"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("8"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("9"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("0"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("OK"):FindFirstChild("ClickDetector"),
    script.Parent:FindFirstChild("Clear"):FindFirstChild("ClickDetector"),
}
Door = script.Parent.Parent:FindFirstChild("Drzwi");
Approved = script.Parent:FindFirstChild("Display"):FindFirstChild("SurfaceGui"):FindFirstChild("Approved");
Code = script.Parent:FindFirstChild("Display"):FindFirstChild("SurfaceGui"):FindFirstChild("Code");
Denied = script.Parent:FindFirstChild("Display"):FindFirstChild("SurfaceGui"):FindFirstChild("Denied");
ableToInput = true;


function addDigit(digit)
    if ableToInput == true then
        if DynCode == nil then
            DynCode = digit;--jezeli wpisywany kod jest pusty, to wpisywana cyfra jest cala liczba
        else
            DynCode = DynCode * 10 + digit;
            --[[jezeli kod ma wartosc, to zostaje ona pomnozona przez 10 czego skutkiem jest
                 przesuniecie liczby w lewo i dodanie na koncu zera. W miejsce zera dodajemy
                nowa cyfre
            --]]
        end
    end
end

function correct()
    Approved.Visible=true;
    Code.Visible=false;
    Denied.Visible=false;
    Door.CanCollide=false;
    Door.Transparency = 0.4;
    wait(4);
    Approved.Visible=false;
    Code.Visible=true;
    Door.CanCollide=true;
    Door.Transparency = 0;
    DynCode=nil;
end

function incorrect()
    Approved.Visible=false;
    Code.Visible=false;
    Denied.Visible=true;
    wait(3);
    Code.Visible=true;
    Denied.Visible=false;
    DynCode=nil;
end

button[1].MouseClick:connect(function()addDigit(1); end);
button[2].MouseClick:connect(function()addDigit(2); end);
button[3].MouseClick:connect(function()addDigit(3); end);
button[4].MouseClick:connect(function()addDigit(4); end);
button[5].MouseClick:connect(function()addDigit(5); end);
button[6].MouseClick:connect(function()addDigit(6); end);
button[7].MouseClick:connect(function()addDigit(7); end);
button[8].MouseClick:connect(function()addDigit(8); end);
button[9].MouseClick:connect(function()addDigit(9); end);
button[10].MouseClick:connect(function()addDigit(0); end);
button[12].MouseClick:connect(function()DynCode=nil; end);

button[11].MouseClick:connect(function()
    if KeyCode.Value == DynCode then
        correct();
    else
        incorrect();
    end
end);
while true do
    wait(0.1);
    if DynCode==nil then
        Code.Text="";
    else
        Code.Text=DynCode;
    end
end
Advertisement