2015-01-20 2 views
5

Meteor를 사용하여 텍스트 기반 어드벤처 게임을 개발 중이며 특정 요소를 처리하는 방법에 문제가 있습니다. 즉, 클라이언트의 입력없이 서버에서 클라이언트로 데이터를 내보내는 방법.Meteor를 사용하여 서버에서 클라이언트로 데이터 스트리밍 :

플레이어가 몬스터와의 전투에 참여하면 전투 피해와 플레이어 및 몬스터 개체 업데이트가 서버의 루프에서 발생하게됩니다. 플레이어가 손상을 입으면 그에 따라 클라이언트 UI를 업데이트해야합니다. Publish/Subscribe를 통해 이와 같은 것이 가능합니까?

기본적으로 서버의 이벤트를 수신하여 그에 따라 전투 로그를 업데이트합니다. 의사 코드에서

,이 라인을 따라 뭔가 내가 무엇을 찾고 있어요 :

// 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 type-tool을 사용하여 메시지를 클라이언트에게 보내어 텍스트 상자에 새로운 줄을 쓰라고 지시 할 수 있습니다.

+1

내가 컬렉션에 쓰는 것은 전혀 과도한 생각하지 않습니다 , 그러나 나는 유성의 내부에 너무 익숙하지 않다. 내 이해하지만 단지 diffs는 클라이언트에 동기화되므로 컬렉션에 문서를 추가하거나 업데이트하면 모든 것이 동기화됩니다. 컬렉션은 클라이언트와 서버간에 동기화되는 유일한 데이터이기 때문에 나는 유적 (폴링 제외)에 다른 옵션이 있다고 생각하지 않습니다. –

+0

[meteor-streams] (http : //arunoda.github.io/meteor-streams /) 패키지는 더 이상 유지 관리되지 않지만 이러한 종류의 기능을 구현하는 좋은 방법이며 여전히 잘 작동합니다. – richsilv

+0

나는 진정으로 유성 - 시내가 작동하지 못하게했다. 제공된 터미널 명령을 사용하여 설치 한 다음 예제를 복사하여 내 코드에 붙여 넣었습니다. 나는 생성되는 객체를 볼 수 있지만 실제로 "emit"및 "on"메서드는 전혀 응답이 없습니다. "on message"이벤트를 트리거하지 않습니다. – Kich867

답변

1

유성을 사용하여 전투 로그 컬렉션을 만드는 것이 가장 간단한 옵션 인 것 같습니다. added 이벤트 만 듣고 전투가 끝나면 컬렉션을 지울 수 있습니다. 그것은이 같은해야한다 :

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

내가 비슷한 질문 here을 물어, 이것이 내가 수집하지 않고 그것을 어떻게 ^^

+0

나는이 솔루션에 반대하지는 않지만, 100 명 또는 200 명의 사용자가 모두 적과의 전투에 종사하고 있다고 말하면 데이터베이스에 초당 굉장히 많은 글을 쓸 수 있습니다. 나의 기대는 이것의 인구가 너무 거대하지 않을 것이라는 점이다. 어쩌면 나는 벤치마킹을해야하고 엔트리를 가지고 데이터베이스를 폭파시키는 성능이 어떤지를 알아야 할 것이다. 가장 최근의 ~ 50 개 항목 만 테이블에 게시 할 수 있습니다. 유성 - 시내가 저를 위해 작용하고 있지 않는 것처럼 지금은 그러나 이것은 나의 유일한 선택 같이 소리가 난다. – Kich867

+1

Meteor의 publish/subscribe는 유연하고 동일한 Collection에 대해 여러 개의 발행물을 사용하면 매우 정확한'find' 투영과 연관되어 서버 과부하가 처리됩니다. –

+0

동일한 콜렉션에 대해 여러 발행물을 사용하는 방법을 살펴보고 이것이 도움이되는지 확인합니다. 그것을 성취하는 방법을 문법으로 바라 보는 것이 직관적이지 않습니다! 감사. – Kich867

0

가 여기 도움이되기를 바랍니다. 나는 당신이 하나를 창조하는 것에 대해 염려하는 것이 옳다고 생각합니다. 그건 좋은 생각이 아니야. 먼저 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); 
     }) 
    } 

그런 다음 서버에서 다음

https://atmospherejs.com/yuukan/streamy

이처럼 응답 :

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