在网络上复制游戏内物品栏
Replicate an ingame inventory on the web
我正在尝试从网络上名为 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;
}
那么问题是,如果一个项目占用大于 1 的行跨度和列跨度,它会将其他单元格推到后面,我需要将它们删除(e7、e14、e15、e39、e46、e47、e54、e55、e62 , e63).我需要循环根据库存项目 rowspan 和 colspan 自动计算。 var items 中的项目是 api 响应的示例,因此 3、6、12、240、105 是选项卡 1 的项目。
所以有人可以进一步帮助我吗?我在这件事上被困了好几天。
如果您不介意方法上的小改动,您可以试试这个:
- 在制作单元格之前,循环遍历所有项目
- 对于每个项目,确定将被阻止的
row
和 col
组合
现在,您拥有所有已屏蔽(即:非空)单元格的地图。在 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;
}
正在工作fiddle:http://jsfiddle.net/q1ba3x4h/
我正在尝试从网络上名为 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;
}
那么问题是,如果一个项目占用大于 1 的行跨度和列跨度,它会将其他单元格推到后面,我需要将它们删除(e7、e14、e15、e39、e46、e47、e54、e55、e62 , e63).我需要循环根据库存项目 rowspan 和 colspan 自动计算。 var items 中的项目是 api 响应的示例,因此 3、6、12、240、105 是选项卡 1 的项目。
所以有人可以进一步帮助我吗?我在这件事上被困了好几天。
如果您不介意方法上的小改动,您可以试试这个:
- 在制作单元格之前,循环遍历所有项目
- 对于每个项目,确定将被阻止的
row
和col
组合
现在,您拥有所有已屏蔽(即:非空)单元格的地图。在 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;
}
正在工作fiddle:http://jsfiddle.net/q1ba3x4h/