2015-01-20 3 views
5

Я разрабатываю текстовую приключенческую игру с Meteor, и у меня возникает проблема с обработкой определенных элементов. А именно, как передавать данные с сервера на клиент без какого-либо ввода от Клиента.Поток данных с сервера на клиента с помощью Meteor:

Идея состоит в том, что когда игрок участвует в бою с монстром, боевой урон и обновление объектов Player и Monster будут возникать в цикле на сервере. Когда игрок получает урон, он должен соответствующим образом обновлять клиентский интерфейс. Как это возможно с публикацией/подпиской?

Я в основном хочу что-то, что сидит и слушает события с сервера, чтобы соответственно обновить журнал боя.

В псевдо-коде, это что-то вдоль линии, что я ищу:

// 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, где я мог бы, если бы захотел, просто передать событие клиенту, сообщая ему об обновлении пользовательского интерфейса. Я думаю, что я могу использовать SocketIO для этого, если мне это нужно, но люди, казалось, были непреклонны, что что-то вроде этого было вполне возможно с помощью Meteor без SocketIO, я просто не понимаю, как это сделать.

Единственный выход, который я вижу в этом сценарии: написать всю логическую клиентскую логику, которая выглядит как плохая идея, записывая все боевые журналы в коллекцию, которая кажется чрезвычайно чрезмерной (но, возможно, это не так?). , или используя какой-то инструмент типа SocketIO, чтобы просто отправлять сообщения клиенту, чтобы сообщить ему написать новую строку в текстовое поле.

+1

Я не думаю, что записи в коллекции является чрезмерным на всех , но я не слишком хорошо знаком с интерьерами метеор. Мое понимание заключается в том, что только синхронизация синхронизируется с клиентами, поэтому, если вы просто добавляете или обновляете документ в коллекции, это все, что будет синхронизировано. Поскольку коллекции, насколько мне известно, являются единственными данными, которые синхронизируются между клиентом и сервером, я не думаю, что есть другие варианты в собственном метеоре (кроме опроса). –

+0

[Метеорные потоки] (http: //arunoda.github.io/meteor-streams /) пакет больше не поддерживается, но это действительно хороший способ достижения такого рода функциональных возможностей и все еще работает хорошо. – richsilv

+0

Я действительно не мог заставить метеоритные потоки работать. Я установил его с предоставленной командой терминала, а затем скопировал и вставил пример в мой код. Я вижу объект, который создается, но фактические методы «emit» и «on» не имеют абсолютно никакого ответа. Он никогда не запускает событие «on message». – Kich867

ответ

1

Использование Meteor, создание коллекции журнала боя, кажется, самый простой вариант, который у вас есть. Вы можете слушать только на мероприятии added, а затем очистить коллекцию, когда битва закончена. Это должно быть что-то вроде этого:

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

задаю подобный вопрос here, надеюсь, это поможет ^^

+0

Я не против этого решения, но я беспокоюсь о том, что 100 или 200 пользователей, вовлеченных в борьбу с врагом, потенциально могут представлять огромное количество операций записи в секунду в базу данных. Мои ожидания в том, что население этого не будет слишком огромным, но на всякий случай! Возможно, мне нужно будет провести бенчмаркинг и посмотреть, как работает взрывная запись базы данных с записями. Я могу опубликовать только последние 50 записей в таблице. Пока это звучит как мой единственный выбор, хотя метеоритные потоки, похоже, не работают для меня. – Kich867

+1

Публикация/подписка «Метеор» является гибкой и использование нескольких публикаций для одного и того же сборщика для очень точных прогнозов 'find' приведет к перегрузке сервера. –

+0

Я рассмотрю, как использовать несколько публикаций для одной и той же коллекции и посмотреть, помогает ли это мне. Это не интуитивно для меня, просто глядя на синтаксис, как это сделать! Благодарю. – Kich867

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} 
}); 
Смежные вопросы