【问题标题】:Replicate an ingame inventory on the web在网络上复制游戏内库存
【发布时间】:2016-11-04 14:22:35
【问题描述】:

我正在尝试在网络上复制名为 CABAL 的 mmorpg 在线游戏的库存,该游戏的库存如下所示:

基本上,库存有 4 个选项卡,每个选项卡都是 8x8,因此每个选项卡上总共有 64 个单元格,总共 256 个,但是,每个选项卡上的索引从 0 到 63 开始,总数从 0 到 255。

如您所见,有些项目占用 1:1 (rowspan: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;
    }

那么问题是,如果一个项目占用的 rowspan 和 colspan 大于 1,它会在之后推动其他单元格,我需要将它们删除(e7、e14、e15、e39、e46、e47、e54、e55、e62、e63 )。我需要循环根据作为库存的项目 rowspan 和 colspan 自动计算。 var items 中的项目是 api 响应的样本,因此 3、6、12、240、105 是选项卡 1 的项目。

那么任何人都可以进一步帮助我吗?我被困了好几天。

【问题讨论】:

    标签: javascript angularjs inventory


    【解决方案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/

    【讨论】:

    • 哇,这太好了,可以按需要工作,虽然它仍然需要完成多标签部分,我想我可以自己做,不过,我有点担心循环太多性能,这是此代码的最佳版本和更快的版本,还是可以更好地改进?
    • 我将根据相同的方法编写一个示例,但“更高效”。不过,我建议您不要只关注速度,因为遍历 1000 个项目可能不会成为问题。给我几分钟时间来告诉你一个更有效的例子会是什么样子,你可以决定可读性是否会受到影响。
    • 在性能方面让它更“高效”并不容易。不过代码看起来更简洁:jsfiddle.net/oybc0ree 附加说明:您可能希望对行和列使用数组而不是对象,因为我认为不能保证对对象进行排序......(抱歉等待,还有其他一些事情)
    • 嗯,不知道你的代码如何为每个库存制作 4 个标签,如果你愿意,你能帮我吗?
    • 也许使用 angular material md tabs 组件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多