‫Witam ponownie.
‫Teraz mamy ruch dla --, ale nie obracamy tej górnej części --, którą nazywamy
‫wieżyczką.
‫Chcielibyśmy więc móc to zrobić za pomocą naszej myszy.
‫A teraz spójrz, co się tutaj dzieje.
‫Gdy poruszam kursorem myszy po świecie, otrzymuję tę czerwoną kulę.
‫To jest sfera debugowania, którą rysuję w przestrzeni 3D.
‫Teraz zauważ, że kiedy poruszam się pod ścianą, ta kula porusza się na powierzchni ściany.
‫Więc gdziekolwiek porusza się mój kursor myszy, odczuwam strach, który odpowiada dowolnemu obiektowi, w który
‫uderzam, w oparciu o położenie mojego kursora.
‫I to będzie dla nas przydatne, abyśmy mogli mieć miejsce w kosmosie, w którym moglibyśmy obracać
‫naszą wieżę.
‫Teraz, aby to zrobić, potrzebujemy pewnych funkcji na kontrolerze, więc musimy uzyskać dostęp do tych
‫funkcji na kontrolerze.
‫W tym filmie będziemy pracować nad ustawieniem tego i omówimy również, w jaki sposób
‫będzie to obejmować koncepcję znaną jako casting.
‫Powodem, dla którego chcemy kontrolera, jest to, że na kontrolerze znajdują się funkcje, które pozwalają
‫nam uzyskać wynik trafienia pod kursorem.
‫Teraz mówimy o kursorze myszy.
‫Powiedzmy, że to jest nasz ekran, a oto nasz kursor myszy.
‫Punkt na końcu kursora odpowiada miejscu na ekranie.
‫Teraz, jeśli przesuniemy kursor, naszym celem jest, aby część wieży naszego czołgu, ta górna część
‫naszej siatki, obróciła się tak, aby była zwrócona w kierunku tego kursora.
‫Teraz, gdy przesuniemy kursor, na kontrolerze jest funkcja, której możemy użyć, aby uzyskać
‫lokalizację odpowiadającą temu kursorowi.
‫Gdybyśmy mieli narysować linię prosto od kamery w kierunku kursora i trafić w
‫jakiś obiekt na świecie, moglibyśmy uzyskać tę lokalizację i użyć tej lokalizacji do ustawienia obrotu wieży czołgu.
‫Pokażę ci, co mam na myśli.
‫Teraz, aby uzyskać lokalizację trafienia odpowiadającą naszemu kursorowi, musimy użyć kontrolera.
‫Porozmawiajmy teraz przez chwilę o kontrolerze.
‫Powiedzmy, że mamy swojego pionka na świecie.
‫Pionek będzie miał kontrolera.
‫Jest to niewidzialny obiekt powiązany z pionkiem.
‫Teraz dla naszego pionka nasz kontroler będzie miał kontroler gracza typu A i
‫na początku gry kontroler będzie posiadał pionka.
‫Dlatego widzimy z punktu widzenia kamery należącej do naszego pionka.
‫Teraz możemy uzyskać dostęp do tego kontrolera.
‫Nasza klasa czołgów dziedziczy funkcję o nazwie Get Controller.
‫Jest odziedziczony po klasie --.
‫Chcielibyśmy więc przechwycić ten kontroler i zapisać go w zmiennej, abyśmy mogli użyć go do uzyskania
‫dostępu do funkcji, której potrzebujemy, aby uzyskać wynik trafienia pod kursorem.
‫Więc przygotujmy się na to.
‫Teraz jestem tutaj, w klasie czołgów, a miejscem, w którym musimy uzyskać dostęp do naszego kontrolera, jest rozpoczęcie gry.
‫Jeśli zrobimy to w konstruktorze, to jest za wcześnie i możemy nie mieć jeszcze prawidłowego kontrolera.
‫Więc będziemy potrzebować funkcji rozpoczęcia gry w klasie czołgów.
‫Teraz mamy to tutaj w podstawowej klasie ponga i do tej pory tak naprawdę nie używamy rozpoczęcia gry w podstawowej
‫klasie ponga.
‫Więc chciałbym przenieść to do klasy czołgów.
‫Więc zamierzam podkreślić rozpoczęcie gry, włączając komentarz i chronioną sekcję tutaj, i po
‫prostu ją skrócę.
‫A potem z powrotem na etapie czołgu, zamierzam to wkleić.
‫Dodajmy tę chronioną sekcję tutaj, tuż nad sekcją prywatną, z rozpoczęciem gry w środku.
‫Teraz usunęliśmy Rozpocznij grę z pionka podstawowego.
‫Nie mamy go już tutaj, ale musimy go również usunąć z base pond cpp.
‫Oto jest.
‫Możemy iść dalej i usunąć go tutaj, a teraz mamy to zadeklarowane tutaj w Tank H, ale musimy
‫również zdefiniować to w czołgu CPP.
‫Więc zamierzam zdefiniować funkcję tuż pod komponentem wejściowym odtwarzacza konfiguracji.
‫Więc to będzie void rozpocząć grę bez parametrów wejściowych.
‫Jest ciało funkcji i potrzebujemy również zbiornika, który wstępnie ustala nazwę funkcji.
‫Teraz wiemy, że ważne jest, aby sprawdzać bardzo duże w grze.
‫W ten sposób wszystkie funkcje w funkcji begin play i dowolnej z klas nadrzędnych będą nadal
‫wywoływane.
‫Więc tutaj zaczynamy grę.
‫Tutaj możemy pobrać nasz kontroler i przechowywać go w zmiennej.
‫Wróćmy więc do Tanka H i stwórzmy zmienną.
‫Teraz to będzie prywatne i zamierzam umieścić go tutaj na
‫dole sekcji prywatnej i będzie to typ wskaźnika kontrolera gracza i możemy nazwać ten kontroler gracza ref.
‫To będzie nasze odniesienie do kontrolera gracza.
‫Teraz nie mówimy o odwołaniu do C++.
‫To wciąż tylko wskaźnik, ale użyjemy go w odniesieniu do kontrolera gracza.
‫Więc teraz mamy zmienną ref kontrolera odtwarzacza typu A kontroler odtwarzacza i jesteśmy gotowi do przechowywania
‫kontrolera w tym wskaźniku.
‫Wróćmy więc do Tank Dot CP, zacznijmy grać i spróbujmy to zrobić.
‫Więc.
‫Co mam zamiar zrobić, to powiedzieć player, controller, ref równa się i spróbuję wywołać get controller.
‫Teraz pobierz kontroler, jak wspomniałem, znajduje się w klasie --.
‫Kliknij prawym przyciskiem myszy i przejdź do definicji i zauważ, że ta funkcja zwraca kontroler A.
‫Teraz nasza zmienna jest kontrolerem gracza typu A, a nie kontrolerem.
‫Więc to, co próbujemy tutaj zrobić, to pobrać wartość zwracaną z get controller, która jest
‫typem wskaźnika kontrolera i próbujemy zapisać ją we wskaźniku kontrolera odtwarzacza A.
‫Zauważ, że widzimy tutaj czerwoną falistą.
‫Mówi wartość typu.
‫Nie można przypisać wskaźnika kontrolera do jednostki typu.
‫Kontroler gracza.
‫Otrzymujemy błąd.
‫Przyjrzyjmy się tutaj dokumentacji kontrolera.
‫Spójrz.
‫Oto kontroler.
‫I mówi o dziedziczeniu, hierarchii.
‫A pod kontrolerem widzimy kontroler i kontroler gracza.
‫Oznacza to, że kontroler gracza jest klasą podrzędną kontrolera.
‫Teraz w C++ nie możemy mieć wskaźnika typu.
‫Kontroler gracza przechowuje wartość adresu kontrolera A.
‫Kontroler jest typem nadrzędnym.
‫Kontroler gracza jest typem podrzędnym.
‫Nie można wziąć obiektu typu rodzica i przechowywać go we wskaźniku typu podrzędnego.
‫Jak więc obejść ten problem?
‫Oto nasz problem.
‫Funkcja get controller zwraca adres kontrolera A.
‫To jest coś, co moglibyśmy przechowywać we wskaźniku kontrolera A, ale nie możemy tego przechowywać we wskaźniku kontrolera
‫odtwarzacza A.
‫Zabawne jest jednak to, że obiekt zwracany przez kontroler get jest w rzeczywistości kontrolerem gracza.
‫Więc mamy ten adres w postaci wskaźnika kontrolera A i wiemy, że przechowuje on kontroler gracza, ale jeśli
‫mamy go w postaci kontrolera A, nie możemy uzyskać dostępu do potrzebnej funkcji, ponieważ
‫istnieje on na kontrolerze gracza .
‫Funkcja nazywa się get hit hit pod kursorem.
‫Teraz, jeśli mamy wartość wskaźnika kontrolera typu A i próbujemy pobrać tę funkcję, która istnieje na kontrolerze
‫gracza, nie uda nam się tego zrobić.
‫Otrzymamy błąd kompilacji.
‫Ponieważ wiemy, że sam obiekt jest kontrolerem gracza, jest on po prostu przechowywany we wskaźniku kontrolera A.
‫Jak obejść ten problem?
‫Odpowiedź brzmi: musimy rzucić.
‫Wiemy, że kontroler jest klasą nadrzędną, a kontroler gracza jest klasą podrzędną.
‫I wiemy, że nie możemy przechowywać kontrolera A we wskaźniku kontrolera odtwarzacza A.
‫Wiemy, że możemy pójść na odwrót i mieć magazyn wskaźników kontrolera A, obiekt kontrolera
‫gracza.
‫To właśnie widzimy, kiedy wywołujemy get controller, zwraca on wskaźnik kontrolera A, który wskazuje
‫na kontroler gracza A.
‫Więc jeśli mamy wartość wskaźnika kontrolera typu A, możemy użyć specjalnej funkcji zwanej rzutowaniem, aby
‫przekonwertować typ wskaźnika na wskaźnik kontrolera odtwarzacza A.
‫Zatem rzutowanie zmienia typ jednego wskaźnika na inny typ wskaźnika, o ile sam obiekt jest typem, na
‫który próbujemy rzutować.
‫Jeśli na przykład próbowaliśmy rzutować na nieprawidłowy typ, mamy wskaźnik kontrolera A wskazujący na
‫obiekt kontrolera gracza.
‫Jeśli spróbujemy rzutować na znak, funkcja rzutowania zwraca wartość null i mówimy, że rzutowanie nie powiodło
‫się.
‫Więc funkcja rzutowania wygląda tak.
‫Jest to szablon, podobnie jak tworzenie domyślnego podobiektu.
‫Ta funkcja szablonu dostosuje się do wybranego typu iw tej funkcji typ, który przekazujemy, jest również
‫typem, który rzutujemy.
‫Więc przekazujemy ten typ.
‫Chcielibyśmy umieścić dwa w nawiasach ostrych i przekazujemy wskaźnik, który chcielibyśmy umieścić w
‫nawiasach.
‫Oto przykład.
‫Powiedzmy, że chcielibyśmy rzutować na kontroler gracza i wskaźnik typu kontrolera typu A.
‫Wskazujemy wskaźnik do nawiasów, a typ, na który rzutujemy, w nawiasach ostrych.
‫Zwracana jest wartość typu A wskaźnika kontrolera odtwarzacza.
‫Oto wywołanie funkcji, w której przekazujemy typ w nawiasach ostrych, a wartość wskaźnika
‫A kontrolera, którą otrzymujemy z get controller, można umieścić w nawiasach.
‫Musimy więc rzucić tę wartość, którą otrzymujemy z kontrolera get.
‫To będzie twoje wyzwanie.
‫Tak więc w Begin Play użyj funkcji get controller i przekaż tę wartość do funkcji cast i rzutuj
‫na kontroler odtwarzacza.
‫A następnie możesz zapisać wynik w naszym wskaźniku referencyjnym kontrolera odtwarzacza, który jest wskaźnikiem kontrolera odtwarzacza typu
‫A.
‫Wstrzymaj wideo i wykonaj obsadę.
‫Dobra.
‫Więc prawie wykonaliśmy tutaj całą pracę, którą wystarczy obsadzić.
‫Więc zamierzamy wywołać funkcję rzutowania, która ma nawiasy kątowe i nawiasy.
‫A to, co jest w nawiasach, to wartość, którą chcielibyśmy rzucić.
‫Teraz get controller zwraca wskaźnik kontrolera typu A.
‫Przeniosę to tutaj, w nawias.
‫A typ, do którego przesyłamy, to kontroler gracza.
‫Więc znowu bierzemy wartość zwróconą przez get comptroller.
‫Zwraca wskaźnik kontrolera lub adres.
‫Następnie używamy rzutowania, aby przesłać go do kontrolera odtwarzacza A.
‫Wiemy, że obiekt zwracany przez kontroler bramy jest obiektem kontrolera odtwarzacza A przechowywanym we wskaźniku
‫kontrolera A.
‫Więc po rzuceniu tego, co zostanie zwrócone, to wskaźnik kontrolera gracza typu A.
‫Więc przechowujemy to w kontrolerze odtwarzacza ref.
‫Teraz, gdy mamy dostęp do kontrolera w postaci wskaźnika kontrolera odtwarzacza A, możemy uzyskać dostęp do
‫funkcji, której potrzebujemy, aby uzyskać wynik trafienia śledzenia pod kursorem.
‫Podsumowując, użyliśmy get controller, aby uzyskać dostęp do kontrolera.
‫Używamy również funkcji rzutowania do rzutowania ze wskaźnika kontrolera typu A na wskaźnik kontrolera odtwarzacza typu
‫A.
‫Teraz możemy uzyskać dostęp do funkcji, której potrzebujemy, czyli uzyskać wyniki trafień pod kursorem, który istnieje w klasie
‫kontrolera odtwarzacza A.
‫Dlatego zaczniemy używać tej funkcji w następnym filmie.
‫Zobaczymy się wkrótce.