[英]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.