Можно ли запускать несколько операторов if одновременно в ванильном Javascript?Если да, то как ты? - PullRequest
0 голосов
/ 04 мая 2019

Я пишу игру, используя canvas в html, CSS и ванильный Javascript.Я сделал двух персонажей и добавил в них элементы управления движением.Единственная проблема заключается в том, что когда я его выполняю, мне нужно подождать, пока игрок 1 нажмет любую клавишу для перемещения своего персонажа, а затем игроку 2 будет разрешено указать, как движется его персонаж.

Игрок 1 использует пачкуклавиши для перемещения и игрок 2 клавиши со стрелками.Я не могу понять, как заставить их одновременно нажимать и перемещать кнопки.Когда я пытаюсь это сделать, символ, клавиша ввода которого была нажата первой, не будет двигаться, пока перемещается второй символ.Также, если игрок хочет прыгать и двигаться вправо, это невозможно.На данный момент программа работает путем перерисовки символов (квадратов) в различном пространстве в зависимости от того, какая клавиша нажата.

    var canvas;
    var context;
    var framesPerScond=30;
    //player1
    var player1X=110;
    var player1Y=650;
    var gravity1=1;

    //player2
    var player2X=810;
    var player2Y=650;
    var gravity2=1;

    window.onload = function(){
        canvas=document.getElementById("canvas");
        context=canvas.getContext("2d");
        console.log("Onload Working");

        setInterval(function(){
            drawEverything();
        }, 1000/framesPerScond);

        document.addEventListener('keydown', function(event){
            MoveEverything(event);
        });
    }

    function drawEverything(){
        //move player 1
        if(player1Y<450){
            player1Y=450;
        }
        else if(player1Y<650){
            player1Y+=gravity1;
            gravity1+=1;
        }
        else if(player1Y=650){
            player1Y=650;
            gravity1=1;
        }
        //move Player2
        if(player2Y<450){
            player2Y=450;
        }
        else if(player2Y<650){
            player2Y+=gravity2;
            gravity2+=1;
        }
        else if(player2Y=650){
            player2Y=650;
            gravity2=1;
        }
        colorRect(0,0,canvas.width,canvas.height, 'white');
        colorRect(0,690, canvas.width,10, '#7e7e7e');
        colorRect(player1X,player1Y,40,40,'#7F0019');
        colorRect(player2X,player2Y,40,40, '#003366');
    }

    function MoveEverything(event){
        var key_press=String.fromCharCode(event.keyCode);
        var key_code=event.keyCode;
        console.log(key_code,key_press);
        //player 1 movement
        if(key_press=="D"){
            player1X+=10; 
        }
        else if(key_press=="A"){
            player1X-=10;
        }
        else if(key_press=="W"){
            player1Y-=200;
        }
        else if(key_code==39){
            player2X+=10;
        }
        else if(key_code==37){
            player2X-=10;
        }
        else if(key_code==38){
            player2Y-=200;
        }
    }



    function colorRect(leftX, leftY, width, height, color){
        context.fillStyle=color;
        context.fillRect(leftX,leftY,width,height);
    }

Мне было интересно, решит ли это одновременное выполнение оператора «if».Если не будет, есть ли другие решения этой проблемы?

1 Ответ

0 голосов
/ 04 мая 2019

Нет, JavaScript является однопоточным, и он не решит вашу проблему, он только создает условия гонки.

Чтобы решить эту проблему, создайте временную переменную для каждого изменяемого значения и примените ее после if s закончены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...