İzometrik renderleme ve toplama?


23

Elmas şeklindeki bir dünyada arsa (dünya-> ekran) ve fare toplama (dünya-> ekran) izometrik fayansları için bir formül arıyorum. Denedim olanlar her zaman iyi görünüyor. Bunu yapmanın normal / doğru yolu nedir?


Kullanılan tam yöntem ve formül, döşemelerinizin şekline ve haritayı nasıl çizdiğinize bağlı olarak biraz bağlıdır (0,0 haritanın üst, alt veya yanlarından biridir) Daha fazla bilgi senin sorunun hakkında yardımcı olur.
thedaian

1
Fayanslar 2: 1'dir (daha özel olarak 64x32). Koordinat sistemi editörü yazdığımdan beri önemli değil. (Üstte veya solda 0,0, ancak mantıklı görünüyor.)
mpnk121

Soruya çok geç kaldım ve tam bir cevabım bile yok, ancak bu konuda çok iyi bir Google Tech Sohbeti vardı. Bunların ayarları, rastgele görüntülerin saydam olmayan kısmını seçmeyi içerir (javascript'te, daha az değil). youtube.com/watch?v=_RRnyChxijA
Seth Battin

Yanıtlar:


21

Yorumunuza dayanarak, x, y değerlerini ekran koordinatlarına dönüştürmek için kullanıyorum. Şimdi, "3d fayansları" hesaba katmıyor, her şey aynı düzlemde sayılıyor, bu yüzden önemli olan bir oyun yazıyorsanız, bu kod çalışmayacak.

//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;
 }

nokta basitçe x ve y inç içeren bir yapıdır, TILE_WIDTH sizin durumunuzda 64, TILE_DEPTH kötü bir şekilde adlandırılır (aslında çini grafiklerinin yüksekliğidir), ama sizin durumunuzda 32 olacaktır. Ötelemeler, döşeme haritanızın farklı bir x, y konumunda (döşemelerin başka bir döşeme kümesinin üstünde olmasını istemek gibi) "başlatılmasını" istiyorsanız. Tipik olarak ofset 0,0 olabilir.

Bu, aşağıdaki gibi üstte, ortada 0,0 ile bir harita oluşturacaktır:

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

X işaretini bulmak için, imlecin y harfi:

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;

Bu kod parçasında, mX ve mY, "dünya koordinatlarında" nerede olduğumuzu bulmak için kamera değerleriyle birleştirdiğimiz fare ekranı koordinatlarıdır. Geriye kalan her şey önceki kod örneğiyle aynı.

Bir kez daha, bu düz bir 2d izometrik karo haritası varsayar. Haritanın yarı-3d görüntüsünü kullanmak istiyorsanız, bazı ek çalışmalar var ve bunların hepsi yine de 2d'de çalıştığınızı varsayar.


1
Teşekkür ederim! - Bu düz haritalar için harika çalışıyor. Şimdi, bana başka bir katmandaki keyfi boyutlarda (Z derinliğinde) fayansları nasıl ekleyebileceğimi biraz daha anlatabilir misiniz? (Bir kuyu veya sokak lambası gibi sahne gibi)
mpnk121

2
OffsetY ve offsetX değerlerini kullandığınızda. Sokak lambanız 64x64 ise, ofsetY değeri için negatif 32 girerek doğru yerde görünmesini sağlamalısınız. Umarım başlaman için bu kadar yeter.
thedaian

6
Örnekteki "2,1" koordinatı "2,0" olmamalı mı?
Chris
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.