Saya baru di libgdx, dan saya merasa bingung dengan hal-hal yang paling sederhana. Tampaknya ingin saya melakukan sesuatu dengan cara tertentu, tetapi dokumentasi tidak akan memberi tahu saya apa itu.
Saya ingin membuat game 2d yang sangat sederhana di mana pemain mengontrol pesawat ruang angkasa. Roda mouse akan memperbesar dan memperkecil, dan informasi serta kontrol ditampilkan di layar.
Tapi sepertinya saya tidak bisa membuat roda mouse TIDAK memperbesar UI. Saya sudah mencoba dengan matriks proyeksi di antara keduanya
Inilah kode saya (saat ini):
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 diatur oleh digulir (jumlah int).
Saya sudah mencoba sekitar selusin variasi pada tema mengubah matriks proyeksi kamera setelah tombol ditarik tetapi sebelum kapal, tetapi tidak peduli apa yang saya lakukan, hal yang sama terjadi pada tombol dan kapal. Begitu:
Apa cara libgdx yang biasa dalam mengimplementasikan UI di layar yang tidak diubah oleh matriks proyeksi / zoom kamera?
camera.project(Vector3 screenCoords)
untuk memproyeksikan sesuatu dari koordinat dunia ke kabel layar.Jawaban:
Anda bisa menggunakan SpriteBatch lain tanpa mengatur matriks proyeksi untuk menggambar HUD,
sumber
Saya pikir cara termudah untuk mencapai peta hud adalah dengan menggunakan kamera kedua dan overlay. Masalah ini telah dibahas di forum libgdx beberapa waktu lalu dan saya ingat seseorang di sana memposting kode hud mereka. Anda mungkin ingin melihat-lihat di sana dan melihat apa yang Anda hasilkan.
sumber
Berikut adalah metode yang saya gunakan untuk bekerja dengan satu batch:
Pertama menggambar segalanya, lalu menggambar HUD Anda terakhir:
Jika Anda ingin menggambar lebih banyak setelahnya, pastikan Anda mereset matriks proyeksi ke apa pun yang diperlukan.
sumber
.cpu()
membuat matriks baru setiap saat). Lebih baik memiliki matriks buffer permanen dan mengatur nilainya setiap frame.Ingat, kamera pertama adalah tempat latar belakang diperbaiki. Yang kedua adalah di mana tanah bergerak. Jika Anda bertanya-tanya mengapa sprite bergerak di atas panggung karena rahasia itu tanah yang bergerak. Sprite hanya berjalan di tempat karena Anda menggunakan kamera ketiga. Anda mungkin menggulir ground kamera kedua tetapi HUD masih di tempat ketiga. Janji, itu benar! Kamera ketiga adalah tempat itu menampilkan sprite di tengah untuk arah, apakah dia pergi ke kiri atau ke kanan dengan kode animasi kecil, dan HUD (yaitu skor, sisa hidup, item yang digunakan). Jika Anda butuh sesuatu, tanya saya.
sumber
Saya telah melakukannya seperti ini:
Pertama saya telah membuat Kelas baru yang disebut Hud. Ini diterapkan
Disposable
karena manajemen sumber daya. Maka Anda perlu mendefinisikanStage
untuk konten Anda dan yang baruviewport
karena kamera baru akan digunakan. Anda perlu menentukan yang baruTable
yang dapat Anda tambahkan keStage
. Anda dapat menambahkan konten Andatable
seperti biasa. Sisa kode yang akan saya tunjukkan untuk menunjukkan cara kerjanya adalah game spesifik jadi abaikan saja.}
dan kemudian di Playscreen seperti ini:
pertama-tama Anda memerlukan variabel untuk referensi hud Anda seperti:
dan kemudian di konstruktor Anda membuat instance baru dari kelas Anda:
dalam metode pembaruan- Anda perlu meletakkan baris kode ini karena saya pikir Anda ingin menampilkan beberapa informasi permainan seperti poin atau sisa nyawa:
dalam metode render- lakukan ini:
dan pada akhirnya jangan lupa membuang hud Anda dalam metode pembuangan
saya harap itu membantu
sumber