phaser.js + socket.io emit on "isDown"
phaser.js + socket.io emit on "isDown"
我正在玩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;
});
},
};
相关文章:
- 铬:“;未捕获的语法错误:意外的标记:"
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- 使用“+="操作人员
- //而不是在src=“”上使用http://"属性
- "未捕获的语法错误:意外的标记}"
- 可以<脚本类型=“;text/javascript”>window.location=“/"</
- "实例范围”;TypeScript类的getter/setter
- Javascript复选框函数:;缺少:在属性id之后"
- "“;变量未引用正确的对象
- "日期“;AJAX请求返回的类型值未定义
- 得到"TypeError:无法读取属性'filename'未定义的“;调用“npm start
- Soundcloud api"未捕获的类型错误:无法读取属性'uri'“未定义”;
- "工具提示"jQuery插件坏了
- "锻造;React中的表达式
- 图像可以从源<img src=""/>.TEXT可以在没有javascript的情况下从外部
- 如何提取“;href"最近列表项中的属性值
- CKEditor如何允许href="javascript:void(0)"在小部件中
- 插入“;img src"在javascript中