我正在创建一个具有多个级别的简单游戏。每个级别都由键值对的对象表示。在每个级别中,还有一个数组,其中包含将在该级别中加载的类的新实例。到目前为止,它运行得很好,但当我实现重启按钮时,程序无法再次加载这些实例,因为我已经更改了它们。所以我需要将这些实例硬拷贝到级别中,当您按下重新启动按钮时,您可以再次硬拷贝它们。
这是我的级别对象的一个示例。
const level4 ={
width:window.innerWidth,
height:window.innerHeight,
gates:[new Gate(canvas.width-20, 100,0,-2), new Gate(200, 15,4,-1)],
blocks:[new Block(50,100,0, 0, 50, 1, 2), new Block(200,200,0, 0, 50, 1, 1)],
difficulty:'easy',
id:4
};
我已经尝试用这个解析函数硬拷贝对象,但它不起作用。
const parseLevel = (currentLevel) =>{
return {
width: currentLevel.width,
height: currentLevel.height,
gates: parseObjects(currentLevel.gates),
blocks: parseObjects(currentLevel.blocks),
difficulty: currentLevel.difficulty,
id: currentLevel.id
};
};
const parseObjects = (array) =>{
let newArray = [];
for(let i of array){
let newObj = Object.assign( Object.create( Object.getPrototypeOf(i)),i);
newArray.push(newObj);
}
return newArray;
};
在我的函数中,我正在加载我调用的级别:
level = parseLevel(level4);
我认为简单的解决方案是将level4
从常量转换为函数。这样,您可以多次调用它,并始终获得一个新实例。
const level4 = () => ({
width: window.innerWidth,
height: window.innerHeight,
gates:[
new Gate(canvas.width-20, 100,0,-2),
new Gate(200, 15,4,-1)
],
blocks:[
new Block(50,100,0, 0, 50, 1, 2),
new Block(200,200,0, 0, 50, 1, 1)
],
difficulty: 'easy',
id: 4
});
看看这里的
我不知道您的Gate
和Block
对象在内部是如何构造的。它们可能有无法硬拷贝的嵌套对象。
var k = {"a": "b", "c": {"d": "c"}};
var j = Object.assign( Object.create( Object.getPrototypeOf(k)),k);
console.log(j === k)
// false
console.log(k.c === j.c)
// true
根据文章:
一个简单的选择将是CCD_ 4。这可能相当缓慢。
库lodash还有一个可能更快的cloneDeep
函数。不过我没有任何基准。