2016-03-14 65 views
0

試圖使用GameKit和GKMatch編寫一個小型實時紙牌遊戲。 我已經按照this Game Center tutorial(在Objective-C),但現在卡住試圖將其轉換爲雨燕2.通過NSData發送的數據僅部分收到

我枚舉和結構:

enum Messagetype:Int { 
     case kMessageTypeRandomNumber = 0 
     case kMessageTypeGameBegin = 1 
     case kMessageTypeMove = 2 
     case kMessageTypeGameOver = 3 
    } 

struct Message { 
    var messageType:Messagetype = .kMessageTypeMove 
} 

struct MessageRandomNumber { 
    var message = Message() 
    var randomNumber: Int = -1 
} 

var ourRandomNumber:Int = Int(arc4random_uniform(100000))+1 

樂趣sendRandomNumber()

func sendRandomNumber() { 
     var message = MessageRandomNumber() 

     message.randomNumber = self.ourRandomNumber 
     message.message.messageType = .kMessageTypeRandomNumber 

     let data = NSData(bytes: &message, length: sizeof(MessageRandomNumber)) 
     self.sendData(data) 
     print ("Random number \(message.randomNumber) sent from \(localPlayer.alias!)") 
} 

FUNC送出數據

func sendData(data: NSData) { 

     let gameKitHelper = GameKitHelper.sharedGameKitHelper 
     var succes:Bool? = true 

     do { 
      try gameKitHelper.match.sendDataToAllPlayers(data, withDataMode: .Reliable) 
      } catch { 
       succes = nil 
      } 
      if succes == nil { 
       print ("Error sending data.") 
     } 
} 

FUNC match.didReceiveD ATA

func match(match: GKMatch, didReceiveData data: NSData, fromRemotePlayer player: GKPlayer) { 
     print ("Data received.") 
     let message:Message = UnsafePointer<Message>(data.bytes).memory as Message 

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

      print ("Received random number \(messageRandomNumber.randomNumber)") 
} 

我可以在一個隨機數<> 0被選擇,並使用sendRandomNumber從設備發送的日誌中看到。

通過didReceiveData步進我看到的是:

  1. message.messageType = .kMessageTypeRandomNumber(其是從該結構用同樣,該值是在設定sendRandomNumber初始化的值不同,所以我相信這部分得到正確發送)。
  2. messageRandomNumber.message.messageType = .kMessageTypeRandomNumber(再次正確)
  3. 然而,messageRandomNumber.randomNumber始終爲0(這是不正確的)

有什麼明顯的,我在這裏失蹤?

回答

0

didReceiveData被調用時一些數據被收到。當收到更多數據時,它會再次被調用。您必須收集數據(或在數據進入時處理數據,並知道數據不完整),並且在數據完成時還有另一個回調。

+0

謝謝。這是完全有道理的,但我似乎無法在Apple的文檔中找到它(https://developer.apple.com/library/prerelease/ios/documentation/GameKit/Reference/GKMatchDelegate_Ref/index.html#//apple_ref/ occ/intfm/GKMatchDelegate/match:didReceiveData:fromRemotePlayer :) –

+0

哎呀,按下發送太快在移動。你能指出我在正確的方向,我可以找到我應該如何在Swift中做到這一點? –

+0

我可以使用EnumerateByteRangesUsingBlock代替直接訪問bytes屬性嗎? –

相關問題