Bu yüzden sadece eğlence için bir HTML5 RPG yapıyorum. Harita bir <canvas>
(512px genişlik, 352px yükseklik | 16 döşeme, 11 döşeme yukarıdan aşağıya). Boyamak için daha etkili bir yol olup olmadığını bilmek istiyorum <canvas>
.
İşte şimdi nasıl var.
Karolar haritada nasıl yüklenir ve boyanır?
Harita, Image()
parça kullanılarak çinilerle (32x32) boyanıyor . Görüntü dosyaları basit bir for
döngüden yüklenir ve tiles[]
kullanımda PAINTED olarak adlandırılan bir diziye konur drawImage()
.
İlk önce, fayansları yüklüyoruz ...
ve işte nasıl yapıldığı:
// SET UP THE & DRAW THE MAP TILES
tiles = [];
var loadedImagesCount = 0;
for (x = 0; x <= NUM_OF_TILES; x++) {
var imageObj = new Image(); // new instance for each image
imageObj.src = "js/tiles/t" + x + ".png";
imageObj.onload = function () {
console.log("Added tile ... " + loadedImagesCount);
loadedImagesCount++;
if (loadedImagesCount == NUM_OF_TILES) {
// Onces all tiles are loaded ...
// We paint the map
for (y = 0; y <= 15; y++) {
for (x = 0; x <= 10; x++) {
theX = x * 32;
theY = y * 32;
context.drawImage(tiles[5], theY, theX, 32, 32);
}
}
}
};
tiles.push(imageObj);
}
Doğal olarak, bir oyuncu bir oyuna başladığında en son bıraktıkları haritayı yükler. Ama burada, bütünüyle çim biçimli bir harita.
Şu anda, haritalar 2D dizileri kullanıyor. İşte örnek bir harita.
[[4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 1, 1, 1, 1],
[1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 13, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 13, 11, 11, 11, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 1, 1, 1, 1, 1, 1, 1, 13, 13, 13, 13, 13, 1],
[1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1, 1, 1]];
Basit bir if
yapı kullanarak farklı haritalar alıyorum . Yukarıdaki 2d dizisi olduğunda return
, her dizideki karşılık gelen sayı, Image()
içeride depolanana göre boyanacaktır tile[]
. Sonra doğru koordinat üzerinde boyamak drawImage()
için x
ve y
ve zamana göre boyamak olacaktır .32
x-y
Çoklu harita değiştirme nasıl gerçekleşir?
Oyunum ile, haritalar izlemek için beş şey vardır: currentID
, leftID
, rightID
, upID
, ve bottomID
.
- currentID: Bulunduğunuz haritanın geçerli kimliği.
- leftID:
currentID
Geçerli haritanın solundan çıktığınızda hangi ID'nin yükleneceği. - rightID:
currentID
Geçerli haritanın sağından çıktığınızda hangi ID'nin yükleneceği. - downID:
currentID
Geçerli haritanın altından çıkarken hangi ID'nin yükleneceği. - upID:
currentID
Geçerli haritanın tepesinden çıktığınızda yüklenecek kimlik numarası .
Nota şey: ya varsa leftID
, rightID
, upID
veya bottomID
, belirli DEĞİLDİR aracının onlar vardır 0
. Bu, haritanın bu tarafını terk edemeyecekleri anlamına gelir. Bu sadece görünmez bir abluka.
Böylece, bir kişi haritanın bir tarafından çıktıktan sonra, nereye çıktıklarına bağlı olarak ... örneğin alttan çıkmışlarsa, bottomID
yükleneceklerin sayısı map
ve dolayısıyla harita üzerinde boyanacak.
İşte size daha iyi görselleştirmenize yardımcı olacak temsili bir .GIF:
Gördüğünüz gibi, er ya da geç, pek çok harita ile pek çok kimlikle uğraşıyorum . Ve bu muhtemelen biraz kafa karıştırıcı ve telaşlı olabilir.
Bariz artıları, bir seferde 176 kiremit yüklemesi, küçük bir 512x352 kanvas yenilemesi ve bir haritayı idare etmesidir. Sonuç olarak MAP kimlikleri birçok harita ile uğraşırken zaman zaman kafa karıştırıcı olabiliyor.
Benim sorum
- Bu, haritaları saklamak için etkili bir yol mu (fayans kullanımı verilen) veya haritaları kullanmanın daha iyi bir yolu var mı?
Dev bir haritanın çizgileri boyunca düşünüyordum. Harita boyutu büyük ve hepsi bir 2B dizi. Ancak görünüm alanı hala 512x352 pikseldir.
İşte görselleştirmek için (bu soru için) yaptığım başka bir .gif:
İngilizcemi anlayamıyorsanız üzgünüm. Lütfen anlamakta zorlandığınız herhangi bir şeyi sorun. Umarım açıklığa kavuşturdum. Teşekkürler.