2015-01-20 40 views
5

Ben Meteor içeren bir metin tabanlı macera oyunu geliştiriyorum ve bazı unsurları nasıl ele bir sorun haline çalıştırıyorum. Yani, İstemci'den herhangi bir girdi olmadan Sunucudan Müşteriye veri gönderme.Akış veriler:

fikri bir oyuncunun canavar, savaş hasarı ile mücadele yapan ve Player güncellenmesi ve zaman canavar nesneleri sunucuda bir döngü içinde meydana olacak olmasıdır. Müzikçalar zarar gördüğünde, müşteri arayüzünü buna göre güncellemelidir. Yayınlama/Abone olmak için böyle bir şey mümkün mü?

Ben temelde oturur ve buna göre mücadele günlüğünü güncellemek için sunucudan olaylarını dinler şey istiyorum. pseudo-code

, bu çizgisinde bir şey ne aradığım:

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

Sana müşteriye bir koleksiyon yayınlayabilir anlıyoruz, ama bu gerçekten bir tarihinde belirli değil Ben arıyoruz, tüm Player nesnesini istemciye yayınlamak istemiyorum, sadece istemciye bir metin yazmak için bir çizgi yazmasını istiyorum. ".

Ben isteseydim, sadece UI güncelleştirmek için bunu söylüyorum müşteriye bir olay yayarlar olabilir SocketIO benzer bir işlevi olduğunu umuyordum. Sanırım bunu yapabilmek için Socketio'yu kullanabilirim, ama insanlar böyle bir şeyin Meteor'la tamamıyla SocketIO olmadan yapılabilmesi konusunda kararlı görünüyorlardı, sadece nasıl olduğunu anlamıyorum.

Bu senaryoyu gördüğüm tek çıkışlar: Kötü bir fikir gibi görünen tüm oyun mantığı istemci tarafının yazılması, tüm muharebe kayıtlarının aşırı derecede aşırı görünen bir koleksiyona yazılması (ama belki de değil mi?) veya metin kutusuna yeni bir satır yazmasını söylemek için istemciye mesaj göndermek için bir çeşit SocketIO tipi araç kullanma. Meteor, bir muharebe günlük koleksiyon oluşturmak kullanma

+1

Ben bir koleksiyona yazma hiç aşırı olduğunu düşünmüyorum ama meteorın içlerine çok aşina değilim. Anladığım kadarıyla, sadece diffs müşterileriyle senkronize olur, bu yüzden bir koleksiyonu koleksiyona eklerseniz veya güncellerseniz, senkronize edilecek tek şey budur. Koleksiyonlar, bilgimden en iyi şekilde, istemci ile sunucu arasında senkronize edilen tek veri olduğundan, meteor'da başka seçenekler olduğunu düşünmüyorum (oylama dışında). –

+0

[meteor-akışları] (http: //arunoda.github.io/meteor-stream /) paketi artık korunmuyor, ancak bu tür bir işlevsellik elde etmenin gerçekten iyi bir yolu ve hala iyi çalışıyor. – richsilv

+0

Gerçekten meteor akışlarını işe yaramadı. Sağlanan terminal komutuyla yükledim ve daha sonra örneği koduma kopyalayıp yapıştırdım. Oluşturulmakta olan nesneyi görebiliyorum, ama gerçek "yayma" ve "açık" yöntemleri kesinlikle yanıt vermiyor. "İletide" olayını asla tetiklemez. – Kich867

cevap

1

sahip basit seçenek gibi görünüyor. Yalnızca added olaya dinlemek ve savaş sona erdiğinde sonra toplama temizleyebilirsiniz. Böyle bir şey olmalıdır:

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

Ben benzer bir soru here sormak, bu bir koleksiyon olmadan bunu nasıl yaptı ^^

+0

Bu çözüme karşı değilim, ama endişelendiğim şey, bir düşmanla mücadele eden 100 veya 200 kullanıcı, veritabanına saniye başına büyük miktarda yazılabilir. Beklentilerim, bunun popülasyonunun çok büyük olmayacağı, ancak her halükarda! Belki bazı kıyaslamalar yapmalı ve veri tabanını patlatma performansının nasıl olduğunu görmeliyim. Sadece en son ~ 50 girişleri tabloya yayınlayabilirim. Şimdilik bu benim tek tercihim gibi görünüyor, ancak meteor-akışları benim için çalışmıyor gibi görünüyor. – Kich867

+1

Meteor'ın yayın/aboneliği esnektir ve aynı Koleksiyon için çok sayıda "find" projeksiyonuna ilişkin birden fazla yayının kullanılması, sunucunun aşırı yüklenmesini deşarj edecektir. –

+0

Aynı Koleksiyon için birden çok yayının nasıl kullanıldığını araştıracağım ve bunun bana yardımcı olup olmadığını araştıracağım. Bana, bu sözdizimini nasıl gerçekleştirebileceğine bakmak benim için sezgisel değil! Teşekkürler. – Kich867

0

İşte yardımcı olacağını umuyoruz. Bir tane yaratma konusunda endişelenmek için haklısınız. Bu iyi bir fikir olmaz. İlk Streamy'i yükleyin. istemci

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

Sonra sunucuda Sonra

https://atmospherejs.com/yuukan/streamy

, kendisine şöyle cevap:

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