Öncelikle, 2D RPG'lerin kalbime yakın ve sevgili olduğunu ve eski DX7 VB6 MORPG motorlarıyla çalıştığını söyleyeyim (gülme, 8 yıl önceydi, şimdi :-)) beni ilk kez oyun geliştirmeyle ilgilendirdi . Son zamanlarda, XNA kullanmak için bu motorlardan birinde üzerinde çalıştığım bir oyunu dönüştürmeye başladım.
Bununla birlikte, tavsiyem, haritanız için katman içeren karo tabanlı bir yapı kullanmanızdır. Kullandığınız herhangi bir grafik API'sında yükleyebileceğiniz dokuların boyutu için bir sınırınız olacaktır. Grafik kartı doku bellek sınırlarından bahsetmiyorum bile. Dolayısıyla, bunu göz önünde bulundurarak, yalnızca belleğe yüklediğiniz dokuların miktarını ve boyutunu en aza indirirken aynı zamanda kullanıcının sabit diskindeki ve yükleme sürelerindeki varlıklarınızın boyutunu da azaltırken, haritalarınızın boyutunu en üst düzeye çıkarmak istiyorsanız, kesinlikle fayans ile gitmek isteyeceksiniz.
Uygulamaya gelince, burada GameDev.SE ve blogumdaki (her ikisi de aşağıda bağlantılıdır) birkaç soruda nasıl ele aldığım konusunda ayrıntılı bir şekilde ele aldım ve bu tam olarak sorduğunuz şey değil, bu yüzden sadece burada temelleri ele alalım. Ayrıca, önceden oluşturulmuş birkaç büyük görüntüyü yüklemede onları yararlı kılan karoların özelliklerini de not edeceğim. Bir şey net değilse bana bildirin.
- Yapmanız gereken ilk şey bir karo sayfası oluşturmaktır. Bu, bir kareye hizalanmış tüm karolarınızı içeren büyük bir görüntüdür. Bu (ve belki de karo sayısına bağlı olarak ekstra bir tane) yüklemeniz gereken tek şey olacaktır. Sadece 1 resim! Harita başına 1 veya oyundaki her kutucuk için bir tane yükleyebilirsiniz; hangi kuruluş sizin için çalışıyorsa.
- Ardından, bu "sayfayı" nasıl alabileceğinizi ve her döşemeyi bir sayıya nasıl çevirebileceğinizi anlamanız gerekir. Bu basit bir matematik ile oldukça basittir. Buradaki bölümün tamsayı bölüm olduğunu unutmayın , bu nedenle ondalık basamaklar düşürülür (veya isterseniz yuvarlanır).
Tamam, şimdi döşeme sayfasını bir dizi hücreye (sayılar) böltüğünüze göre, bu sayıları alıp istediğiniz herhangi bir kaba takabilirsiniz. Kolaylık olması için, sadece bir 2D dizi kullanabilirsiniz.
int[,] mapTiles = new int[100,100]; //Map is 100x100 tiles without much overhead
Sonra, onları çizmek istiyorsunuz. Bunu daha verimli hale getirmenin yollarından biri (harita boyutuna bağlı olarak) yalnızca kameranın görüntülemekte olduğu hücreleri hesaplamak ve bunlar arasında döngü yapmaktır. Bunu, kameranın sol üst ( tl
) ve sağ alt ( br
) köşelerinin harita döşemesi dizi koordinatlarını getirerek yapabilirsiniz . Daha sonra bunları çizmek için tl.X to br.X
ve iç içe bir döngü içinde ve arasında döngü yapın tl.Y to br.Y
. Aşağıdaki örnek kod:
for (int x = tl.X; x <= br.X;x++) {
for (int y = tl.Y; y <= br.Y;y++) {
//Assuming tileset setup from image
Vector2 tilesetCoordinate = new Vector2((mapTiles[x,y] % 8) * 32,(mapTiles[x,y] / 8) * 32);
//Draw 32x32 tile using tilesetCoordinate as the source x,y
}
}
- İkramiye! Karo motorunun temelleri budur. 1000x1000'lik bir haritanın bile fazla bir yükü olmadan kolay olduğunu görebilirsiniz. Ayrıca, 255'ten az kutunuz varsa, belleği hücre başına 3 bayt azaltan bir bayt dizisi kullanabilirsiniz. Bir bayt çok küçükse, ihtiyaçlarınız için muhtemelen bir ushort yeterli olacaktır.
Not: Dünya koordinatları kavramını (kameranızın konumunun temel alacağı şey) bıraktım, çünkü bence bu cevabın kapsamı dışında. Bunu GameDev.SE'de buradan okuyabilirsiniz.
Döşeme Motoru Kaynaklarım
Not: Bunların tümü XNA'yı hedefliyor, ancak hemen hemen her şey için geçerli - sadece çizim çağrılarını değiştirmeniz gerekiyor.
- Bu soruya cevabım , harita hücrelerinin ve katmanımın oyunumda nasıl ele aldığımı özetliyor. (Bkz. Üçüncü bağlantı.)
- Bu soruya verdiğim yanıt , verileri ikili biçimde nasıl depoladığımı açıklıyor.
- Bu , üzerinde çalıştığım oyunun gelişimi hakkında ilk (iyi, teknik olarak ikinci, ama ilk "teknik") blog yazısı. Tüm seri piksel gölgelendiriciler, aydınlatma, fayans davranışları, hareket ve tüm bu eğlenceli şeyler hakkında bilgi içerir. Aslında, yukarıda yayınladığım ilk bağlantıya cevabımın içeriğini içerecek şekilde yazıyı güncelledim, bu yüzden onu okumak isteyebilirsiniz (bir şeyler ekledim). Herhangi bir sorunuz varsa, buraya veya buraya bir yorum bırakabilirsiniz. Size yardımcı olmaktan memnuniyet duyarız.
Diğer Döşeme Motoru Kaynakları
- Bu sitedeki karo motoru öğreticisi bana haritalarımı oluşturmak için kullandığım temeli verdi.
- Aslında bu video eğitimlerini henüz izlemedim çünkü zamanım olmadı, ancak muhtemelen yardımcı oluyorlar. :) XNA kullanıyorsanız, bunlar eski olabilir.
- Bu sitede (bence) yukarıdaki videolara dayanan bazı öğreticiler var. Kontrol etmeye değer olabilir.