2015-07-30 4 views
0

Im после учебника Ray Wenderlich и преобразовал большую часть кода в Swift. Im во второй части, но эта функция никогда не вызвана. Я последовал за tutoral, но я не уверен, где его назвать. Я не думаю, что это функция делегата, поэтому я знаю, что я должен был назвать это где-то, но не уверен, где. Кто-нибудь когда-либо пробовал этот учебник и заставил его работать на Swift? Благодаря!Почему эта функция не вызвана?

Heres ссылка: 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) 
    } 
} 

ответ

1

делегат метод match:didReceiveData:fromPlayer: устарел. Вместо этого используйте match:didReceiveData:fromRemotePlayer:.

Убедитесь, что вы установить делегат, делать что-то вроде:

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

Это является viewController:didFindMatch делегат GKMatchmakerViewControllerDelegate. Вам необходимо делегировать от GKMatchmakerViewControllerDelegate и GKMatchDelegate.

Да, я знаю, что это старая нить, но OP еще не успел.

0

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]; 
} 
+0

Как бы назвать это быстрым? – coding22

+0

Вы бы не назвали это напрямую. Он будет вызываться 'GameKit', когда данные получаются от игрока« https://developer.apple.com/library/ios/documentation/GameKit/Reference/GKMatchDelegate_Ref/#//apple_ref/occ/intfm/GKMatchDelegate/ матч: didReceiveData: fromPlayer: –

+0

@SteveWilford: благодарю вас за информацию. –

Смежные вопросы