Проблема в том, что холст HTML не выводит символьный объект внутри холста.Холст определяется как gameArea
, а персонаж - как персонаж.Оба написаны на JavaScript, и персонаж превращается в объект.
Это для 2D-платформерной игры, поэтому я пытался изменить форму объекта персонажа на переменную, чтобы увидеть, вызывает ли инкапсуляция объекта проблемы, но это не сработало.Я также попытался добавить новую функцию в символьном объекте под названием update, чтобы убедиться, что символ (прямоугольник) заполняется при перемещении.
Вот мой код:
Первыйsection объявляет символьную переменную, а также имеет функцию , которая сначала запускается в HTML с использованием onload
:
var Character;
function startGame(){
gameArea.start();
Character = new character(40, 80, "#4286f4", 30, 500, true, 0, 0);
}
Параметры для символьного объекта: width
,height
, colour
, x, y, состояние прыжка, speedX
и speedY
(также показано далее в коде).
Во втором разделе показана переменная gameArea (canvas) , я также назвал свои EventListeners Keydown и Keyup здесь:
var gameArea = {
canvas: document.getElementById("canvas"), //Defining the canvas'
//dimensions
start: function() {
this.canvas.width = 700;
this.canvas.height = 500;
this.context = this.canvas.getContext("2d");
document.body.insertBefore(this.canvas,document.body.childNodes[0]);
this.interval = setInterval(updateGameArea, 20);
window.addEventListener('keydown', function (e) {//EventListener
functions
gameArea.keys = (gameArea.keys || []);
gameArea.keys[e.keyCode] = (e.type == "keydown");
})
window.addEventListener('keyup', function (e) {
gameArea.keys[e.keyCode] = (e.type == "keydown");
})
},
clear : function(){
this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
}
}
Следующий раздел - это символьный объект :
function character(width, height, color, x, y, jumping, speedX, speedY)
{//Character object, blue rectangle
this.jumping=jumping;
this.width = width;
this.height = height;
this.x = x;
this.y = y;
this.speedX = speedX;
this.speedY= speedY;
ctx = gameArea.context;
ctx.fillStyle = color;
ctx.fillRect(this.width, this.height, this.x, this.y);
this.update = function() {//Updating the gameArea function
ctx = gameArea.context;
ctx.fillStyle = color;
ctx.fillRect(this.x, this.y, this.width, this.height);
}
}
Насколько мне известно, приведенный выше код является единственным релевантным кодом для решения проблемы. Если необходимо, остальной код (логика контроллера и механика движения) можно найти ниже:
function updateGameArea() {
gameArea.clear();
character.speedX = 0;
character.speedY = 0;
character.update();
var controller = {
up: false,
down: false,
left: false,
right: false,
keyListener: function (event) {
var keyPosition = (event.type == "keydown") ? true : false;
switch (event.keyCode) {
case 87:
controller.up = keyPosition;
break;
case 83:
controller.down = keyPosition;
break;
case 65:
controller.left = keyPosition;
break;
case 68:
controller.right = keyPosition;
break;
}
}
};
if (controller.up && character.jumping == false) {
character.speedY -= 2.5
character.jumping = true;
}
if (controller.down) {
character.speedY += 2.5;
}
if (controller.left) {
character.speedX -= 2.5;
}
if (controller.right) {
character.speedX += 2.5;
}
character.speedY += 1.5;
character.x = character.speedX;
character.y = character.speedY;
character.speedX *= 0.9;
character.speedY *= 0.9
var ground = gameArea.canvas.height - this.height;
if (this.y > ground) {
character.jumping = false;
character.y = ground;
character.speedY = 0;
}
}
Ожидаемые результаты: персонаж отображается внутри холста и имеетправильное движение
Фактические результаты: символ не отображается.
Я понимаю, что здесь много кода, но я был бы очень признателен, если бы кто-то мог указать мне правильное направление, какЯ не очень понимаю, почему персонаж не отображается на холсте.
Спасибо большое!