Member 12609013 Ответов: 1

Как мне исправить эту проблему с моей игрой


Я делаю игру, и на самом деле смысл в том, чтобы размахивать простым мечом или действительно вонзать его. Если вы нажмете клавишу " d " на клавиатуре, меч должен двигаться так, чтобы это выглядело как укол, удар или что-то еще. Вот мой код:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<style>
canvas {
    border:1px solid #d3d3d3;
    background-color: #f1f1f1;
}
</style>
</head>
<body onload="startGame()">

<script>
var myGamePiece, sword;

  
function startGame() {
  
    sword = new component(29, 5, "orange", 225, 225);
    myGamePiece = new component(30, 30, "blue", 225, 225);
    
    myGameArea.start();
}

var myGameArea = {
    canvas : document.createElement("canvas"),
    start : function() {
        this.canvas.width = 480;
        this.canvas.height = 270;
        this.context = this.canvas.getContext("2d");
        document.body.insertBefore(this.canvas, document.body.childNodes[0]);
        this.frameNo = 0;
        this.interval = setInterval(updateGameArea, 20);
        window.addEventListener('keydown', function (e) {
            e.preventDefault();
            myGameArea.keys = (myGameArea.keys || []);
            myGameArea.keys[e.keyCode] = (e.type == "keydown");
        })
        window.addEventListener('keyup', function (e) {
            myGameArea.keys[e.keyCode] = (e.type == "keydown");
        })
    },
    stop : function() {
        clearInterval(this.interval);
    },
    clear : function() {
        this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
    }
}


function component(width, height, color, x, y, type) {

    this.type = type;
    this.width = width;
    this.height = height;
    this.speed = 0;
    this.angle = 0;
    this.moveAngle = 0;
    this.x = x;
    this.y = y;
    this.update = function() {
        ctx = myGameArea.context;
        ctx.save();
        ctx.translate(this.x, this.y);
        ctx.rotate(this.angle);
        ctx.fillStyle = color;
        ctx.fillRect(this.width / -2, this.height / -2, this.width, this.height);
        ctx.restore();
    }
    this.newPos = function() {
        this.angle += this.moveAngle * Math.PI / 180;
        this.x += this.speed * Math.sin(this.angle);
        this.y -= this.speed * Math.cos(this.angle);
    }
}

function updateGameArea() {
    myGameArea.clear();
    myGamePiece.moveAngle = 0;
    myGamePiece.speed = 0;
    if (myGameArea.keys && myGameArea.keys[37]) {myGamePiece.x -=2; sword.x -=2 ;}
    if (myGameArea.keys && myGameArea.keys[39]) {myGamePiece.x += 2; sword.x += 2;}
    if (myGameArea.keys && myGameArea.keys[38]) {myGamePiece.y -= 1; sword.y -= 1;}
    if (myGameArea.keys && myGameArea.keys[40]) {myGamePiece.y += 1; sword.y += 1}
    if (myGameArea.keys && myGameArea.keys[83]) {jumping()}
    if (myGameArea.keys && myGameArea.keys[68]) {swingForth()}
    sword.newPos();
    sword.update();
    myGamePiece.newPos();
    myGamePiece.update();
} 

var swingForth = function(){
  sword.x + = 3}
  setTimeout(swordReturn, 100)
}
 
var swordReturn = function(){
  sword.x = myGamePiece.x
  sword.y = myGamePiece.y
}  
  


var jumping = function(){
  myGamePiece.y -=3
  sword.y -=3
  setTimeout(falling, 100)
}

var falling = function(){
  myGamePiece.y += 3
  sword.y +=3
}



</script>

<p></p>

</body>
</html>


Когда я запускаю код, это движение меча не работает (я назвал функцию swingForth). Может кто-нибудь объяснить почему?

Что я уже пробовал:

Я пытался искать какие-либо ошибки, но не могу найти ни одной.

1 Ответов

Рейтинг:
0

Sergey Alexandrovich Kryukov

О ... проблемы этого кода настолько серьезны, что я не знаю, о чем говорить. Первая проблема-это HTML. Есть только два элемента, дети body: script и p... Ничего не визуализируется. Элемент p пусто и code ничего не делать.

Строго говоря, HTML-контент body это не всегда необходимо. Вы можете добавить все элементы HTML DOM в JavaScript; и вы даже пытаетесь это сделать. Но тогда вам нужен какой-то работающий JavaScript-код, который действительно это делает. Ваш код просто создает несколько функциональных объектов. Ни одна из этих функций не вызывается. Итак, код делает то, что должен делать в соответствии с тем, что вы пишете: ничего.

Поэтому я ответил на ваш вопрос полностью; вы не просили писать рабочий код для вашего, и это справедливо. Мало того, что это не было бы целью Быстрый Вопросы и ответы форума, но это было бы даже невозможно, потому что вы даже не объяснили, что должна делать игра. Это также справедливо, потому что вы только хотели знать, почему какое-то движение не происходит. - Ответил я.

Но я хотел бы быть не таким формальным и дать вам несколько неформальных советов: что должно быть основой любой игры? Это должен быть основной цикл событий. Вы уже сделали один шаг, setTimeout вызов, но вызывающая функция никогда не вызывается. Но действительно правильный подход заключается в использовании window.requestAnimationFrame Идея цикла такова: вы передаете функцию этой функции, и эта функция выполняет игровой цикл, а затем вызывает window.requestAnimationFrame Пожалуйста, смотрите:
window.requestAnimationFrame () - веб-API.

Более того, эта функция, если она не реализована в некоторых реликтовых браузерах, может быть добавлена в качестве запасного варианта и реализована как вызов window.setTimeout Я не совсем уверен, что это всегда следует делать на практике, просто чтобы поддержать что-то очень устаревшее. Вы можете посмотреть образец полнофункциональной игры, показанный в моей статье (производная работа) Тетрис на холсте.

Итак, что вы можете сделать? Ну что ж, садитесь и действительно пишите код игры. :-)
Проблемы "почему какая-то функция не вызывается" или "не работает" решаются с помощью отладчика.

—СА