Więc tworzę RPG HTML5 dla zabawy. Mapa jest <canvas>(szerokość 512 pikseli, wysokość 352 pikseli | 16 płytek w poprzek, 11 płytek od góry do dołu). Chcę wiedzieć, czy istnieje bardziej skuteczny sposób na pomalowanie <canvas>.
Oto jak mam to teraz.
Jak płytki są ładowane i malowane na mapie
Mapa jest malowana kafelkami (32x32) za pomocą tego Image()kawałka. Pliki obrazów są ładowane przez prostą forpętlę i umieszczane w tablicy wywoływanej tiles[]jako MALOWANE przy użyciu drawImage().
Najpierw ładujemy kafelki ...

a oto jak to się robi:
// 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);
}
Oczywiście, gdy gracz rozpoczyna grę, ładuje mapę, którą ostatnio przerwał. Ale tutaj jest to mapa z trawą.
W tej chwili mapy używają tablic 2D. Oto przykładowa mapa.
[[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]];
Dostaję różne mapy za pomocą prostej ifstruktury. Gdy powyższa tablica 2d będzie return, odpowiednia liczba w każdej tablicy zostanie pomalowana zgodnie z Image()zapisem w środku tile[]. Potem drawImage()nastąpi i pomaluj zgodnie z xi yi 32pomaluj na właściwej x-ywspółrzędnej.
Jak występuje przełączanie wielu map
Z mojej gry, mapy mają pięć rzeczy do śledzenia: currentID, leftID, rightID, upID, i bottomID.
- currentID: bieżący identyfikator mapy, na której jesteś.
- leftID: Jaki identyfikator
currentIDzaładować po wyjściu z lewej strony bieżącej mapy. - rightID: Jaki identyfikator
currentIDzaładować po wyjściu z prawej strony bieżącej mapy. - downID: Jaki identyfikator
currentIDzaładować po wyjściu z dolnej części bieżącej mapy. - upID: Jaki identyfikator
currentIDzaładować po wyjściu na górę bieżącej mapy.
Coś do uwaga: Jeśli któraś leftID, rightID, upID, lub bottomIDnie są specyficzne, co oznacza, że są one 0. Oznacza to, że nie mogą opuścić tej strony mapy. To tylko niewidzialna blokada.
Tak więc, gdy dana osoba wyjdzie z boku mapy, w zależności od tego, gdzie wyszła ... na przykład jeśli wyszła na dole, bottomIDliczba mapładowanych osób zostanie w ten sposób namalowana na mapie.
Oto reprezentatywny plik .GIF, który pomoże ci lepiej wizualizować:

Jak widać, wcześniej czy później na wielu mapach będę miał do czynienia z wieloma identyfikatorami. A to może być trochę mylące i nerwowe.
Oczywiste zalety to to, że ładuje 176 kafelków jednocześnie, odświeża małe płótno 512x352 i obsługuje jedną mapę na raz. Wadą jest to, że identyfikatory MAP, gdy mamy do czynienia z wieloma mapami, mogą czasami być mylące.
Moje pytanie
- Czy to skuteczny sposób przechowywania map (biorąc pod uwagę użycie kafelków), czy jest lepszy sposób obsługi map?
Myślałem o wielkiej mapie. Rozmiar mapy jest duży i składa się z jednej tablicy 2D. Jednak rzutnia ma wciąż 512 x 352 pikseli.
Oto kolejny plik .gif, który zrobiłem (na to pytanie), aby pomóc w wizualizacji:

Przepraszam, jeśli nie rozumiesz mojego angielskiego. Proszę pytać o wszystko, co masz problemy ze zrozumieniem. Mam nadzieję, że wyjaśniłem to. Dzięki.