‫Witam ponownie.
‫Teraz jesteśmy gotowi do rozpoczęcia obsługi danych wprowadzanych przez użytkownika.
‫Oznacza to, że chcielibyśmy naciskać klawisze na klawiaturze, poruszać myszą i klikać myszką, aby zobaczyć, jak nasz
‫czołg reaguje na to wejście.
‫Teraz, aby to zrobić, najpierw musimy faktycznie uzyskać dane wejściowe i najpierw zaczniemy to
‫robić za pomocą mapowania osi.
‫Porozmawiajmy więc o tym.
‫Teraz w projekcie przejdźmy do edycji i ustawień projektu.
‫A jeśli przewiniemy w dół i wybierzemy dane wejściowe, zobaczymy tutaj nasze powiązania.
‫A pod wiązaniami znajdują się mapowania akcji i mapowania osi.
‫Najpierw zajmiemy się odwzorowaniami osi.
‫Teraz możesz mieć z nimi pewne doświadczenie, ale zamierzamy trochę głębiej zagłębić się w to,
‫co one robią i jak działają.
‫Więc mamy ich trzy.
‫A jeśli kliknę strzałkę w dół, zobaczę tutaj W i SW, a te mówią o klawiszach W
‫i SW na klawiaturze.
‫Są one przypisane do tego konkretnego odwzorowania osi, które nazywa się Przesuń do przodu.
‫Omówmy więc, jak działa to mapowanie osi.
‫Widzieliśmy więc w The Unreal Editor, że mamy to mapowanie osi o nazwie Move Forward i ma
‫przypisane W i SCS do tego mapowania osi.
‫Więc co to dokładnie oznacza?
‫Cóż, w Unreal Engine mamy coś, co nazywa się mapowaniem osi.
‫A mapowanie osi to coś, co jest przetwarzane w każdej klatce gry.
‫Przypisujesz klawisze do mapowania osi.
‫W naszym przypadku przypisaliśmy W i S.
‫Teraz spójrz obok klawisza W tutaj.
‫W mojej małej próbce zrzutu ekranu po prawej stronie jest napisane skala.
‫A obok skali jest numer 1. 0.
‫Być może zauważyłeś, że obok SQ skala wynosi -1. 0.
‫Są to więc wartości, które wpłyną na te informacje wejściowe.
‫Oto jak działa mapowanie osi.
‫Nasz ruch do przodu mapowania osi ma możliwość powiązania z funkcją w C++.
‫Teraz, jeśli chodzi o mapowanie osi, jeśli skojarzymy funkcję z mapowaniem osi, musi ona pobrać
‫parametr wejściowy typu float, abyśmy mogli utworzyć funkcję w naszym stawie o nazwie MOVE, która pobiera wartość
‫zmiennoprzecinkową.
‫Po prostu nazwiemy tę wartość parametru wejściowego.
‫Teraz jest sposób, aby wziąć tę funkcję i powiązać ją z naszym mapowaniem osi ruchu do przodu.
‫Powiedział, że wiążemy funkcję move z mapowaniem osi.
‫Tak więc w każdej klatce gry system wprowadzania danych Unreal Engine będzie sprawdzał, czy naciskamy
‫klawisz W, czy klawisz.
‫I obliczy wartość osi w zależności od tego, czy naciskamy te klawisze i każdą pojedynczą
‫klatkę.
‫Wywoła on tę funkcję, którą zobowiązaliśmy się przesunąć do przodu i przekazać tę wartość osi.
‫Cokolwiek dzieje się wewnątrz tej funkcji, zależy od nas jako programisty C++.
‫Oto jak to działa.
‫Jeśli nie naciskamy W ani klawiszy, ta wartość osi ma wartość zero.
‫Tak więc funkcja move, która jest powiązana z odwzorowaniem osi ruchu do przodu, jest wywoływana co pojedynczą
‫ramkę, a przekazywana wartość zmiennoprzecinkowa wynosi zero.
‫Załóżmy teraz, że naciskamy klawisz W.
‫Klawisz W ma skalę ustawioną na 1. 0.
‫Oznacza to, że nasza wartość osi będzie wynosić 1. 0 i to jest przekazywane do funkcji MOV.
‫Tak więc w każdej pojedynczej klatce funkcja move jest wywoływana z wartością 1. Zdano 0.
‫Teraz powiedzmy, że zamiast tego wciskamy SRC, który ma wartość skali -1. 0.
‫Oznacza to, że w każdej klatce zostanie wywołana funkcja move i -1. 0 zostanie przekazane.
‫Teraz w przypadku, gdy naciskamy zarówno W, jak i S, obie te wartości są sumowane.
‫Więc otrzymujemy 1. 0 od wciśnięcia klawisza W i otrzymujemy -1. 0 od naciśnięcia SRC.
‫Teraz oba znoszą się nawzajem.
‫Więc jeśli naciśniemy oba w tym samym czasie, funkcja move zostanie wywołana z podaniem zera.
‫Więc w zależności od tego, którą kombinację klawiszy wciśniemy, otrzymamy inną wartość przekazaną do
‫naszej funkcji MOVE i możemy zrobić z tą wartością, co chcemy, na przykład użyć jej do przesunięcia pionka.
‫Niedługo porozmawiamy o faktycznym przesunięciu pionka.
‫Na razie po prostu popracujmy nad właściwym ustawieniem, abyśmy mogli obsłużyć te informacje z
‫systemu mapowania osi.
‫Okej, więc teraz, gdy wiemy, jak działa mapowanie osi, nadszedł czas, aby utworzyć funkcję zwrotną, którą
‫możemy powiązać z mapowaniem osi ruchu do przodu.
‫Więc zamknę ustawienia projektu i wskoczę z powrotem do kodu VS.
‫Więc tutaj, w kodzie VS, chcielibyśmy stworzyć funkcję, którą możemy powiązać z mapowaniem osi ruchu do przodu.
‫Więc tutaj w zbiorniku H możemy stworzyć prywatną funkcję.
‫Teraz będzie mieć.
‫Typ void return, który chciałbym nazwać tym ruchem.
‫Teraz musi mieć parametr wejściowy zmiennoprzecinkowy i zamierzamy wywołać tę wartość.
‫Weźmy więc naszą funkcję move i zdefiniujmy ją tutaj w Tank.
‫CP Wkleję to tutaj tuż pod konstruktorem i potrzebujemy zbiornika z operatorem rozpoznawania zakresu
‫przed nazwą funkcji.
‫Mamy więc tę funkcję move i jesteśmy gotowi do powiązania jej z mapowaniem osi ruchu do przodu.
‫Odbywa się to w funkcji zwanej setup player input component.
‫To powinno brzmieć znajomo.
‫W rzeczywistości, jeśli otworzymy nasz eksplorator i wrócimy do Base Pont H, możemy przewinąć w dół i zobaczyć
‫w sekcji publicznej komponent wejściowy konfiguracji funkcji odtwarzacza.
‫Zobaczymy, że jest to nadpisanie dziedziczonej funkcji wirtualnej.
‫Teraz podstawowa klasa odradzania tak naprawdę nie musi konfigurować żadnych danych wejściowych i właśnie do tego służy ta
‫funkcja do obsługi danych wejściowych od gracza.
‫Teraz nasza podstawowa klasa obligacji nie musi obsługiwać danych wejściowych, ale nasza klasa czołgów tak.
‫Więc co możemy zrobić, to wyjąć tę funkcję ze stawu bazowego h, ale zamierzam to skopiować, ponieważ potrzebujemy jej
‫w zbiorniku.
‫Więc kopiując tę funkcję, przejdę do Tank H i tutaj w sekcji publicznej zamierzam ją
‫wkleić.
‫A ponieważ nie potrzebujemy go w stawie podstawowym, po prostu usunę go z klasy stawu podstawowego.
‫I faktycznie zamierzam wejść do stawu bazowego CP i usunąć go również stąd.
‫Więc chodźmy dalej i usuń komponent wejściowy odtwarzacza konfiguracji z Base Pond.
‫CP A teraz nie ma go już w klasie stawu podstawowego.
‫Więc chodźmy dalej i zapiszmy nasze zmiany i zamknij bazę Pond H i CP.
‫A teraz mamy konfiguracyjny komponent wejściowy gracza zadeklarowany w Tank H, ale chcemy również go zdefiniować i zbiornik.
‫CP Więc tutaj w Tanku.
‫CP Dodam definicję tuż nad funkcją move.
‫Więc to jest nieważne i jest to element wejściowy gracza w konfiguracji czołgu.
‫Wróćmy teraz do Tank H i zobaczmy, jaki jest typ parametru wejściowego.
‫Zobaczysz, że jest to zadeklarowane do przodu w nawiasach.
‫To jest coś, co możesz zrobić, jeśli chcesz przekazać dalej, zadeklarować typ klasy w pliku nagłówkowym.
‫Więc to jest tutaj zadeklarowane do przodu i potrzebujemy tego, aby wprowadzić typ wskaźnika komponentu, a parametr nazywa
‫się komponentem wejściowym odtwarzacza.
‫Więc potrzebujemy tego parametru wejściowego w zbiorniku.
‫CP Tak więc w nawiasach dla komponentu wejściowego odtwarzacza, będziemy mieć komponent wejściowy U,
‫który jest wskaźnikiem i nazywa się komponentem wejściowym odtwarzacza.
‫Więc teraz podpis funkcji pasuje do tej w deklaracji funkcji.
‫Teraz z powrotem w pliku CP, nadajmy tej funkcji treść funkcji i nadpisujemy
‫tę funkcję. Dobrym pomysłem jest wywołanie komponentu wejściowego odtwarzacza superkonfiguracji.
‫Teraz, ponieważ wywołujemy nadrzędną wersję komponentu wejściowego odtwarzacza konfiguracji, musimy przekazać dane wejściowe typu,
‫które określasz jako komponent wejściowy.
‫Przekażemy tutaj parametr wejściowy do tej funkcji.
‫W ten sposób klasa nadrzędna wywoła swoją wersję.
‫Teraz zbiornik podstawowy nie realizuje tej funkcji.
‫Właśnie go usunęliśmy.
‫Ale klasa nadrzędna do bazy -- wywoła jej wersję.
‫I za każdym razem, gdy zastępujesz taką funkcję wirtualną, dobrym pomysłem jest wywołanie wersji super.
‫Nie brakuje więc żadnej funkcjonalności zaimplementowanej w wersji nadrzędnej.
‫Więc dlaczego to robimy?
‫Do czego służy komponent wejściowy odtwarzacza konfiguracji?
‫Cóż, jedną z rzeczy, do których jest dobry, jest wiązanie funkcji z mapowaniami dostępu.
‫Chcielibyśmy powiązać naszą funkcję ruchu z mapowaniem osi ruchu do przodu.
‫I robimy to tutaj.
‫Robimy to za pomocą tego komponentu wejściowego odtwarzacza z parametrami wejściowymi.
‫Po to właśnie ten obiekt jest przeznaczony.
‫Bierzemy komponent wejściowy odtwarzacza i na tym wskaźniku używamy operatora strzałki, aby uzyskać dostęp do funkcji
‫zwanej osią powiązania.
‫Teraz Bind Axis przyjmuje kilka parametrów wejściowych.
‫Pierwszy to literał ciągu, co oznacza, że użyjemy makra tekstowego.
‫Co teraz umieścimy w cudzysłowie?
‫Wstawiamy nazwę odwzorowania osi.
‫Widzieliśmy w edytorze, że to mapowanie osi nazywa się przesuń do przodu.
‫Więc wybieramy to mapowanie osi do powiązania z drugim parametrem wejściowym.
‫Będzie to wskaźnik do obiektu, w którym powiązanie funkcji dla tego jest wskaźnikiem do
‫instancji określonej klasy, gdzie n, a ponieważ jesteśmy w klasie czołgów, wskaże to na
‫instancję pionka czołgu w gra.
‫Teraz trzeci parametr to adres funkcji, którą łączymy.
‫Więc mamy ruch czołgu.
‫Bardzo ważne, że musimy w pełni.
‫Zakwalifikuj nazwę funkcji nazwą klasy.
‫A tutaj, przed nazwą funkcji, potrzebujemy adresu operatora.
‫Teraz, jeśli nie jesteś zaznajomiony z robieniem czegoś takiego, jest to po prostu pobieranie
‫adresu funkcji.
‫Funkcje mogą mieć adresy, tak jak zmienne.
‫Tak więc użycie adresu operatora jest sposobem na przekazywanie funkcji do innych funkcji.
‫Dlatego potrzebujemy tego adresu operatora.
‫Więc mamy nasze wywołanie funkcji do powiązania dostępu.
‫Teraz prawdopodobnie zauważasz, że wskaźnik błędu IntelliSense wskazujący na niekompletny typ klasy, w którym wprowadzany składnik
‫jest niedozwolony.
‫Teraz wiemy, co może to spowodować.
‫Po pierwsze, może to oznaczać, że musimy dołączyć plik nagłówkowy.
‫Inną możliwością jest to, że jest to fałszywy błąd.
‫Możesz łatwo się dowiedzieć, kompilując, więc spróbujmy skompilować.
‫Zobaczymy, że mamy udaną kompilację.
‫Więc wiemy, że to fałszywy błąd.
‫Ale znowu, jeśli chcesz, możesz dodać dołączenie, aby to usunąć.
‫Więc to ci nie przeszkadza.
‫Teraz wiemy, że typ klasy, na który narzeka, to komponent wejściowy.
‫Więc tutaj masz komponent wejściowy w dokumentacji, a oto dołączanie.
‫A jeśli dodamy to tutaj na górze pliku CP czołgu, pozbędziemy się tego nieznośnego fałszywego błędu.
‫I znowu, ponieważ pragya chce, aby zawierały osłony, wiemy, że komponenty wejściowe nie zostaną uwzględnione
‫więcej niż raz, a więc zawijasy, których już nie ma.
‫Więc teraz wiemy, że ta funkcja przenoszenia będzie nazywana każdą klatką, a wartość będzie miała określoną
‫wartość zmiennoprzecinkową w zależności od tego, czy naciskamy W, czy pytamy.
‫Teraz sama wiedza, że funkcja move musi poruszać się do przodu, nie wystarczy.
‫Jako programiści miło jest mieć jakieś potwierdzenie, że wszystko działa.
‫Więc to, co chciałbym, abyś zrobił jako twoje wyzwanie, to użycie dziennika YUI w funkcji MOV, aby wydrukować wartość,
‫która jest przekazywana do move tego zmiennoprzecinkowego o nazwie value.
‫Więc użyj procentu f w logu uiy, aby zapisać wartość wartości float w logu wyjściowym, a następnie zagraj w test gry i
‫naciśnij te klawisze i zobacz, co zostanie wydrukowane w logu.
‫Zatrzymaj wideo i dodaj to teraz do funkcji przenoszenia.
‫Dobra.
‫Więc tutaj, w funkcji mov, dodam dziennik uii.
‫I to może być ostrzeżenie o temp. dziennika.
‫I dla makra tekstowego.
‫Po prostu wstawię wartość procentową F i wartość.
‫Teraz w porządku.
‫Jeśli użyłeś innego typu gadatliwości lub ostrzeżenia, jeśli wiesz, jak to zrobić.
‫W porządku.
‫Użyję tutaj tylko ostrzeżenia i wiem, że użyłeś rzeczy takich jak procent se i sformatowałeś
‫swój dziennik wartością ciągu.
‫Procent F, jeśli nie jesteś świadomy, to sposób formatowania dziennika interfejsu użytkownika za pomocą wartości zmiennoprzecinkowej.
‫Więc skompilujmy to i wróćmy do edytora, otworzę dziennik wyjściowy, nacisnę play i sprawdzę,
‫gdzie spamuje dziennik wyjściowy niezliczonymi wiadomościami.
‫Teraz kliknę w rzutnię i nacisnę klawisz W.
‫Oto moja wartość jednego, który zamierzam uwolnić.
‫Wrócił do zera.
‫Zamierzam nacisnąć klawisz i jest ujemny.
‫A jeśli naciśniemy oba jednocześnie, otrzymamy zero.
‫A więc jest dokładnie tak, jak się spodziewaliśmy.
‫Idealny.
‫W porządku.
‫W tym filmie przygotowaliśmy nasz staw do obsługi niektórych danych wejściowych użytkownika.
‫Rozmawialiśmy o mapowaniach dostępu i powiązaliśmy naszą funkcję move z mapowaniem dostępu move forward.
‫Następnie wydrukowaliśmy tę wartość dostępu za pomocą dziennika YUI w naszej funkcji MOVE, ale w rzeczywistości wolelibyśmy przenieść nasz
‫zbiornik, zamiast po prostu drukować niektóre wartości w dzienniku wyjściowym.
‫Tak więc w przyszłych wykładach ustawimy to tak, abyśmy mogli zacząć ruszać naszym czołgiem.
‫Zobaczymy się wkrótce.