【发布时间】:2018-04-14 09:33:50
【问题描述】:
我正在创建一个 HTML5 平台游戏,使用对象进行碰撞检测并使用 2d 平铺地图来渲染关卡。一切正常。
我想使用相同的二维数组来动态构建对象数组,以允许玩家根据需要构建地图,同时也便于首先创建地图。在对对象数组进行硬编码时,一切正常,因此我知道碰撞检测和游戏引擎正常工作。
虽然我可以为每个单独的数组元素创建对象,但我希望根据数组中匹配元素的数量(每个元素为 25x25)构建具有宽度的对象,即如果 3 个数组元素为 1,1, 1 那么对象的宽度将为 75。也许一些代码会帮助解释:
下面的瓦片数组
var arr1 = [
[0,0,0,1,1,1,1,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,2,2,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[3,3,3,0,0,0,0,0,0,0]
];
应该产生以下对象数组:
[
{x: 75, y: 0, width: 100, height: 25, value: 1},
{x: 75, y: 50, width: 50, height: 25, value: 2},
{x: 0, y: 100, width: 75, height: 25, value: 3}
]
但它却产生了以下内容:
[
{x: 75, y: 0, width: 25, height: 25, value: 1},
{x: 100, y: 0, width: 25, height: 25, value: 1},
{x: 125, y: 0, width: 25, height: 25, value: 1}
]
我的逻辑显然是错误的,但我终生无法理解。
示例代码如下:
非常感谢任何帮助:
var tmpObj = {};
var objArr = [];
var arr1 = [
[0,0,0,1,1,1,1,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,2,2,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[3,3,3,0,0,0,0,0,0,0]
];
for (let i=0; i<arr1.length; i++) {
for (let j=0; j<arr1[i].length; j++) {
if (arr1[i][j] > 0 && arr1[i][j] < 6) { // platform blocks only 1 - 5
if (tmpObj.x === undefined) {
tmpObj = {
x: j * 25,
y: i * 25,
width: 25,
height: 25,
value: arr1[i][j]
}
} else if (arr1[i][j] == arr1[i][j-1] && arr1[i][j] == tmpObj.v) {
tmpObj.w += 25;
} else if (arr1[i][j] !== tmpObj.v) { // new tile type
objArr.push(tmpObj);
tmpObj = {
x: j * 25,
y: i * 25,
width: 25,
height: 25,
value: arr1[i][j]
}
} else {
objArr.push(tmpObj);
tmpObj = {};
}
}
}
}
console.log(objArr);
【问题讨论】:
标签: javascript html multidimensional-array html5-canvas javascript-objects