phaser.js + socket.io emit on "isDown"

phaser.js + socket.io emit on "isDown"

本文关键字:quot isDown on emit js socket io phaser      更新时间:2023-09-26

我正在玩phaser和socket.io,想制作多人突破游戏。我现在正在构建应该在两个客户端之间同步的桨板。因此,当你在一个客户端中移动桨板时,它在另一个客户端也会移动,反之亦然。

它可以工作,但服务器发送的数据太多。问题可能出现在"isDown"中,因为当按键时,它的数据传输速度非常快。这就是服务器疯狂发送数据的原因。此外,套接字在不按任何键的情况下发射数据。我想通过"发送检查"来解决这个问题,但它不能正常工作,因为即使什么都没按,数据也会被发送。如何限制客户端/服务器仅在真正需要时发送数据?

这是代码:

客户端

// connect to the socket server
var socket = io();
var main = {
  preload: function() {
    game.load.image('paddle', 'images/paddle.png');
  },
  create: function() { 
      game.physics.startSystem(Phaser.Physics.ARCADE);
      this.cursor = game.input.keyboard.createCursorKeys();
      this.paddle = game.add.sprite(200, 400, 'paddle');
      game.physics.arcade.enable(this.paddle);
      //game.stage.disableVisibilityChange = true;
      this.paddle.body.immovable = true;
  },
  update: function() {
    var that = this;
    var pos = this.paddle.position.x;
      if (this.cursor.right.isDown){
            that.paddle.body.velocity.x = 350;
            socket.emit('paddle-mov', {send:true}, pos);        
      } 
      else if (this.cursor.left.isDown) {
            that.paddle.body.velocity.x = -350;
            socket.emit('paddle-mov', {send:true}, pos);
      }
      else {
        that.paddle.body.velocity.x = 0;
        socket.emit('paddle-mov', {send:true}, pos);            
      }
      socket.on('paddle-mov-back', function(inx){
            console.log(inx);
            that.paddle.position.x = inx;
        });
  },
};
// Initialize Phaser, and start our 'main' state 
var game = new Phaser.Game(400, 450, Phaser.AUTO, 'gameDiv');
game.state.add('main', main);
game.state.start('main');

服务器

#!/usr/bin/env node
var debug = require('debug')('test');
var app = require('../app');
var server = app.listen(3000);
var io = require('socket.io').listen(server);
io.on('connection', function(socket){   
    socket.on('paddle-mov', function(send, inx){
        if (send.send == true) {
            socket.broadcast.emit('paddle-mov-back', inx);
            send.send = false;
        };
    });
});

添加buttonPressed标志,您应该能够减少数据

// connect to the socket server
var socket = io();
var buttonPressed = false;
  var main = {
     preload: function() {
     game.load.image('paddle', 'images/paddle.png');
  },
  create: function() { 
      game.physics.startSystem(Phaser.Physics.ARCADE);
      this.cursor = game.input.keyboard.createCursorKeys();
      this.paddle = game.add.sprite(200, 400, 'paddle');
      game.physics.arcade.enable(this.paddle);
      //game.stage.disableVisibilityChange = true;
      this.paddle.body.immovable = true;
   },
  update: function() {
    var that = this;
    var pos = this.paddle.position.x;
      if ((this.cursor.right.isDown || this.cursor.left.isDown) && buttonPressed == false){
            buttonPressed = true;
            that.paddle.body.velocity.x = 350;
            socket.emit('paddle-mov', {send:true}, pos);        
      } 
      else {
        buttonPressed = false;
        that.paddle.body.velocity.x = 0;
        socket.emit('paddle-mov', {send:true}, pos);            
      }
      socket.on('paddle-mov-back', function(inx){
            console.log(inx);
            that.paddle.position.x = inx;
        });
  },
};