我正在开发一个非常简单的游戏在HTML5与惊人的phaser.io。游戏非常简单: 1vs1截击游戏在2D.实际上,它是伟大的“皮卡丘截击”(http://imagenes.es.sftcdn.net/es/scrn/12000/12531/pikachu-volleyball-2.jpg)的‘复制’。
就像我说的,游戏很简单,我有:
我只需要控制:-球员的动作-球的动作(实际上是由拱门物理控制的)-球员-球碰撞
我只是为了好玩,把朋友的脸加到球员身上。这个游戏运行得很好,我和朋友玩得很开心。所以我想,为什么不让它在线多人玩,这样我们就可以在不同的地方远程玩了?
在阅读了有关多人HTML5游戏的文章之后,我开始使用具有nodeJS服务器的websocket(socket.io)开发它。socket.io的实现非常简单,通信也很好。
问题是要使游戏实际上是可玩的。
这些是我现在的脚步:
在客户端连接上,它被创建:
客户端等待一个新的客户端对分,以创建:
因此,在连接两个客户端之后,在每个客户端上:
然后游戏开始..。在这个舞台上,这是不公平的,因为远程球员,它根本没有移动。因此,为了让远程播放器移动(经过一些尝试),我决定实现一种权威的服务器,这样的工作。
这个技工使球员的动作在过去工作,但“同步”(等待时间是可以接受的)。
这看起来很棒,每个客户都在移动他们的玩家,还有另一个玩家被一个远程客户端移动。
问题是球..。
每个客户都有一个球,移动与拱门物理(反弹在网或在每个球员的头部).所以在很少的动作后,由于球员位置的同步不完美,每个客户的球位都不一样。
如何实现球同步?
我在想一些选择:
发布于 2016-01-10 16:45:52
为了解决您的问题,您可以采取一种简单的方式,您可以转移到服务器,即正在附加的播放器的攻击状态,现在,所有玩家从服务器订阅攻击信息和现在的“斜线”必须呈现子弹。
这里有一个小小的代码示例
Part1:发布数据
transferData = [
{
id: id,
name: Player.name,
position: Player.position,
facing: Player.facing,
hitFacing: Player.hitFacing,
health: Player.health,
energie: Player.energie,
healtbar: {width: Player.healthbar.width},
energiebar: {width: Player.energiebar.width},
isAttacking: Attack.isAttacking
}
];
session.publish('org.example.character.data', transferData);
Attack.isAttacking = false;
Part2:订阅数据
// get player position
session.subscribe('org.example.character.data',function (args) {
var player = args[0];
var exists = false;
for (var i = 0; i < onlinePlayer.length; i++) {
if (onlinePlayer[i].uid == player.uid) {
var tmp = onlinePlayer[i];
player.sprite = tmp.sprite;
player.label = tmp.label;
player.status = tmp.status;
if (player.isAttacking && player.sprite != undefined) {
// HERE RENDER THE BALL
renderBall(player, this.game);
}
onlinePlayer[i] = player;
exists = true;
}
}
if (!exists)
onlinePlayer.push(player);
}).then(
function (sub) {
//console.log('subscribed to topic');
},
function (err) {
console.log('failed to subscribe to topic', err);
}
);
这个例子是针对websocket服务器的,比如crossbar.io和autobahn.js在节点基础上。
http://crossbar.io/docs/Quick-Start/,但您也可以使用其他服务器实现它。
发布于 2015-12-10 12:40:20
你的问题让我想起了我过去的一个问题,那就是微笑。我在网上做地图应用程序。对所有客户端来说,Map对象必须是相同的(同步)。
我解决这个问题的方法是将类库移到服务器端,并使map对象单例化。看看单例模式。单例对象不能不止一次实例化。我的意思是,每一场比赛都会有一个球,客户会用它更新他们的本地对象。
这是维基百科的网页:pattern
在此之后,客户端要做的第一件事是获取映射的最近实例(即在您的例子中的球),修改和更新服务器。
另一点是,不止一个客户端可能希望在sime时间更新服务器上的共享对象。这将导致一致性问题。许多实现包括对变量的锁以限制访问。其他客户端则等待锁的释放和更新。
无论如何,在客户端拥有同一个对象的多个实例并不是一个好方法。
https://stackoverflow.com/questions/34201558
复制相似问题