Jestem nowy w libgdx i odkrywam, że ogłuszają mnie najprostsze rzeczy. Wydaje się, że chcę, abym robił rzeczy w określony sposób, ale dokumentacja nie mówi mi, co to jest.
Chcę stworzyć bardzo prostą grę 2D, w której gracz kontroluje statek kosmiczny. Kółko myszy będzie powiększać i pomniejszać, a informacje i elementy sterujące są wyświetlane na ekranie.
Ale nie mogę sprawić, by kółko myszy NIE powiększało interfejsu użytkownika. Próbowałem daremnie z matrycami projekcyjnymi pomiędzy nimi
Oto mój (aktualny) kod:
public class PlayStage extends Stage {
...
public void draw() {
// tell the camera to update its matrices.
camera.update();
// tell the SpriteBatch to render in the
// coordinate system specified by the camera.
spriteBatch.setProjectionMatrix(camera.combined);
spriteBatch.begin();
aButton.draw(spriteBatch, 1F);
playerShip.draw(spriteBatch, 1F);
spriteBatch.end();
}
}
Camera.zoom ustawia się za pomocą przewijania (liczba całkowita).
Próbowałem około tuzina wariantów zmiany matrycy projekcji kamery po narysowaniu przycisku, ale przed wypłynięciem statku, ale bez względu na to, co robię, to samo dzieje się zarówno z przyciskiem, jak i ze statkiem. Więc:
Jaki jest typowy sposób implementacji interfejsu użytkownika libgdx na ekranie, który nie jest transformowany przez matrycę / powiększenie kamery?
camera.project(Vector3 screenCoords)
do projekcji czegoś od współrzędnych świata do ekranów przewodów.Odpowiedzi:
Możesz po prostu użyć innego SpriteBatch bez ustawiania macierzy projekcji, aby narysować HUD,
źródło
Myślę, że najłatwiejszym sposobem na stworzenie mapy hud byłoby użycie drugiej kamery i nałożenie ich na siebie. Ten problem był omawiany na forach libgdx jakiś czas temu i pamiętam, że ktoś tam opublikował swój kod. Możesz zajrzeć tam i zobaczyć, co wymyślisz.
źródło
Oto metoda, której używam do pracy z jedną partią:
Najpierw narysuj wszystko inne, a następnie narysuj HUD na końcu:
Jeśli chcesz narysować więcej po, pamiętaj, aby zresetować matrycę projekcji do tego, co musi być.
źródło
.cpu()
za każdym razem tworzy nową macierz). Lepiej mieć stałą macierz buforową i ustawiać jej wartości co klatkę.Pamiętaj, że pierwsza kamera jest tam, gdzie ustalone jest tło. Drugi to ruch ziemi. Jeśli zastanawiasz się, dlaczego duszek porusza się na scenie, ponieważ sekretem jest ziemia, która się porusza. Duszek po prostu chodzi w miejscu, ponieważ używasz trzeciego aparatu. Możesz przewijać ziemię drugiej kamery, ale HUD jest nadal na miejscu na trzeciej. Obietnica, to prawda! Trzecia kamera wyświetla miejsce, w którym wyświetla duszka w środku kierunku, niezależnie od tego, czy porusza się w lewo, czy w prawo za pomocą małego kodu animacji, a także HUD (tj. Wynik, pozostałe życia, użyty przedmiot). Jeśli czegoś potrzebujesz, zapytaj mnie.
źródło
Zrobiłem to w ten sposób:
Najpierw stworzyłem nową klasę o nazwie Hud. Implementuje
Disposable
ze względu na zarządzanie zasobami. Następnie musisz zdefiniować aStage
dla swojej zawartości i nową,viewport
ponieważ zostanie użyta nowa kamera. Musisz zdefiniować nowyTable
, który możesz dodać doStage
. Możesz dodawać swoje treści dotable
zwykłej wersji. Reszta kodu, który przedstawię, aby pokazać, jak to działa, jest specyficzna dla gry, więc po prostu zignoruj ją.}
a następnie na ekranie odtwarzania w następujący sposób:
przede wszystkim potrzebujesz zmiennej, aby odwoływać się do twojego hudu:
a następnie w konstruktorze tworzysz nową instancję swojej klasy:
w metodzie aktualizacji musisz umieścić następujące wiersze kodu, ponieważ myślę, że chcesz wyświetlić niektóre informacje o grze, takie jak punkty lub pozostałe życia:
w metodzie renderowania zrób to:
i na koniec nie zapomnij pozbyć się hudu metodą usuwania
Mam nadzieję że to pomogło
źródło