Render dan pengambilan isometrik?


23

Saya telah mencari formula untuk plot (world-> screen) dan ubin isometrik pick (world-> screen) di dunia berbentuk berlian. Yang saya coba selalu tampak, well, off. Apa cara yang biasa / benar untuk melakukan ini?


Metode dan formula yang tepat digunakan sedikit tergantung pada bentuk ubin Anda, dan mungkin sedikit pada bagaimana Anda menggambar peta (adalah 0,0 di bagian atas, bawah, atau salah satu sisi peta) Lebih detail tentang masalah Anda akan membantu.
thedaian

1
Ubinnya 2: 1 (lebih khusus, 64x32). Sistem koordinat tidak masalah karena saya sedang menulis editor. (0,0 di bagian atas atau kiri tampaknya masuk akal.)
mpnk121

Sangat terlambat untuk pertanyaan ini dan saya bahkan tidak memiliki jawaban yang lengkap, tetapi ada Google Tech Talk yang sangat baik dalam hal yang tepat ini. Pengaturan mereka termasuk memilih bagian yang tidak transparan dari gambar acak (dalam javascript, tidak kurang). youtube.com/watch?v=_RRnyChxijA
Seth Battin

Jawaban:


21

Berdasarkan komentar Anda, inilah kode yang saya gunakan untuk mengonversi nilai ubin x, y ke koordinat layar. Sekarang, itu tidak memperhitungkan "ubin 3d", semuanya dianggap berada di pesawat yang sama, jadi jika Anda menulis game yang penting, kode ini tidak akan berfungsi.

//this converts a map x/y coordinate into screen coordinates
//public, static method, so can be called outside the Tile object
point Tile::convertToScreen(int x, int y, int offsetX, int offsetY)
{
        point screen;
        //calculate the screen coordinates
        //note: these will then be modified by the camera
        screen.x = offsetX - (y * TILE_WIDTH/2) + (x * TILE_WIDTH/2) - (TILE_WIDTH/2);
        screen.y = offsetY + (y * TILE_DEPTH/2) + (x * TILE_DEPTH/2);
        return screen;
 }

titik hanyalah sebuah struktur yang mengandung ints x dan y, TILE_WIDTH akan menjadi 64 dalam kasus Anda, TILE_DEPTH adalah jenis nama yang buruk (sebenarnya adalah ketinggian grafik ubin), tetapi akan menjadi 32 dalam kasus Anda. Offsetnya adalah jika Anda ingin peta ubin Anda "mulai" di lokasi x, y yang berbeda (seperti jika Anda ingin ubin berada di atas kumpulan ubin lain). Biasanya offset bisa 0,0.

Ini akan menghasilkan peta dengan 0,0 di atas, tengah, seperti ini:

        0,0
    0,1     1,0
0,2     1,1     2,1

Adapun mencari ubin x, y dari kursor:

point selectedTile;
int x = mX - camera.x;
int y = mY - camera.y;
selectedTile.x = (y + x/2)/TILE_DEPTH;
selectedTile.y = (y - x/2)/TILE_DEPTH;

Dalam bit kode ini, mX dan mY adalah koordinat layar mouse, yang kami gabungkan dengan nilai-nilai kamera untuk mencari tahu di mana kita berada di "koordinat dunia". Semua yang lain sama dengan contoh kode sebelumnya.

Sekali lagi, ini mengasumsikan peta ubin isometrik 2d datar. Ada beberapa pekerjaan tambahan jika Anda ingin menggunakan tampilan peta semi-3d, dan ini semua mengasumsikan bahwa Anda bekerja di 2d.


1
Terima kasih! - ini bagus untuk peta datar. Sekarang, dapatkah Anda memberi tahu saya sedikit lebih banyak tentang bagaimana saya dapat menambahkan ubin yang berukuran sewenang-wenang (yaitu dengan kedalaman Z) yang ada di lapisan lain? (Seperti alat peraga seperti sumur, atau lampu jalan)
mpnk121

2
Saat itulah Anda menggunakan nilai offsetY dan offsetX. Jika lampu jalan Anda adalah 64x64, maka memberikan negatif 32 untuk nilai offsetY akan membuatnya muncul di tempat yang tepat. Semoga itu cukup untuk membantu Anda memulai.
thedaian

6
Bukankah seharusnya koordinat "2,1" dalam contoh Anda menjadi "2,0"?
Chris
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.