【问题标题】:Why doesn't this function get called?为什么不调用这个函数?
【发布时间】:2015-11-01 15:22:44
【问题描述】:

我遵循 Ray Wenderlich 教程并将大部分代码转换为 Swift。我在第二部分,但这个函数永远不会被调用。我跟着教程,但我不知道在哪里调用它。我也不认为它是一个委托函数,所以我知道我应该在某个地方调用它,但不确定在哪里。有没有人试过这个教程并让它在 Swift 上工作?谢谢!

这是链接:http://www.raywenderlich.com/60998/game-center-tutorial-how-to-make-a-simple-multiplayer-game-with-sprite-kit-part-2

func match(theMatch: GKMatch, didReceiveData data: NSData, fromPlayer playerID: String) {


    let message = UnsafePointer<Message>(data.bytes).memory

    if(message.messageType == MessageType.kMessageTypeRandomNumber) {
        let messageRandomNumber = UnsafePointer<MessageRandomNumber>(data.bytes).memory

        println("Received random number: \(messageRandomNumber.randomNumber)")

        var tie = false

        if(messageRandomNumber.randomNumber == _ourRandomNumber) {
            println("Tie")
            tie = true
            _ourRandomNumber = arc4random()
            self.sendRandomNumber()
        }
        else {
            var dictionary = ["\(playerIDKey)":"\(playerID)", "\(randomNumberKey)":"\(messageRandomNumber.randomNumber)"]
            self.processReceivedRandomNumber(dictionary)
        }

        if(_receivedAllRandomNumbers) {
            _isPlayer1 = self.isLocalPlayerPlayer1()
        }

        if(!tie && _receivedAllRandomNumbers) {
            if(_gameState == GameState.kGameStateWaitingForRandomNumber) {
                _gameState = GameState.kGameStateWaitingForStart
            }
            self.tryStartGame()
        }
    }
    else if(message.messageType == MessageType.kMessageTypeGameBegin) {
        println("Begin game message received")
        _gameState = GameState.kGameStateActive
        self.delegate?.setCurrentPlayerIndex(self.indexForLocalPlayer())
    }
    else if(message.messageType == MessageType.kMessageTypeMove) {
        println("Move message received")
        let messageMove = UnsafePointer<MessageMove>(data.bytes).memory
        self.delegate?.movePlayerAtIndex(self.indexForPlayerWithId(playerIDKey))
    }
    else if(message.messageType == MessageType.kMessageTypeGameOver) {
        println("Game over message received")
        let messageGameOver = UnsafePointer<MessageGameOver>(data.bytes).memory
        self.delegate?.gameOver(messageGameOver.player1Won)
    }
}

【问题讨论】:

    标签: xcode swift game-center multiplayer


    【解决方案1】:

    委托方法match:didReceiveData:fromPlayer: 已被弃用。请改用match:didReceiveData:fromRemotePlayer:

    确保您设置了委托,执行以下操作:

    func matchmakerViewController(viewController: GKMatchmakerViewController, didFindMatch match: GKMatch) {
        theMatch = match
        match.delegate = self
        ...
    }
    

    这是GKMatchmakerViewControllerDelegateviewController:didFindMatch 代表。 您需要同时从GKMatchmakerViewControllerDelegateGKMatchDelegate 委托。

    是的,我知道这是一个旧线程,但 OP 还没有成功。

    【讨论】:

      【解决方案2】:

      match:didReceiveData:fromPlayer: 是一个GKMatchDelegate 可选方法,当比赛收到玩家发送的数据时触发。

      所以请不要尝试直接调用它。 GameKit 会在收到来自玩家的数据时调用它。

      @protocol GKMatchDelegate <NSObject>
      @optional
      
      // The match received data sent from the player.
      - (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromRemotePlayer:(GKPlayer *)player NS_AVAILABLE(10_10, 8_0);
      - (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID NS_DEPRECATED(10_8, 10_10, 4_1, 8_0, "use match:didReceiveData:fromRemotePlayer:");
      
      @end;
      

      这也在GameKitHelper.h 类中声明为GameKitHelperDelegate

      @protocol GameKitHelperDelegate
      
      - (void)match:(GKMatch *)match didReceiveData:(NSData *)data
         fromPlayer:(NSString *)playerID;
      
      @end
      

      当比赛收到玩家发送的数据时,这个委托方法从下面的方法中调用

      #pragma mark GKMatchDelegate
      
      // The match received data sent from the player.
      - (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID {
          if (_match != match) return;
      
          [_delegate match:match didReceiveData:data fromPlayer:playerID];
      }
      

      【讨论】:

      • 如何快速调用它?
      • 你不会直接调用它。它将被GameKit“当收到来自玩家的数据”developer.apple.com/library/ios/documentation/GameKit/Reference/…调用:
      • @Ramshad 我已经按照教程中的方式设置了它,但它永远不会被调用。
      • @Ramshad 我把它作为一个委托函数,但它仍然没有被自己调用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多