【发布时间】:2016-06-30 03:21:51
【问题描述】:
尝试使用 GameKit 和 GKMatch 编写一个小型实时纸牌游戏。 我关注了this Game Center tutorial(在 Objective-C 中),但现在一直试图将其转换为 Swift 2。
我的枚举和结构:
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 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.didReceiveData
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(这是不正确的)
我在这里遗漏了什么明显的东西吗?
【问题讨论】: