Форматирование многомерного массива спрайтов изображений

#javascript #arrays #multidimensional-array #sprite

#javascript #массивы #многомерный массив #спрайт

Вопрос:

Я создаю функцию, которая загружает спрайты для игры, и не совсем уверен, что знаю, как это сделать. Я все еще нащупываю свой путь вокруг javascript и ООП, так что это отчасти потеряно для меня. Мне нужно выбрать спрайты по таблице спрайтов, в которой они находятся, и по индексу, который соответствует расположению спрайтов в таблице спрайтов. Я хочу ссылаться на таблицу спрайтов с помощью буквы и позиции XY с помощью числа. Что-то вроде Tile("A", 132); таблиц спрайтов будет иметь размер 512×512 пикселей, содержащих спрайты размером 32×32 пикселя, что составляет 256 спрайтов на листе с несколькими листами. Вот что у меня есть до сих пор:

 function Tileset(Spritesheet, Index){
    this.Spritesheet=Spritesheet;
    this.Index=Index;
    this.SpritesheetList=["TilesetA.png","TilesetB.png","TilesetC.png"];
    this.Tile=Image;
    this.LoadTiles = function(){
        for (sheet in SpritesheetList){
            var dummyImage= new Image;
            dummyImage.src=this.SpritesheetList[sheet];
            SpritesheetList[sheet]=[];
            for (var Y=0; Y<16; Y  ){
                for (var X=0; X<16; X  ){
                    this.SpritesheetList[sheet][Y*16   X]=dummyImage.getSubimage(X*32, Y*32, 32, 32);
                };
            };
        };
        return this.SpritesheetList[Spritesheet][Index];
    };
    return this.SpritesheetList[Spritesheet][Index];
};
  

Комментарии:

1. Вы злоупотребляете for..in . SpritesheetList если это массив, вы должны использовать обычный for цикл.

2. Также вы забыли объявить sheet , и вы имели в виду this.SpritesheetList ?

3. На самом деле для этого я думал for..in , что он будет анализировать все элементы массива, пока не дойдет до конца. Я делаю это неправильно, называя элементы массива?

Ответ №1:

В вашем коде есть некоторые проблемы. Я не знаю, используете ли вы какую-либо библиотеку, но если плитки имеют размер 32×32 пикселей, последние два аргумента getSubimage должны быть 32.

Вы также должны пытаться загружать плитки только один раз, а не каждый раз, когда вы обращаетесь к плитке.

Я немного переработал ваш код, чтобы сделать его более ООП и многоразовым.

 function Tileset(spritesheetImages) {
    this.spritesheetImages = spritesheetImages;
    this.spritesheetList   = {};
}

Tileset.prototype.loadTiles =  function() {
    for (var i = 0, len = this.spritesheetImages.length; i < len; i  ) {
        var image = new Image();
        image.src = this.spritesheetImages[i];

        this.spritesheetList[this.spritesheetImages[i]] = [];

        for (var y = 0; y < 16; y  ) {
            for (var x = 0; x < 16; x  ) {
                this.spritesheetList[this.spritesheetImages[i]].push(image.getSubimage(x*16, y*16, 32, 32));
            }
        }
    }
};

Tileset.prototype.getTile = function(spritesheetImage, tileIndex) {
    return this.spritesheetList[spritesheetImage][tileIndex];
};

var tileset = new Tileset(["TilesetA.png","TilesetB.png","TilesetC.png"]);

tileset.loadTiles();

tileset.getTile("TilesetA.png", 132);
  

Теперь вы можете создавать tilemap каждый раз, когда вам нужно. Я использовал методы прототипа, потому что тогда функции не копируются с каждым экземпляром. Надеюсь, это то, что вы намеревались.

Редактировать

Чтобы добавить новое изображение таблицы спрайтов, вы можете использовать этот метод

 Tileset.prototype.addSpritesheetImage = function(spritesheetImage) {
    var image = new Image();
    image.src = spritesheetImage;

    this.spritesheetList[spritesheetImage] = [];

    for (var y = 0; y < 16; y  ) {
        for (var x = 0; x < 16; x  ) {
            this.spritesheetList[spritesheetImage].push(image.getSubimage(x*16, y*16, 32, 32));
        }
    }
};
  

Если вы хотите использовать индекс таблицы спрайтов, вы можете изменить метод getTile на

 Tileset.prototype.getTile = function(spritesheetIndex, tileIndex) {
    return this.spritesheetList[Object.keys(this.spritesheetList)[spritesheetIndex]][tileIndex];
};
  

Комментарии:

1. да, извините, все они предполагают, что 32 мои плохие. Я этого не видел. Мне не нужно его повторно использовать, но я планирую добавлять больше таблиц спрайтов по ходу работы. Это то, что мне нужно, я думаю, было бы проще ссылаться на таблицы спрайтов по числу или строке для их src.