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ą for
pę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 if
struktury. 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 x
i y
i 32
pomaluj na właściwej x-y
współ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
currentID
załadować po wyjściu z lewej strony bieżącej mapy. - rightID: Jaki identyfikator
currentID
załadować po wyjściu z prawej strony bieżącej mapy. - downID: Jaki identyfikator
currentID
załadować po wyjściu z dolnej części bieżącej mapy. - upID: Jaki identyfikator
currentID
załadować po wyjściu na górę bieżącej mapy.
Coś do uwaga: Jeśli któraś leftID
, rightID
, upID
, lub bottomID
nie 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, bottomID
liczba 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.