简体   繁体   English

节点Socket.io对象故障

[英]Node Socket.io object trouble

I'm having some trouble with Node Socket.IO 我在使用Node Socket.IO时遇到了一些麻烦

I have put all my code in pastebins 我把我所有的代码都放在了pastebins中

Server file 服务器文件

var io = require("socket.io").listen(1337);

io.set("log level", "0");

var particles = [];
var players = [];
var remove_loop;
var particle;



io.sockets.on("connection", function(socket) {

    //connection
    socket.emit("hello");
    console.log("A new connection has been established");

    //new player
    socket.on("new_player", function() {
        players.push(socket.id);
        console.log("New player connected.");
        console.log("ID: " + socket.id);
    });

    //new particle
    socket.on("new_particle", function(data) {
        particle = data;
        socket.broadcast.emit("particles_data", particle);
    });

});

Game file 游戏档案

window.onload = function() {

    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext("2d");

    //display settings
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;

    setInterval(function() {
        if(canvas.width != window.innerWidth || canvas.height != window.innerHeight) {
            canvas.width = window.innerWidth;
            canvas.height = window.innerHeight;
        }
    }, 1000);

    //remove cursor
    document.getElementById("canvas").style.cursor = "none";

    //server connection
    var socket = io.connect("http://localhost:1337");


    //variables
    var update_loop;
    var draw_loop;
    var local_player;
    var mouse_x;
    var mouse_y;
    var remote_players;
    var particles;
    var remove_loop;
    var explosion;
    var background_color;


    init();
    function init() {
        //initialize

        local_player = new Player();
        background_color = "000000";
        explosion = true;
        remote_players = [];
        particles = [];

        draw_loop = setInterval(function() { draw(); }, 10);
        update_loop = setInterval(function() { update(); }, 10);

        //server
        socket.on("hello", function() {
            socket.emit("new_player");
        });

        socket.on("particles_data", function(data) {
            particles.push(data);
        });

    };


    function update() {

        for(var i = 0; i < particles.length; i++) {
            particles[i].move();
        }

    };


    function draw() {
        //background_color
        ctx.fillStyle = "#" + background_color;
        ctx.fillRect(0, 0, canvas.width, canvas.height);

        //remove particles
        setInterval(function() {
        if(!remove_loop) remove_loop = setInterval(function() {
                setTimeout(function() {
                    if(particles.length > 0) {
                        particles.shift();
                    }
                }, 1); 
            }, 20);
    }, 10);

        //particles
        for(var i = 0; i < particles.length; i++) {
            if(particles[i].x < canvas.width &&
                particles[i].y < canvas.width) {
                if(particles[i].x < canvas.width &&
                    particles[i].y < canvas.height) { 
                    particles[i].draw(ctx);
                }
            }
        }

    }

    function newParticle() {
        socket.emit("new_particle", new Particle(local_player.x, local_player.y, local_player.color));
        particles.push(new Particle(local_player.x, local_player.y, local_player.color));
    };

    //move mouse
    canvas.onmousemove = function(event) {
        if(!event) event = window.event;
        local_player.x = event.pageX;
        local_player.y = event.pageY;

        newParticle();
    };

    //touch mouse (phones/tables)
    canvas.onmousedown = function(event) {
        if(!event) event = window.event;
        local_player.x = event.pageX;
        local_player.y = event.pageY;

        newParticle();
    }

};

Player file 播放器文件

function Player() {
    this.x = 0;
    this.y = 0;
    this.color = Math.floor(Math.random() * 999999);
    while (this.color < 100000) {
        this.color = Math.floor(Math.random() * 999999);
    }
};

Particle file 粒子文件

function Particle(x, y, color) {
    this.start_x = x;
    this.start_y = y;
    this.speed = Math.floor(Math.random() * 3 + 1);
    this.x = x;
    this.y = y;
    this.size = Math.floor(Math.random() * 3 + 1);
    this.color = "#" + color;
    this.direction = Math.floor(Math.random() * 8);
    this.move = function() {
        this.speedDecreaseChance = Math.random(Math.random() * 100);
        //Chance that the particle loses it's velocity like you would
        //see with real particles
        if(this.speedDecreaseChance > 3) { this.speed -= 0.5 };
        //It's important that they move -AWAY- from X and Y.
        this.subDirection = Math.floor(Math.random() * 2);
        if(this.direction == 0) { //upper left
            if(this.subDirection == 0) {
                this.x -= this.speed;
            } else if(this.subDirection == 1) {
                this.y -= this.speed;
            } 
        } else if(this.direction == 1) { //bottom right
            if(this.subDirection == 0) {
                this.x += this.speed;
            } else if(this.subDirection == 1) {
                this.y += this.speed;
            }
        } else if(this.direction == 2) { //upper right
            if(this.subDirection == 0) {
                this.x += this.speed;
            } else if(this.subDirection == 1) {
                this.y -= this.speed;
            } 
        } else if(this.direction == 3) { //bottom left
            if(this.subDirection == 0) {
                this.x -= this.speed;
            } else if(this.subDirection == 1) {
                this.y += this.speed;
            }
        } else if(this.direction == 4) { //left
            this.x -= this.speed/1.5;
            if(this.subDirection == 0) {
                this.y -= this.speed;
            } else if(this.subDirection == 1) {
                this.y += this.speed;
            }
        } else if(this.direction == 5) { //up
            this.y -= this.speed/1.5;
            if(this.subDirection == 0) {
                this.x -= this.speed;
            } else if(this.subDirection == 1) {
                this.x += this.speed;
            }
        } else if(this.direction == 6) { //right
            this.x += this.speed/1.5;
            if(this.subDirection == 0) {
                this.y -= this.speed;
            } else if(this.subDirection == 1) {
                this.y += this.speed;
            }
        } else if(this.direction == 7) { //down
            this.y += this.speed/1.5;
            if(this.subDirection == 0) {
                this.x -= this.speed;
            } else if(this.subDirection == 1) {
                this.x += this.speed;
            }
        }
    };
    this.draw = function(ctx) {
        ctx.beginPath();
        ctx.shadowColor = this.color;
        ctx.shadowBlur = 8;
        ctx.arc(this.x, this.y, this.size ,0 ,2*Math.PI);
        ctx.fillStyle = this.color;
            ctx.fill();
        ctx.shadowBlur = 0;
    };
};

Now the problem is that there's an error in my traffic between the server and all sockets. 现在的问题是服务器和所有套接字之间的流量有错误。 What I want to do is make it possible that when one has particle objects to send them to the server and the server sends them to everyone except the original sender. 我想做的是使当一个具有粒子对象的对象可以将它们发送到服务器,而服务器将它们发送给除原始发送者之外的所有人。

I did this through socket.broadcast.emit(); 我是通过socket.broadcast.emit();完成的 This went successful. 这成功了。

However when the objects arrive at the other sockets I get this error: 但是,当对象到达其他套接字时,出现此错误:

Uncaught TypeError: Object #<Object> has no method 'move'
Uncaught TypeError: Object #<Object> has no method 'draw' 

For every particle object that exists at that moment. 对于当时存在的每个粒子对象。 If anyone knows why my objects lose their methods and would be so friendly to help a programmer in distress I'd be absolutely delighted :) 如果有人知道为什么我的对象会丢失他们的方法,并且如此友好地帮助程序员陷入困境,我绝对会非常高兴的:)

Thanks in advance! 提前致谢!

From what I know Socket.IO expected JSON data as 2nd parameter for the emit function. 据我所知,Socket.IO希望将JSON数据作为第二个参数用于发出函数。 JSON data format doesn't support function as values according to http://www.json.org/ JSON数据格式不支持根据http://www.json.org/作为值的功能

You are sending a javascript object and expecting the object to be created from the json on a different client. 您正在发送一个javascript对象,并期望在其他客户端上从json创建该对象。 This is not how Socket.IO communication works. 这不是Socket.IO通信的工作方式。

Instead of doing that you should send the data required to construct the object and use that to construct the object on the client. 而不是这样做,您应该发送构造对象所需的数据,并使用该数据在客户端上构造对象。

You could do some thing like the following 您可以执行以下操作

Change this line 更改此行

socket.emit("new_particle", new Particle(local_player.x, local_player.y, local_player.color));

to

socket.emit("new_particle", {x:local_player.x, y:local_player.y, color:local_player.color});

and then the event listener 然后是事件监听器

socket.on("particles_data", function(data) {
  particles.push(data);
});

to handle the creation of object from the data 处理根据数据创建对象

socket.on("particles_data", function(data) {
  particles.push(new Particle(data.x, data.y, data.color));
});

When an object is serialized to JSON, it loses all type information. 当对象序列化为JSON时,它将丢失所有类型信息。 This is what socket.io is transmitting. 这就是socket.io正在传输的内容。

var particle = new Particle(1, 2, 'ccc');
console.log(JSON.stringify(particle)); // {"start_x":1,"start_y":2,"speed":3,"x":1,"y":2,"size":3,"color":"#ccc","direction":5} 

You can't tell if it's a particle or a monkey or something else. 您无法分辨是粒子还是猴子或其他东西。

When you receive this object, you need to convert it to a Particle first. 收到该对象时,需要先将其转换为Particle

socket.on("particles_data", function(data) {
    var particle = ...;
    particles.push(particle);
});

You could define a constructor and create it again: 您可以定义一个构造函数并再次创建它:

var particle = new Particle(data.x, data.y, data.color);

Or you could change its prototype: 或者,您可以更改其原型:

var particle = $.extend(new Particle(), data); // here using jQuery helper method

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM