У меня есть экземпляр Matter. js на экране, например, в игре, и я хочу полностью начать все заново, когда пользователь / игрок нажимает кнопку "новая игра":
const { Engine, Render, Runner, World, Bodies, Mouse, MouseConstraint, Body, Events } = Matter;
//movement setup
const engine = Engine.create();
const { world } = engine;
let render;
let runner;
const startGame = document.querySelector('#start');
startGame.addEventListener('click', event => {
event.preventDefault();
//hide 'choose difficulty'
const chooseDifficulty = document.querySelector('.options');
chooseDifficulty.classList.add('hidden');
//get selected difficulty
const difficulty = document.querySelector('input[name=difficulty]:checked').value;
//set number of horizontal/vertical cells based on difficulty selected
switch(difficulty) {
case 'easy':
cellsHorizontal = 6;
cellsVertical = 4;
break;
case 'medium':
cellsHorizontal = 14;
cellsVertical = 10;
break;
case 'hard':
cellsHorizontal = 25;
cellsVertical = 15;
break;
}
createMaze();
});
const createMaze = () => {
//show controls
// document.querySelector('.controls').classList.remove('hidden');
console.log(document.querySelector('.controls').scrollHeight)
//set size of movement.js canvas/world
const worldWidth = document.querySelector('.canvas').scrollWidth;
const worldHeight = document.querySelector('.canvas').scrollHeight;
console.log(document.querySelector('.canvas').scrollHeight)
console.log(worldHeight);
//length of one side of one cell
const unitLengthX = worldWidth/cellsHorizontal;
const unitLengthY = worldHeight/cellsVertical;
//disable gravity & render the world
engine.world.gravity.y = 0;
world.gravity.x = 0;
render = Render.create({
element: document.querySelector('.canvas'),
engine: engine,
options: {
width:worldWidth,
height:worldHeight,
wireframes:false
}
});
Render.run(render);
runner = Runner.create();
Runner.run(runner, engine);
//Outer edges
const edges = [
/*top*/Bodies.rectangle((worldWidth/2),0,worldWidth,5, {isStatic:true}),
/*bottom*/Bodies.rectangle((worldWidth/2),worldHeight,worldWidth,5, {isStatic:true}),
/*left*/Bodies.rectangle(0,(worldHeight/2),5,worldHeight, {isStatic:true}),
/*right*/Bodies.rectangle(worldWidth,(worldHeight/2),5,worldHeight, {isStatic:true})
];
World.add(world, edges);
}
Это создает холст внутри .canvas
div на странице, занимающей весь экран, с solid краями снаружи, поэтому тела не могут падать в любом направлении.
В этом случае (не включенный здесь), я создал случайный лабиринт с прямоугольником в качестве цели и кругом, чтобы перемещаться, используя WASD или клавиши со стрелками, и обработчик событий для столкновения между этими двумя, которое выскакивает ранее скрытый div с z -индекс от 1 до go в верхней части карты, которая содержит кнопку «Начать сначала», которая при нажатии возвращает игрока к выбору сложности, а затем он может создать новый лабиринт.
Вот код для этой кнопки «Начать сначала», где я хочу очистить весь экземпляр Matter / canvas / world / engine, прежде чем дать возможность выбрать сложность и создать новый лабиринт. e:
button.addEventListener('click', event => {
event.preventDefault();
World.clear(world);
Engine.clear(engine);
console.log('reset clicked');
document.querySelector('.winner').classList.add('hidden');
document.querySelector('.options').classList.remove('hidden');
});
Здесь , где я нашел рекомендации по методам World.clear
и Engine.clear
, и это помогло удалить все элементы из текущего холста.
Однако я сталкиваюсь с тем, что когда игрок выбирает новую сложность и нажимает кнопку «Go», создается новый холст внутри существующего world
, рядом с / под старым, теперь пустым. , canvas.
Как мне избавиться от этого старого холста, чтобы полностью переинициализировать?