Multiplayer: Unterschied zwischen den Versionen

Aus Das Sopra Wiki
LeonH (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
Langenfeld (Diskussion | Beiträge)
Zeile 125: Zeile 125:
<source lang=csharp>
<source lang=csharp>
myNetClient.SendMessage(buffer, NetChannel.UnreliableInOrder1);
myNetClient.SendMessage(buffer, NetChannel.UnreliableInOrder1);
</source>
== Multiplayer mittels Windows Live ==
=== PacketReader & PacketWriter ===
Instanzen dieser Klassen dienen zum bequemen Schreiben bzw. Lesen von Netzwerkdaten. Die ''PacketWriter'' Klasse verfügt über eine merfach überladene ''Write()'' Methode für verschiedenste Datentypen. Ebenso einfach können diese Datentypen über die entsprechend benannten Read() Methoden der ''PacketReader'' Klasse wieder gelesen werden. Auch hier gilt, dass die Reihenfolge des Lesens und Schreibens die Gleiche sein sollte.
=== SendDataOptions ===
Das Windows Live System bietet ebenfalls die 4 grundlegenden Transportwege an. Diese können beim Senden durch Setzen eines Wertes des Typ SendDataOptions ausgewählt werden. Diese Enum enthält unter anderem folgende Definitionen:
* '''None''' - Nachrichten kommen entweder beim Empfänger an oder auch nicht
* '''InOrder''' - Auslieferung der Nachrichten ebenfalls nicht garantiert, falls eine Nachricht zu spät kommt, d.h. eine neuere Nachricht ist vorher eingetroffen, so wird die ältere gedroppt
* '''Reliable''' - Garantierte Auslieferung der Nachrichten, allerdings nicht notwendigerweise in der Reihenfolge in der sie gesendet wurden
* '''ReliableInOrder''' - Alle Nachrichten kommen in der Reihenfolge in der sie gesendet wurden beim Empfänger an
=== Server ===
Starten des Servers
<source lang=csharp>
const int maxGamers = 16;
const int maxLocalGamers = 4;
try
{
    NetworkSession myNetworkSession = NetworkSession.Create(NetworkSessionType.SystemLink,
    maxLocalGamers, maxGamers);
// hook event handlers
myNetworkSession.GamerJoined += GamerJoinedEventHandler;
myNetworkSession.SessionEnded += SessionEndedEventHandler;
}
catch (Exception e)
{
    errorMessage = e.Message;
}
</source>
Die Eventhandler
<source lang=csharp>
void GamerJoinedEventHandler(object sender, GamerJoinedEventArgs e);
void SessionEndedEventHandler(object sender, NetworkSessionEndedEventArgs e)
{
    errorMessage = e.EndReason.ToString();
    myNetworkSession.Dispose();
    myNetworkSession = null;
}
</source>
Empfangen von Clientdaten
<source lang=csharp>
// Keep reading as long as incoming packets are available.
while (gamer.IsDataAvailable)
{
    NetworkGamer sender;
    // Read a single packet from the network.
    gamer.ReceiveData(packetReader, out sender);
    if (!sender.IsLocal)
    {
        // Read the packetdata available in packetReader
    }
}
</source>
Daten an Clients senden
<source lang=csharp>
LocalNetworkGamer server = (LocalNetworkGamer)myNetworkSession.Host;
server.SendData(packetWriter, SendDataOptions.InOrder, client);
myNetworkSession.Update();
</source>
<source lang=csharp>
LocalNetworkGamer server = (LocalNetworkGamer)myNetworkSession.Host;
server.SendData(packetWriter, SendDataOptions.InOrder);
myNetworkSession.Update();
</source>
=== Client ===
Client starten
<source lang=csharp>
const int maxLocalGamers = 4;
try
{
// Search for sessions.
using (AvailableNetworkSessionCollection availableSessions = NetworkSession.Find(
NetworkSessionType.SystemLink, maxLocalGamers, null))
{
    if (availableSessions.Count == 0)
    {
        errorMessage = "No network sessions found.";
        return;
    }
// Join the first session we found.
myNetworkSession = NetworkSession.Join(availableSessions[0]);
// hook event handlers
myNetworkSession.GamerJoined += GamerJoinedEventHandler;
myNetworkSession.SessionEnded += SessionEndedEventHandler;
}
}
catch (Exception e)
{
    errorMessage = e.Message;
}
</source>
Daten vom Server empfangen
<source lang=csharp>
// Keep reading as long as incoming packets are available.
while (gamer.IsDataAvailable)
{
    NetworkGamer sender;
    // Read a single packet from the network.
    gamer.ReceiveData(packetReader, out sender);
    // Read the data from packetReader..
}
</source>
Daten zum Server senden
<source lang=csharp>
gamer.SendData(packetWriter, SendDataOptions.InOrder, myNetworkSession.Host);
</source>
</source>