У меня проблемы с реализацией ввода с клавиатуры в мое веб-приложение / игру - PullRequest
0 голосов
/ 10 февраля 2020

Итак, я пытаюсь внедрить движение wasd в мою веб-игру, и оно на самом деле не работает.

HTML:

 <canvas id="ctx" width="500" height="500" style="border:1px solid #000000;"></canvas>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Teal</title>
</head>
<body>
test
</body>
</html>

<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
<script>
    var ctx = document.getElementById("ctx").
    getContext("2d")
    ctx.font = '20px Arial'

    var socket = io();

    socket.on('newPositions',function(data) {
        ctx.clearRect(0,0,500,500);
        for(var i = 0 ; i < data.length; i++)
            ctx.fillText(data[i].number,data[i].x,data[i].y);
    });

    document.onkeydown = function(event) {
        if(KeyboardEvent.code === 68) //d
            socket.emit('keyPress',{inputId:'right',state:true});
        else if(KeyboardEvent.code === 83) //s
            socket.emit('keyPress',{inputId:'down',state:true});
        else if(KeyboardEvent.code === 65) //a
            socket.emit('keyPress',{inputId:'left',state:true});
        else if(KeyboardEvent.code === 87) //w
            socket.emit('keyPress',{inputId:'up',state:true});

    };
    document.onkeyup = function(event) {
        if(KeyboardEvent.code === 68) //d
            socket.emit('keyPress',{inputId:'right',state:false});
        else if(KeyboardEvent.code === 83) //s
            socket.emit('keyPress',{inputId:'down',state:false});
        else if(KeyboardEvent.code === 65) //a
            socket.emit('keyPress',{inputId:'left',state:false});
        else if(KeyboardEvent.code === 87) //w
            socket.emit('keyPress',{inputId:'up',state:false});

    };

</script>

JS:

var express = require('express');
var app = express();
var serv = require('http').Server(app);

app.get('/',function(req, res) {
    res.sendFile(__dirname + '/client/index.html')
});
app.use('client',express.static(__dirname + '/client'));

serv.listen(2000);
console.log("Server started.");

var SOCKET_LIST = {};
var PLAYER_LIST = {};

var Player = function(id) {
    var self = {
        x:250,
        y:250,
        id:id,
        number:"" + Math.floor(10 * Math.random()),
        pressingRight:false,
        pressingLeft:false,
        pressingUp:false,
        pressingDown:false,
        maxSpd:10,
    };
    self.updatePosition = function(){
        if(self.pressingRight)
            self.x += self.maxSpd;
        else if(self.pressingLeft)
            self.x -= self.maxSpd;
        else if(self.pressingUp)
            self.y -= self.maxSpd;
        else if(self.pressingDown)
            self.y += self.maxSpd;
    };

    return self;
};

var io = require('socket.io')(serv,{});
io.sockets.on('connection', function(socket) {
    socket.id = Math.random();
    SOCKET_LIST[socket.id] = socket;

    var player = Player(socket.id);
    PLAYER_LIST[socket.id] = player;

    socket.on('disconnect',function(){
        delete SOCKET_LIST[socket.id];
        delete PLAYER_LIST[socket.id];
    });

    socket.on('keyPress',function(data){
        if(data.inputId === 'left')
            player.pressingLeft = data.state;
        else if(data.inputId === 'right')
            player.pressingRight = data.state;
        else if(data.inputId === 'up')
            player.pressingUp = data.state;
        else if(data.inputId === 'down')
            player.pressingDown = data.state;
    });

});

setInterval(function(){
    var pack = [];
    for(var i in PLAYER_LIST) {
        var player = PLAYER_LIST[i];
        player.updatePosition();
        pack.push({
            x:player.x,
            y:player.y,
            number:player.number
        });
    }
    for(var i in SOCKET_LIST) {
        var socket = SOCKET_LIST[i];
        socket.emit('newPositions',pack);
    }

},1000/25);

Я также пытался использовать keyboardevent.keycode, но увидел, что это не рекомендуется, так как теряет поддержку. Я довольно новичок в HTML и Javascript. Предполагается, что эта программа позволяет перемещать числа, управляемые wasd, на холсте, а также видеть движения других чисел на разных вкладках.

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