Попытка написать небольшую карточную игру в режиме реального времени с использованием GameKit и GKMatch. Я следовал this Game Center tutorial (в Objective-C), но теперь застрял пытается преобразовать это в Swift 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!)")
}
функ SendData
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.")
}
}
функ match.didReceiveD ата
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 Я вижу, что:.
- message.messageType = .kMessageTypeRandomNumber (который отличается от значения структура была инициализирована с Кроме того, это значение было установлено в sendRandomNumber, так что я считаю, что часть отправляется правильно).
- messageRandomNumber.message.messageType = .kMessageTypeRandomNumber (опять же правильно)
- Однако messageRandomNumber.randomNumber всегда 0 (что не является правильным)
Есть ли что-то очевидно, что я здесь отсутствует?
Спасибо. Это имеет смысл, однако я не могу найти это в документации Apple (https://developer.apple.com/library/prerelease/ios/documentation/GameKit/Reference/GKMatchDelegate_Ref/index.html#//apple_ref/ occ/intfm/GKMatchDelegate/match: didReceiveData: fromRemotePlayer :) –
Упс, нажимайте слишком быстро на мобильном телефоне. Можете ли вы указать мне в правильном направлении, где я могу найти, как я должен это делать в Свифт? –
Могу ли я использовать EnumerateByteRangesUsingBlock для этого, возможно, вместо прямого доступа к свойству bytes? –