Основные проблемы, по-видимому, связаны с ReassignCollisionBox(), который вызывает ошибку памяти, и в нижней части update(). Я не уверен, как заставить это столкновение работать, поскольку все источники, которые я могу найти, предназначены для какого-то игрового движка, а не для JavaScript.
Код: Выделить всё
//Reassign the collisions and clear the orginal.
CollisonBoxes.length = 0;
for(let i=0; level.length; i++) {
for(let k=0; level[i].length; k++) {
ReassignCollisionBox(i,k);
}
}
//Note these code is not actually next to each other, this is in the update ^
function ReassignCollisionBox(down,right) {
let xmin = down * tilesize; //Upper Left Corner, X
let ymin = down * tilesize; //Upper Left Corner, Y
let xmax = xmin + tilesize; //Bottom Right corner, X
let ymax = ymin + tilesize; //Bottom Right Corner, Y
CollisonBoxes.push([[xmin,ymin],[xmax,ymax]])
return(true);
}
Это... в основном рабочий код, без функций CollisionBox, но проблема все равно проваливается под пол.
< pre class="snippet-code-js lang-js" Prettyprint-override">
Код: Выделить всё
const stage = document.getElementById("stage");
const ctx = stage.getContext("2d");
ctx.fillRect(0, 0, stage.width, stage.height);
let keys = {};
window.addEventListener('keydown', (event) => {
keys[event.key] = true;
});
window.addEventListener('keyup', (event) => {
keys[event.key] = false;
});
game = {
cameraX: 0,
cameraY: 0,
pause: false,
pausedelay: 0,
fontSize: 16,
font: function() {
return this.fontSize.toString() + "px Arial";
}
};
player = {
x: 0, // Starting position for the player
y: 48,
width: 16,
height: 16,
dx: 0, // Change in x (velocity)
dy: 0, // Change in y (velocity for gravity)
speed: 2, // Player movement speed
gravity: 0.5, // Gravity force
jumpPower: -10, // Jump force (upward)
grounded: false // Check if the player is on the ground
};
level = [
[
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
[
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
[
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
[
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
[
[1, 8],
[1, 0],
[1, 8],
[1, 0],
[1, 8],
[1, 0],
[1, 8],
[1, 0],
[1, 8],
[1, 0],
[1, 8],
[1, 0],
[1, 8],
[1, 0],
[1, 8],
[1, 0],
[1, 8],
[1, 0],
[1, 8],
[1, 0]
],
[
[1, 0],
[1, 8],
[1, 0],
[1, 8],
[1, 0],
[1, 8],
[1, 0],
[1, 8],
[1, 0],
[1, 8],
[1, 0],
[1, 8],
[1, 0],
[1, 8],
[1, 0],
[1, 8],
[1, 0],
[1, 8],
[1, 0],
[1, 8]
],
[
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0]
],
[
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0]
],
[
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0]
],
[
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 8],
[1, 0],
[1, 0]
]
];
//Game CollisonBox
CollisonBoxes = [];
colors = [
"rgb(0, 0, 0)", // 0 - Black
"rgb(255, 255, 255)", // 1 - White
"rgb(255, 0, 0)", // 2 - Red
"rgb(0, 255, 0)", // 3 - Green
"rgb(0, 0, 255)", // 4 - Blue
"rgb(255, 255, 0)", // 5 - Yellow
"rgb(0, 255, 255)", // 6 - Cyan
"rgb(255, 0, 255)", // 7 - Magenta
"rgb(128, 128, 128)", // 8 - Gray
"rgb(255, 165, 0)" // 9 - Orange
];
const tilesize = 16;
window.onload = function() {
GameLoop();
}
function update() {
game.pausedelay -= 1;
if (keys['p'] && game.pausedelay tileX &&
player.x < tileX + tilesize &&
player.y + player.height > tileY &&
player.y + player.height stage.height) {
player.y = stage.height - player.height;
player.dy = 0;
player.grounded = true;
}
//Camera fix
if (player.x >= 80 || player.dx
Подробнее здесь: [url]https://stackoverflow.com/questions/79344402/side-scrolling-collisionbox-system-either-has-player-falling-through-floor-or-ru[/url]