отправка и получение позиции узлов - PullRequest
0 голосов
/ 13 марта 2019

Я использую базу данных Firebase в реальном времени для отправки координат x и y движущегося узла, чтобы каждый игрок мог видеть движение узла других игроков.Однако это очень медленно, и я не уверен, в чем проблема.

В функции обновления, если текущий игрок = игрок [0] игроков в игре, тогда он контролирует узел (circle1), если текущий игрок = игрок [1], тогда он контролирует другой узел (circle2).Координаты x и y положения узлов отправляются в базу данных и извлекаются в didMove другим игроком и обновляют положение узла в их представлении.

override func update(_ currentTime: TimeInterval) {
    let circle1PositionX = circle1.position.x
    let circle1PositionY = circle1.position.y
    let circle2PositionX = circle2.position.x
    let circle2PositionY = circle2.position.y
    let dict1 = ["x": circle1PositionX, "y": circle1PositionY] as [String: Any]
    let dict2 = ["x": circle2PositionX, "y": circle2PositionY] as [String: Any]   

    if (currentPlayer as? String == playersArray[1] as? String) {
         GameDataSource.ref.child("locations").child(gameID as! String)
         .child(playersArray[1] as! String).child("circle").setValue(dict2)   
    }
    else if (currentPlayer as? String == playersArray[0] as? String) {    
         GameDataSource.ref.child("locations").child(gameID as! String)
         .child(playersArray[0] as! String).child("circle").setValue(dict1)   
    }

Эта функция (просто фрагмент) затем вызывается в didMove.

func observePlayerPosition() {
    guard let players = self.userData?.mutableArrayValue(forKey: "players"), let currentPlayer =  self.userData?.value(forKey: "currentPlayer"), let gameID = self.userData?.value(forKey: "gameID") else {
        print("Something is missing")
        return
    }
    let playersArray = players as Array

    if (currentPlayer as? String == playersArray[0] as? String) {

        GameDataSource.ref.child("locations").child(gameID as! String).child(playersArray[1] as! String).observe(.childChanged) { (snapshot) in
            GameDataSource.ref.child("locations").child(gameID as! String).child(playersArray[1] as! String).child("circle").observeSingleEvent(of: .value, with: { (snapshot) in
                guard let okx = snapshot.childSnapshot(forPath: "x").value as? Double else {
                    return
                }
                guard let oky = snapshot.childSnapshot(forPath: "y").value as? Double else {
                    return
                }

                self.circle2.position = CGPoint(x: okx, y: oky)  
            }) 
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...