多人游戏同步球[英] Multiplayer game - synchronizing ball

问题描述

我正在使用Amazing Phaser.io在HTML5中开发一个非常简单的游戏.游戏非常简单:2D中的1VS1凌空游戏...实际上是大" Pikachu Qualley"的"复制"( http://imagenes.es.sftcdn.net/es/scrn/12000/12531/pikachu-volleyball-2.jpg ) .

正如我说的,游戏非常简单,我有:

  • 玩家1
  • Player2
  • 静态元素

我只需要控制: - 玩家运动 - 球运动(实际上由街机物理控制) - 球员球碰撞

我只是为了好玩,将朋友的面孔添加到玩家. 游戏运作良好,我和朋友一起玩很有趣.所以我想,为什么不让它在线多人游戏,所以我们可以从不同的位置远程玩?

阅读了有关多人游戏HTML5游戏后,我开始使用具有nodejs服务器的WebSocket(socket.io)开发它. socket.io的实现真的很简单,并且可以很好地工作.

事情是使游戏实际上可以玩.

这些是我现在的步骤:

在客户端连接上,它是创建的:

  • player1(我自己)
  • 静态元素

客户等待新的客户端文化来创建:

  • 远程玩家

因此,在连接两个客户端后,在每个客户端上都有:

  • ownplayer
  • remoteplayer
  • 静态元素

然后游戏开始...在此阶段,这不是很公平,因为远程播放器根本没有移动.因此,为了使远程播放器移动(经过一些尝试之后),我决定实现一种权威服务器,这样工作.

  • 本地播放器移动(输入注册) - >客户端将输入发送到服务器 - >服务器将输入发送给两个客户端 - >每个客户端应用运动(通过更改速度)

这种机械师使玩家的动作在过去工作,但"同步"(等待时间是可以接受的).

这看起来很棒,每个客户都在播放他们的播放器,还有另一个访问者通过远程客户端移动.

问题是球...

在每个客户上都有一个球,与街机物理学一起移动(在网中或每个玩家的头部弹跳)每个客户的位置不一样.

您将如何实现球同步?

我正在考虑的一些选项:

  • 定期将球位置发送到服务器 - >服务器将球位置发送到客户端 - >客户端更新球位置(带有一些插值)

  • 仅在一个客户端(主)中启用球物理学,然后定期将球位置从"主客户端"发送到"从属客户端"(也许是Webrtc,也许)

  • 重新开始并制作一个真正的"权威服务器",在服务器上拥有街机物理学(如果可能的话),只是在客户端上进行插值?

推荐答案

要解决您的问题,您可以采取简单的方法, 您转移到服务器,正在附加的播放器的攻击状态, 现在,所有播放器从服务器订阅攻击信息,现在" clints"必须渲染子弹.

在这里一个小块代码示例

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);
        }
    );

此示例适用于一个网站服务器,例如在节点基础上使用autobahn.js的CrossBar.io.

http://crossbar.io/docs/quick-start/ 但是您也可以与其他服务器一起制作

其他推荐答案

您的问题使我想起了我过去的问题.我在网上研究地图应用程序.所有客户端必须相同(同步).

我如何解决问题是,我已经将类库移至服务器端,并制作了MAP对象Singleton.看看Singleton图案.单例对象不能多次实例化.我的意思是,每个游戏都会有一个球对象,客户将使用它更新其本地对象.

这是Wikipedia页面:

之后,在客户端要做的第一件事是获得地图的最新实例(在您的情况下是球),修改和更新服务器.

另一点是,一个以上的客户可能想在SIME时更新服务器上的共享对象.那将导致一致性问题.许多实现都包括变量上的锁以限制访问.其他客户等待锁发布和更新.

无论如何,在客户端拥有同一对象的多个实例不是一个好方法.

本文地址:https://www.itbaoku.cn/post/1740216.html