- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试在我的 MonoTouch 游戏中实现配对。我已经成功地实现了通过 GameKit 连接玩家的系统,但我仍然无法发送和接收数据。
如何将此 Objective-C 代码转换为 C#?我要发送的数据类型是一个 Vector2
类,带有 X
和 Y
浮点组件。
NSError *error;
PositionPacket msg;
msg.messageKind = PositionMessage;
msg.x = currentPosition.x;
msg.y = currentPosition.y;
NSData *packet = [NSData dataWithBytes:&msg length:sizeof(PositionPacket)];
[match sendDataToAllPlayers: packet withDataMode: GKMatchSendDataUnreliable error:&error];
if (error != nil)
{
// handle the error
}
如有任何帮助,我们将不胜感激!
最佳答案
常见的方式,因为OpenTK.Vector2
是用[Serializable]
修饰的,将结构序列化为 Stream
(例如 MemoryStream
)然后从中初始化一个新的 NSData
,例如使用 NSData.FromStream
。这样做会产生相当多的开销,但它适用于任何结构。
更好地使用 Stream
是将您的值写入其中(例如使用 StreamWriter
)。这消除了序列化开销(反射)并允许您从不同的值构建流(无需创建结构)。
MemoryStream ms = new MemoryStream ();
using (StreamWriter sw = new StreamWriter (ms)) {
sw.Write (v2.X);
sw.Write (v2.Y);
}
ms.Position = 0;
var data = NSData.FromStream (ms);
一种更复杂(但可能更快的方法)是使用不安全
代码和NSData.FromBytes
,它接受 IntPtr
(指针)和数据大小。如果您的所有数据都已经在一个结构中,那么这很容易做到。
hacky 方法是将 Vector2
转换为 monotouch.dll
中已知的类型,例如F 点
。这将允许您使用 NSData.FromObject
。此 API 适用于 NSObject
,最基本的值类型和 NSValue
支持的或添加到 monotouch.dll
中的一些基本类型,例如RectangleF
, PointF
, ...
var v2 = new OpenTK.Vector2 ();
var pt = new System.Drawing.PointF (v2.X, v2.Y);
var data = NSData.FromObject (pt);
关于c# - 单点触控 : Sending/Receiving NSData Though GameKit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10369144/
我是一名优秀的程序员,十分优秀!