我正在与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类型工具向客户端发出消息,告诉它在文本框中写一个新行。
答案 0 :(得分:1)
使用Meteor,创建战斗日志集合似乎是您拥有的最简单的选项。
你只能听added
事件,然后在战斗结束后清除收集。
它应该是这样的:
var cursor = Combat_Log.find();
var handleCombatLog = cursor.observe({
added: function (tmp)
{
// do your stuff
}
});
我问了一个类似的问题here,希望这会有所帮助^^
答案 1 :(得分:0)
这是我没有收藏的方式。我认为你关心创造一个是正确的。那不是一个好主意。首先安装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}
});