您好!首先,我将解释游戏的作用,然后解释我的问题:
所以我正在创建一个应用程序,让玩家可以互相玩小游戏。 首先,它们会显示一个表格视图,其中显示了它们的名称。每个名字都是一个创造了游戏室的玩家。
然后玩家选择要玩的游戏室(仅允许2个人)然后游戏将开始。游戏使用一个名为“阶段”的变量。这是我用于在Firebase数据库中存储数据的参考(下面的代码)。我稍后在应用程序中调用以获得当前游戏的“阶段”。
但是,当我更改引用的值时,它会为应用中的每个人更改它。所以无论你与谁对抗,如果一个人改变了价值,那么每个人都会受到影响。那么,我该如何解决这个问题?
这是我将数据存储到Firebase数据库的方式:
我首先创建引用以存储数据。
private lazy var currentPhaseRef: FIRDatabaseReference = FIRDatabase.database().reference().child("currentPhase")
private lazy var whoWonCurrentPhaseRef: FIRDatabaseReference = FIRDatabase.database().reference().child("whoWonCurrentPhase")
然后,为了获得当前阶段,我观察它:
private func observerCurrentPhase(){
currentPhase = currentPhaseRef.observe(.childAdded, with: { (snapshot) -> Void in
let phaseData = snapshot.value as! UInt
self.currentPhase = phaseData
})
}
我理解为什么这不起作用。它没有用,因为我正在设置每个人都可以使用的值。
那么,我如何为每个用户提供不同的引用(例如:Player 1的Did是123456,所以引用将是'123456CurrentPhase')?这样,当他们玩游戏时,它会从个性化的参考名称中提取数据。但是我如何与任何一个用户进行通信,以便他们使用相同的参考?
另一种询问方式是:如何将其设置为两个用户都可以使用 ONE 个性化代码从中提取数据的位置。
注意:选择单元格来玩游戏的玩家和实际启动游戏的玩家是两个不同的ViewControllers / Code文件。所以我并不担心将一个控制器格式化为两端都可以工作。 IE浏览器。当您创建游戏并选择游戏时,他们会将您发送给两个不同的控制器。
感谢您提供反馈,如果您需要任何进一步的详细信息或有任何疑问,请与我们联系。 :)
答案 0 :(得分:1)
您需要将游戏分开,您可以让数据库看起来像这样。
{
games : {
fbgeneratedId1 : {
host: userid1,
client: userid2
matched: true,
gameid : fbgeneratedId1,
WhoWonCurrentPhase: "Bob"
},
//case when a client joins the game
fbgeneratediId2 : {
host: userid1,
matched: false,
gameid:fbgeneratedId2
}
//a newly created game with only the host
}
}
所以游戏将是你的游戏列表。当主持人创建游戏时,游戏将被插入到列表中,如下所示:
var newGameRef = FIRDatabase.database().reference().child("games").push();
var myGameId = newGameRef.key
//create a new game and store it's ID inside so its easy to access for updates
newGameRef.set({
host: userid1,
matched: false,
gameid: myGameId
});
当主持人创建游戏时,他们必须知道游戏的关键,当客户端加入时,他们也应该知道密钥,以便他们只能将游戏对象单独操作到他们的游戏中。所以你的阶段参考成为:
private lazy var whoWonCurrentPhaseRef: FIRDatabaseReference = FIRDatabase.database().reference().child("games/"+myGameId+"/whoWonCurrentPhase")
您可以将该游戏标记为匹配,以便可以根据需要从游戏列表中过滤掉。注意:myGameId将是其中一个fbgeneratedIds