2015-02-09 10 views
0

我有一個問題,我不知道解決方案。我正在製作涉及多個玩家的遊戲。一個人「主辦」遊戲並向其他用戶發送「邀請」以加入「大廳」。如果你曾經玩過「使命召喚」或任何類似的遊戲,這是一個概念。流星1.0 - 託管一個大廳和重定向其他用戶

這個過程大部分目前正常工作。

我創建了一個名爲Lobby的集合來跟蹤所有開放和封閉的大廳。當用戶想要舉辦一個大廳,他點擊了按鈕,創建一個新的大堂,將用戶重定向到正確的網址:

Template.lobby.events 
    'click button#host-lobby': (e,t) -> 
    lobbyId = Lobby.insert 
     host: Meteor.user()._id 
     hostName: Meteor.user().username 
     status: true 
     players: [] 
    Router.go("currentLobby", _id: lobbyId) 

然後,用戶可以邀請其他用戶大堂(URL)通過一種模式,它將一個通知對象添加到受邀用戶的配置文件中。可能不是最好的辦法,所以我願意接受這方面的建議。

Template._playerItem.events 
    'click button': (e,t) -> 
    lobbyId = Session.get "currentLobby" 
    Meteor.call "sendNotification", @_id, lobbyId, Meteor.user().username 
    Lobby.update 
     _id: lobbyId 
    , 
     $addToSet: 
     invitedPlayers: @_id 

而且方法:

Meteor.methods 
    sendNotification: (userId, lobbyId, hostName) -> 
    sendTo = Meteor.users.findOne(_id: userId) 
    Meteor.users.update 
     _id: userId 
    , 
     $push: 
     invite: 
      hostName: hostName 
      lobbyId: lobbyId 

所以在這一點上,用戶可以選擇接受或拒絕邀請。如果他接受,他將被路由到大廳,並被添加到大廳對象中的players數組中。用戶可以像預期的那樣出現在玩家列表中。

我的問題從我嘗試「開始」遊戲開始。當點擊該按鈕,遊戲正確創建和主機(誰按下按鈕)被路由到的URL新遊戲:

Template.currentLobby.events 
    'click #start-game': (e,t) -> 
    playerIds = [@host] 
    @players.forEach (player) -> 
     playerIds.push(player.id) 
    Meteor.call 'createGame', playerIds 
    Router.go('home') 

的問題是,在大堂的其他用戶不會被重定向。他們有權訪問遊戲,如果他們手動去網址,但他們不會在那裏。他們無法知道遊戲已經開始......

一個解決方案是添加一個「遊戲已經開始」的徽章,並附有遊戲鏈接,但我認爲更優雅的解決方案是將所有路線的當前大廳網址中的用戶到剛剛開始的遊戲。

此功能可能嗎?有更好的方式來主辦大堂嗎?

編輯

謝謝你切特的解決方案。這就是我最終實現了它:

Template.currentLobby.rendered = -> 
    @autorun -> 
    data = Template.currentData() 
    if data.url 
     Router.go data.url 

@autorun有一些方面的困難,所以我只是用大堂數據。然後,當有人點擊「開始遊戲」按鈕時,當前遊戲大廳將更新爲新遊戲的網址(Meteor.call'createGame'返回新遊戲的_id)。

Template.currentLobby.events 
    'click #start-game': (e,t) -> 
    playerIds = [@host] 
    lobbyId = Template.currentData()._id 

    @players.forEach (player) -> 
     playerIds.push(player.id) 

    Meteor.call 'createGame', playerIds, (err, res) -> 
     Lobby.update 
     _id: lobbyId 
     , 
     $set: 
      url: "/game/#{res}" 

工程就像一個魅力。謝謝!

回答

0

好的。首先,解決您的通知。這是一個有效的解決方案。但是,您可能想按日期對它們進行排序!您還需要創建單獨的通知集合。無論何時您更新文檔,整個事情都會通過DDP發送給客戶端。因此,任何添加到配置文件的新通知都會導致整個配置文件被髮送到客戶端。您還需要某種方式將通知標記爲正在讀取,以便可以將其刪除。

要解決您關於重定向大廳的問題,請創建名爲url的屬性。最初它被設置爲false。一旦主機準備好開始遊戲,他們將url屬性設置爲url。

當用戶進入大廳時,啓動自動運行重定向。

Template.lobby.rendered = -> 
    @autorun -> 
    if game.url 
     Router.go(game.url) 

您必須確保game.url是反應性數據源。如果你使用鐵路路由器作爲數據上下文傳遞遊戲,那麼你應該可以使用@data.url,但我不能100%確定它會被動。爲了安全起見,請嘗試Games.findOne(@data._id) - 這肯定會被動。

編輯: 只要是明確的,試試這個:

Template.lobby.rendered = -> 
    @autorun -> 
    game = Games.findOne(@data._id) 
    if game.url 
     Router.go(game.url) 
+0

@autorun是關鍵。之前沒有必要使用它。很有用! – samcorcos 2015-02-09 20:49:26

相關問題