Saya punya TiledMap sederhana yang bisa saya render dengan baik. Saya memiliki pemain yang melompat-lompat (dengan Box2D) di sekitar dan kamera saya mengikuti pemain di sekitar:
Namun, kamera akan memindahkan "dari" TiledMap. Bagaimana saya bisa menyimpan kamera saya di TiledMap, jadi ketika saya berada di dekat tepi peta saya, kamera berhenti bergulir dan pemain bergerak ke arah tepi kamera?
Baiklah, jadi Anda bekerja dengan dua persegi panjang di sini. Yang statis lebih besar (peta) dan yang lebih kecil bergerak (kamera) di dalamnya. Yang Anda inginkan adalah untuk tidak membiarkan batas-batas persegi panjang yang lebih kecil bergerak di luar batas-batas dalam persegi panjang yang lebih besar.
// These values likely need to be scaled according to your world coordinates.// The left boundary of the map (x)int mapLeft =0;// The right boundary of the map (x + width)int mapRight =0+ map.getWidth();// The bottom boundary of the map (y)int mapBottom =0;// The top boundary of the map (y + height)int mapTop =0+ map.getHeight();// The camera dimensions, halvedfloat cameraHalfWidth = cam.viewportWidth *.5f;float cameraHalfHeight = cam.viewportHeight *.5f;// Move camera after player as normalfloat cameraLeft = cam.position.x - cameraHalfWidth;float cameraRight = cam.position.x + cameraHalfWidth;float cameraBottom = cam.position.y - cameraHalfHeight;float cameraTop = cam.position.y + cameraHalfHeight;// Horizontal axisif(map.getWidth()< cam.viewportWidth){
cam.position.x = mapRight /2;}elseif(cameraLeft <= mapLeft){
cam.position.x = mapLeft + cameraHalfWidth;}elseif(cameraRight >= mapRight){
cam.position.x = mapRight - cameraHalfWidth;}// Vertical axisif(map.getHeight()< cam.viewportHeight){
cam.position.y = mapTop /2;}elseif(cameraBottom <= mapBottom){
cam.position.y = mapBottom + cameraHalfHeight;}elseif(cameraTop >= mapTop){
cam.position.y = mapTop - cameraHalfHeight;}
Jadi logikanya cukup sederhana. Simpan kotak kecil di dalam kotak yang lebih besar. Setelah Anda memahami gagasan itu, jangan ragu untuk menciutkan kode itu. Anda bahkan bisa memindahkannya ke serangkaian pernyataan Min / Max bersarang di pelacakan posisi kamera Anda jika Anda mau.
Saya harus tidur lebih awal. Saya memiliki sesuatu seperti ini diterapkan, tetapi tidak bisa membuatnya bekerja. Tetapi alih-alih memanggil setPosition()metode yang bagus , yang akan memperbaiki batasan, saya masih mengatur posisi cam secara langsung (mis. cam.position.set()) Ini berfungsi seperti pesona! Terima kasih untuk penjelasannya!
Ariejan
7
Anda dapat dengan mudah menjepit posisi kamera ke batas peta seperti ini:
@Cypher: Ini setengah ukuran sumbu viewport X dan Y.
Matthias
Jadi camViewportHalfXakan sama dengan camera.viewportWidth / 2?
Cypher
0
Untuk bergerak Cameradalam TiledMapbatas, OrthogonalTiledMapRendererdigunakan.
Saya juga memperhatikan bahwa ia berperilaku tak terduga: saat Cameramencapai batas peta, peta ubin, seperti dengan inersia, memindahkan beberapa piksel terlalu jauh (tergantung pada kecepatan gesek).
Sebagai solusi , pada setiap Cameragerakan, Camerasecara paksa dimasukkan ke dalam batas peta. Lihat putInMapBounds()metode.
Untuk menghindari gangguan dalam TiledMaprendering, digunakan Math.min(float, float).
setPosition()
metode yang bagus , yang akan memperbaiki batasan, saya masih mengatur posisi cam secara langsung (mis.cam.position.set()
) Ini berfungsi seperti pesona! Terima kasih untuk penjelasannya!Anda dapat dengan mudah menjepit posisi kamera ke batas peta seperti ini:
sumber
camViewportHalfX
dancamViewportHalfY
?camViewportHalfX
akan sama dengancamera.viewportWidth / 2
?Untuk bergerak
Camera
dalamTiledMap
batas,OrthogonalTiledMapRenderer
digunakan.Saya juga memperhatikan bahwa ia berperilaku tak terduga: saat
Camera
mencapai batas peta, peta ubin, seperti dengan inersia, memindahkan beberapa piksel terlalu jauh (tergantung pada kecepatan gesek).Sebagai solusi , pada setiap
Camera
gerakan,Camera
secara paksa dimasukkan ke dalam batas peta. LihatputInMapBounds()
metode.Untuk menghindari gangguan dalam
TiledMap
rendering, digunakanMath.min(float, float)
.Gunakan pendengar ini untuk menangani
Camera
:sumber
Jika Anda memiliki faktor zoom untuk diurus, saya menemukan ini berfungsi lebih baik:
sumber