3

MonoTouch ゲームにマッチメイキングを実装しようとしています。GameKit を介してプレイヤーを接続するシステムを正常に実装しましたが、データの送受信に行き詰まっています。

この客観的な c コードを c# に変換するにはどうすればよいですか? 送信したいデータのタイプは、float コンポーネントを持つVector2クラスです。XY

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
}

どんな助けでも大歓迎です!

4

2 に答える 2

1

は で装飾されているため、一般的な方法は、構造体を(たとえば a )にシリアライズしてから、たとえば を使用して、そこから新しいものを初期化することです。これを行うにはかなりのオーバーヘッドがありますが、どの構造でも機能します。OpenTK.Vector2[Serializable]StreamMemoryStreamNSDataNSData.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);

より複雑な(しかし潜在的に高速な方法) は、 (ポインター) とデータのサイズを受け入れるunsafeコードを使用することです。すべてのデータがすでに構造内にある場合、それは非常に簡単です。NSData.FromBytesIntPtr

ハックな方法は、たとえばVector2で知られている型に変換することです。これにより、使用できるようになります。この APIは、最も基本的な値の型と、 でサポートされているか、内部で追加されているいくつかの基本的な型で動作します。monotouch.dllPointFNSData.FromObjectNSObjectNSValuemonotouch.dllRectangleFPointF

var v2 = new OpenTK.Vector2 ();
var pt = new System.Drawing.PointF (v2.X, v2.Y);
var data = NSData.FromObject (pt);
于 2012-04-29T14:29:35.573 に答える
0

わかりましたので、大部分は理解できたと思います。興味のある人は、ここに私の解決策があります。

unsafe
{
    NSError error = new NSError((NSString)"Test", 0);

    System.IntPtr pointer = Marshal.AllocHGlobal(sizeof(PointF));

    PointF packedData = new PointF(position.X, position.Y);

    Marshal.StructureToPtr(packedData, pointer, false);

    NSData packet = NSData.FromBytes(pointer, (uint)sizeof(PointF));

    currentMatch.SendDataToAllPlayers(packet, GKMatchSendDataMode.Unreliable, error.ClassHandle);

    Marshal.FreeHGlobal(pointer);
}

したがってNSError、私のプロジェクトでは失敗したパケットは実際には問題ではありませんが、どうあるべきかはまだわかりません。これは、パケットを受信するためのコードです。

PointF packedData = (PointF)Marshal.PtrToStructure(data.Bytes, typeof(PointF));

var recievedData = new Vector2(packedData.X, packedData.Y);
于 2012-04-30T00:49:43.853 に答える