繁体   English   中英

使用Meteor将数据从服务器流式传输到客户端:

[英]Streaming data from the Server to Client with Meteor:

我正在使用Meteor开发基于文本的冒险游戏,我遇到了如何处理某些元素的问题。 即,如何在没有客户端任何输入的情况下将数据从服务器发送到客户端。

这个想法是,当玩家与怪物进行战斗时,战斗损坏和更新玩家和怪物对象将在服务器上循环发生。 当玩家受到伤害时,它应相应地更新客户端UI。 发布/订阅是否可以这样?

我基本上想要一些东西,并且从服务器监听事件以相应地更新战斗日志。

在伪代码中,这是我正在寻找的东西:

// Client Side:
Meteor.call("runCommand", "attack monster");

// Server Side
Meteor.methods({
    runCommand: function(input) {
        // Take input, run the loop to begin combat, 
        // whenever the user takes damage update the 
        // client UI and output a line saying how much 
        // damage the player just received and by who
    }
});

我知道你可以将一个集合发布到客户端,但这并不是我正在寻找的函数的特定内容,我不想将整个Player对象发布到客户端,我只是想告诉客户端在文本框中写一条线,上面写着“你被怪物击中了12点伤害!”。

我希望有一个类似于SocketIO的功能,如果我愿意的话,只需向客户端发出一个事件,告诉它更新UI。 如果我需要的话,我想我可以使用SocketIO,但人们似乎坚持认为这样的事情完全没有SocketIO就可以使用Meteor,我只是不明白怎么做。

我在这种情况下看到的唯一出局是:编写所有游戏逻辑客户端,感觉这是一个坏主意,将所有战斗日志写入一个似乎非常过分的集合(但可能不是?),或使用一些一种SocketIO类型工具,只是向客户端发出消息,告诉它写一个新行到文本框。

使用Meteor,创建战斗日志集合似乎是您拥有的最简单的选项。 您只能收听added事件,然后在战斗结束时清除集合。 它应该是这样的:

var cursor = Combat_Log.find();
var handleCombatLog = cursor.observe({
  added: function (tmp)
  {
    // do your stuff
  }
});

在这里问一个类似的问题,希望这会有所帮助^^

这是我没有收藏的方式。 我认为你关心创造一个是正确的。 那不是一个好主意。 首先安装Streamy。

https://atmospherejs.com/yuukan/streamy

然后在服务器上

    //find active sockets for the user by id
    var sockets = Streamy.socketsForUsers(USER_ID_HERE)._sockets
    if (!Array.isArray(sockets) || !sockets.length) {
        //user is not logged in
    } else {
        //send event to all open browser windows for the user
        sockets.forEach((socket) => {
            Streamy.emit('ddpEvent', { yourKey:yourValue }, socket);
        })
    }

然后在客户端中,像这样回复它:

Streamy.on('ddpEvent', function(data) {
    console.log("data is ", data); //prints out {yourKey:yourValue}
});

暂无
暂无

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

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