我正在尝试从网络上名为CABAL的mmorpg在线游戏中复制广告资源,该游戏的广告资源如下所示:

javascript - 在网络上复制游戏内广告资源-LMLPHP

基本上,广告资源有4个标签,每个标签的尺寸为8x8,因此每个标签上总共有64个单元格,总共256个单元格,不过,每个标签上的索引从0到63开始,总数从0到255。

正如您所看到的,有些项目占1:1(行距:colspan),有些占2:2,有些甚至可能是2:6,例如一件防弹衣,无论如何,重点是我尽力尝试了here复制。我设法只制作了1个标签。

    function createCells(rows, cols) {
        var cells = {},
            x = 0,
            startRow = 0,
            endRow = 0;

        for (var i = 0; i < rows; i++) {
            cells[i] = {};
            for (var j = 0; j < cols; j++) {
                cells[i][j] = { id: "e" + x };

                if (angular.isDefined(items[x])) {
                    cells[i][j] = items[x];
                    if (items[x].colspan > 1 && items[x].rowspan > 1) {
                        startRow = x % rows;
                        endRow = parseInt(x / cols, 10) + items[x].rowspan;
                        console.log(j);
                        console.log("Start column " + startRow + " end rowspan " + endRow + " x = " + x);
                    }
                    // console.log();
                    // if (j >= 5 && j <= 8) {
                    //     x += j;
                    // }
                }

                if (!angular.equals(cells[i][j], {})) {
                    console.log(cells[i][j]);
                }


                x++;
            }
        }

        return cells;
    }


因此,问题在于,如果某项占用的行跨度和colspan大于1,则它将在之后推入其他单元格,而我需要将其删除(e7,e14,e15,e39,e46,e47,e54,e55,e62,e63)。我需要循环来根据库存的项目rowpan和colspan自动进行计算。 var项目中的项目是api响应的示例,因此3、6、12、240、105是选项卡1的项目。

那么有人可以进一步帮助我吗?我为此困扰了好几天。

最佳答案

如果您不介意方法的微小变化,可以尝试以下方法:


在制作单元格之前,请遍历所有物品
对于每个项目,确定将被阻止的rowcol组合


现在,您有了所有被阻止(即不为空)单元格的映射。在createCells循环中,可以使用此映射来确定是否需要占位符。现在每个单元格有三种情况:


这是项目进入的确切位置:添加项目
这是一个被物品挡住的插槽:什么都不做
与项目无关:插入占位符


这是我的操作方式:

function createCells(rows, cols) {
  var cells = {};

  // Create an object that holds all cell codes blocked by an item
  var itemMap = Object.keys(items).reduce(function(map, key) {
    var item = items[key],
      cStart = item.slot % cols,
      rStart = Math.floor(item.slot / cols)
    for (var c = 0; c < item.colspan; c += 1) {
      for (var r = 0; r < item.rowspan; r += 1) {
        map[(r + rStart) + ";" + (c + cStart)] = item;
      }
    }
    return map;
  }, {});

  var currentNr;
  for (var i = 0; i < rows; i++) {
    cells[i] = {};

    for (var j = 0; j < cols; j++) {
      currentNr = i * cols + j;

      // If there's an item with this slot, place it
      if (items[currentNr]) {
        // Add item
        cells[i][j] = items[currentNr];

      } else if (itemMap[i + ";" + j]) { // The item isn't in the exact spot, but blocks it
        // Block square, do nothing
      } else {
        // Add empty square
        cells[i][j] = {
          id: "e" + currentNr
        }
      }
    }
  }
  return cells;
}


在工作的小提琴中:http://jsfiddle.net/q1ba3x4h/

关于javascript - 在网络上复制游戏内广告资源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40425056/

10-16 17:44