html - 多人 HTML5、Node.js、Socket.IO

标签 html node.js canvas socket.io

我尝试使用 HTML5 Canvas、JavaScript(也使用 John Resig 简单继承库)和带有 Socket.IO 的 Node.js 创建简单的多人游戏。 我的客户代码:

var canvas  = document.getElementById('game');
var context = canvas.getContext('2d');
var socket  = new io.Socket('127.0.0.1', {port: 8080});

var player = null;

var UP    = 'UP',
    LEFT  = 'LEFT',
    DOWN  = 'DOWN',
    RIGHT = 'RIGHT';

socket.connect();

socket.on('connect', function() {socket.send();
    console.log('Connected!');
    player = new Player(50, 50);
});

socket.on('message', function(msg) {
    if(msg == 'UP') {
        player.moveUP();
    } else if(msg == 'LEFT') {
        player.moveLEFT();
    } else if(msg == 'DOWN') {
        player.moveDOWN();
    } else if(msg == 'RIGHT') {
        player.moveRIGHT();
    } else {

    }
});

socket.on('disconnect', function() {
    console.log('Disconnected!');
});

var Player = Class.extend({
    init : function(x, y) {
        this.x = x;
        this.y = y;
    },
    setX : function(x){
        this.x = x;
    },
    getX : function(){
        return this.x;
    },
    setY : function(y){
        this.y = y;
    },
    getY : function(){
        return this.y;
    },
    draw : function(){
        context.clearRect(0, 0, 350, 150);
        context.fillRect(this.x, this.y, 15, 15);
    },
    move : function() {
        this.x += 1;
        this.y += 1;
    },
    moveUP : function() {
        this.y--;
    },
    moveLEFT : function() {
        this.x--;
    },
    moveDOWN : function() {
        this.y++;
    },
    moveRIGHT : function() {
        this.x++;
    }
});

function checkKeyCode(event) {
    var keyCode;
    if(event == null) {
        keyCode = window.event.keyCode;
    } else {
        keyCode = event.keyCode;
    }

    switch(keyCode) {
        case 38: // UP
            player.moveUP();
            socket.send(UP);
        break;
        case 37: // LEFT
            player.moveLEFT();
            socket.send(LEFT);
        break;
        case 40: //DOWN
            player.moveDOWN();
            socket.send(DOWN);
        break;
        case 39: // RIGHT
            player.moveRIGHT();
            socket.send(RIGHT);
        break;
        default:
        break;

    }

}

function update() {
    player.draw();
}

var FPS = 30;
setInterval(function() {
    update();
    player.draw();
}, 1000/FPS);

function init() {
    document.onkeydown = checkKeyCode;
}

init();

和服务器代码:

var http = require('http'),
io = require('socket.io'),
buffer = new Array(),

server = http.createServer(function(req, res){
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end('<h1>Hello world</h1>');
});
server.listen(8080);

var socket = io.listen(server);

socket.on('connection', function(client){

    client.on('message', function(message){
        console.log(message);
        client.broadcast(message);
    })
    client.on('disconnect', function(){

    })

});

当我运行两个客户端时,第一个客户端可以移动第二个客户端矩形,第二个客户端移动第一个客户端矩形,第三个客户端可以移动第一个和第二个客户端矩形。

我有疑问如何创建真正的多人游戏?就像是: 打开三个客户端,第一个客户端得到 rect1,第二个 rect2 和最后一个 rect3。第一个客户端只能移动rect1,第三个客户端只能移动rect3。

也许有人知道吗?我在 Google 中搜索,但没有找到答案。

对不起我的英语。

最佳答案

首先,查看 http://www.google.com/events/io/2011/sessions/super-browser-2-turbo-hd-remix-introduction-to-html5-game-development.html

它解释了如何使用 requestAnimationFrame。

其次,游戏状态应该存在于服务器上,并镜像到客户端。

当玩家点击时,客户端应该只发送一条消息。然后,服务器应向所有客户端发送消息,包括执行该操作的客户端。

每个玩家都应该作为一个对象存在于服务器上。当玩家登录时,他们应该被告知已经在服务器上的每个玩家的最新状态。

修改客户端代码:http://codr.cc/s/d0154536/js

修改后的服务器代码:http://codr.cc/s/f96ce1d2/js

关于html - 多人 HTML5、Node.js、Socket.IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6244230/

相关文章:

html - 如何解决在 ionic 3 中实现搜索栏的管道时出现的错误(管道搜索无法找到或未找到)

javascript - 在 Node js 中使用 maingun 时,在 promisifyCall(ctx, fn, ...args) 中捕获了意外的 token ...

javascript - fabricjs 在 Canvas 上放置图像不一致

html - 将导航栏元素扩展到框阴影的整个宽度?

javascript - nodeJS - 我究竟可以把内容安全政策放在哪里

node.js - 我可以使用 Nuxt.js 从数据库中渲染数据吗?

node.js - Puppeteer 中的 page.select() 无法按剑道下拉菜单的预期工作

html - HTML5 canvas 动画的 blend 之类的软件?

javascript - 更改检测后在 Canvas 上绘制 angular2 图像

javascript - 鼠标悬停文本然后更改图像在 IE8-below 中不起作用