我有一個問題,我不知道解決方案。我正在製作涉及多個玩家的遊戲。一個人「主辦」遊戲並向其他用戶發送「邀請」以加入「大廳」。如果你曾經玩過「使命召喚」或任何類似的遊戲,這是一個概念。流星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}"
工程就像一個魅力。謝謝!
@autorun是關鍵。之前沒有必要使用它。很有用! – samcorcos 2015-02-09 20:49:26