2015-01-20 19 views
5

Tôi đang phát triển trò chơi phiêu lưu dựa trên văn bản với Meteor và tôi đang gặp sự cố với cách xử lý các yếu tố nhất định. Cụ thể là, cách phát ra dữ liệu từ Máy chủ đến Máy khách mà không có bất kỳ đầu vào nào từ Máy khách.Truyền dữ liệu từ Máy chủ đến Khách hàng bằng Meteor:

Ý tưởng là khi người chơi tham gia chiến đấu với quái vật, sát thương chiến đấu và cập nhật đối tượng Trình phát và Quái vật sẽ xảy ra trong vòng lặp trên máy chủ. Khi người chơi nhận sát thương, người chơi phải cập nhật giao diện người dùng của khách hàng. Là một cái gì đó như thế này có thể với Xuất bản/Đăng ký?

Tôi về cơ bản muốn một cái gì đó ngồi và lắng nghe các sự kiện từ máy chủ để cập nhật nhật ký chiến đấu cho phù hợp.

Trong pseudo-code, đây là một cái gì đó dọc theo dòng của những gì tôi đang tìm kiế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 
    } 
}); 

Tôi hiểu rằng bạn có thể xuất bản một bộ sưu tập cho khách hàng, nhưng đó không phải là thực sự như cụ thể của một Tôi đang tìm kiếm, tôi không muốn xuất bản toàn bộ đối tượng Trình phát tới ứng dụng khách, tôi chỉ muốn yêu cầu khách hàng viết một dòng vào một hộp văn bản nói điều gì đó như "Bạn bị trúng 12 sát thương bởi một con quái vật! ".

Tôi đã hy vọng có một chức năng tương tự như SocketIO nơi tôi có thể, nếu tôi muốn, chỉ phát ra một sự kiện cho khách hàng nói với nó để cập nhật giao diện người dùng. Tôi nghĩ rằng tôi có thể sử dụng SocketIO cho điều này nếu tôi cần, nhưng mọi người dường như kiên quyết rằng một cái gì đó như thế này có thể làm được với Meteor hoàn toàn không có SocketIO, tôi chỉ không thực sự hiểu làm thế nào. Cách duy nhất tôi thấy trong kịch bản này là: viết tất cả các mặt logic của máy khách trò chơi mà cảm thấy như một ý tưởng tồi, viết tất cả các bản ghi chiến đấu vào bộ sưu tập có vẻ cực kỳ quá mức (nhưng có lẽ không phải?) hoặc sử dụng một số loại công cụ loại SocketIO để chỉ phát ra thông báo cho khách hàng để yêu cầu nó viết dòng mới vào hộp văn bản.

+1

Tôi không nghĩ rằng văn bản cho một bộ sưu tập là quá mức ở tất cả , nhưng tôi không quá quen thuộc với nội thất của thiên thạch. Mặc dù vậy, sự hiểu biết của tôi là chỉ những khác biệt mới được đồng bộ hóa với khách hàng, vì vậy nếu bạn chỉ thêm hoặc cập nhật tài liệu trong bộ sưu tập thì đó là tất cả những gì sẽ được đồng bộ hóa. Vì các bộ sưu tập, theo hiểu biết tốt nhất của tôi, dữ liệu duy nhất đang được đồng bộ hóa giữa máy khách và máy chủ, tôi không nghĩ có các tùy chọn khác trong thiên thạch thích hợp (ngoài việc bỏ phiếu). –

+0

[meteor-stream] (http: //arunoda.github.Gói io/meteor-stream /) không còn được duy trì, nhưng đó là một cách thực sự tốt để đạt được loại chức năng này, và vẫn hoạt động tốt. – richsilv

+0

Tôi thực sự không thể có được các luồng sao băng để hoạt động. Tôi đã cài đặt nó bằng lệnh thiết bị đầu cuối được cung cấp của họ và sau đó sao chép và dán ví dụ vào mã của tôi. Tôi có thể thấy đối tượng đang được tạo nhưng phương thức "phát ra" và "bật" thực sự hoàn toàn không có phản hồi. Nó không bao giờ kích hoạt sự kiện "trên tin nhắn". – Kich867

Trả lời

1

Sử dụng Meteor, tạo bộ sưu tập nhật ký chiến đấu dường như là tùy chọn đơn giản nhất mà bạn có. Bạn chỉ có thể nghe theo sự kiện added và sau đó xóa bộ sưu tập khi chiến đấu kết thúc. Nó phải là một cái gì đó như thế này:

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

tôi hỏi một câu hỏi tương tự here, hy vọng điều này sẽ giúp ^^

+0

Tôi không phản đối giải pháp này, nhưng điều tôi lo lắng là có nói, 100 hoặc 200 người dùng tham gia chiến đấu với kẻ thù, điều này có khả năng là một số lượng lớn dữ liệu viết mỗi giây cho cơ sở dữ liệu. Kỳ vọng của tôi là dân số của điều này sẽ không quá lớn, nhưng chỉ trong trường hợp! Có lẽ tôi sẽ phải làm một số điểm chuẩn và xem làm thế nào hiệu suất của việc phá vỡ cơ sở dữ liệu với các mục là. Tôi chỉ có thể xuất bản gần nhất 50 mục nhập vào bảng. Bây giờ, điều này nghe giống như lựa chọn duy nhất của tôi mặc dù các luồng sao băng dường như không hoạt động cho tôi. – Kich867

+1

Xuất bản/đăng ký của Meteor linh hoạt và sử dụng nhiều ấn bản cho cùng một bộ sưu tập liên kết với các dự đoán 'tìm' chính xác sẽ thải quá tải máy chủ. –

+0

Tôi sẽ xem xét cách sử dụng nhiều ấn phẩm cho cùng một Bộ sưu tập và xem liệu điều này có giúp ích cho tôi hay không. Nó không trực quan với tôi chỉ nhìn vào cú pháp làm thế nào để đạt được điều đó! Cảm ơn. – Kich867

0

Đây là cách tôi đã làm nó mà không có một bộ sưu tập. Tôi nghĩ rằng bạn có quyền quan tâm đến việc tạo ra một. Đó sẽ không phải là một ý tưởng hay. Đầu tiên cài đặt Streamy.

https://atmospherejs.com/yuukan/streamy

Sau đó trên máy chủ

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

Sau đó, trong khách hàng, đáp ứng với nó như thế này:

Streamy.on('ddpEvent', function(data) { 
    console.log("data is ", data); //prints out {yourKey:yourValue} 
}); 
Các vấn đề liên quan