我正在尝试模拟在网格上移动的一堆简单实体。
单个实体将具有特定属性,并且网格将是方形单元的二维数组,其可以在任何时间包含从零到多个实体的任何位置。
这里适合哪种类型的数据结构,因为我不想过度设计工作,但同时看到明显简单解决方案的问题?
如果我有一个实体数组,其中每个实体都有它的坐标,那么这对于每一步填充网格都很好。但是,如果我想知道某个给定位置的某些内容,那么我必须遍历整个实体数组以查看该位置是否存在实体。 (如果我需要知道类似的东西,或者与它相邻)
相反(让网格数组跟踪所有内容)遇到了相反的问题,如果我想知道某个实体的特定内容(比如它的名称或适应性),我需要搜索整个网格数组来查找我正在寻找的实体。
最后,我的第三种方法似乎过度设计:拥有一个所有实体的数组,并且网格数组是指向该单元格中任何实体的指针数组。在第三个细胞中,我认为细胞需要知道它们中有哪些实体,实体需要知道它们所在的细胞。我甚至不确定我是否希望实体知道它们的坐标。对于他们来说,仅仅识别他们的周围环境然后相对于他们自己的位置移动可能更有意义。另外,我在javascript中这样做,所以指针可能只是逻辑上可能有一些黑客攻击而且我试图不过度设计。
答案 0 :(得分:0)
这些对象,网格和实体是否在一个系统中,每个对象只有在连接到另一个时才具有相关性?我的意思是你的实体对象只会在这个网格中使用吗?这个网格对象只会持有实体对象吗?如果是这样,那么您可以将它们链接在一起,不仅仅是从网格的角度,还可以从实体。
我假设你的网格由一个主网格对象组成,它可能包含一组行,每行都有一组单元格。每个单元格当然等于数组中的一个[x] [y]位置。每个单元格都有一组实体对象。
如果您将对象创建为“分层引用”,则可以轻松地在列表中移动。网格可能有一组行,但每行应该有一个父属性,该属性引用它所分离的网格。行可以有一组单元格,但每个单元格应该有一个引用其父行的父属性。并且每个实体对象都应该具有一个cell属性,该属性引用它所分离的单元格。
当你为实体创建move()
函数时,它需要1)从当前的单元实体集合中删除自己,2)将自己添加到新的单元格集合中,并且3)更新{{1用于引用新单元格的属性。
这是我正在谈论的那种结构的未经测试的模型:
entity.cell
注意:请注意function grid(height, width) {
this.rows = [];
this.cellAt = function(row, cell) {
return this.rows[row].cells[cell];
};
this.entitiesAt = function(row, cell) {
return this.cellAt(row, cell).entities;
};
this.addRow = function() {
var r = new row(this);
this.rows.push(r);
return r;
};
//create the grid in the default size.
if (height != null && width != null) {
var i, j, r;
for (i = 0; i <= height; i++) {
r = this.addRow();
for (j = 0; j <= width; j++)
r.addCell();
}
}
}
function row(parentGrid) {
this.grid = parentGrid;
this.cells = [];
this.getIndex = function() {
return this.grid.rows.indexOf(this);
};
this.addCell = function() {
var c = new cell(this);
this.cells.push(c);
return c;
};
}
function cell(parentRow) {
this.row = parentRow;
this.entities = [];
this.getIndex = function() {
return this.row.cells.indexOf(this);
};
this.addEntity = function(entity) {
this.entities.push(entity);
entity.cell = this;
};
this.removeEntity = function(entity) {
var i = this.entities.indexOf(entity);
if (i >= 0) this.entities.splice(i, 1);
entity.cell = null;
};
this.removeEntityAt = function(index) {
if (this.entities.length < index && index >= 0) {
e = this.entities[index];
this.entities.splice(index, 1);
e.cell = null;
}
};
}
function entity() {
this.cell = null;
this.getLocation = function() {
return {
"row" : this.cell.row.getIndex(),
"cell" : this.cell.getIndex()
};
};
this.move = function(row, cell) {
var g = this.cell.row.grid;
this.cell.removeEntity(this);
g.cellAt(row, cell).addEntity(this);
};
}
。这很有用,but not fully cross browser。
实际用法看起来像这样。
创建新网格
indexOf()
创建一个新实体并将其添加到网格中:
var grid1 = new grid(100, 100);
移动实体:
var e = new entity();
grid1.cellAt(12, 23).addEntity(e);
这里可能还有更多。例如,如果此网格,行,单元格和实体对象将表示实际的HTML元素,则可以在创建脚本中创建这些HTML元素。例如,您可能希望在创建新行和/或单元格时创建e.move(53, 23);
元素。将数组链接到div的一种方法,以便在逻辑网格和“物理”元素之间建立连接:
div
底线是我认为创建这些结构化和“分层引用”对象将使您更容易在网格中移动。此外,修改它以在一个文档中支持多个网格将非常容易。