Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pjv:laboratoare:08 [2020/01/08 17:06]
alexandru.gradinaru
pjv:laboratoare:08 [2020/01/15 16:51] (current)
alexandru.gradinaru
Line 1: Line 1:
-====== Multiplayer ======+====== Multiplayer ​(bonus) ​======
  
 Exista mai multe metode de a face un joc controlabil de mai multi jucatori in acelasi timp: Exista mai multe metode de a face un joc controlabil de mai multi jucatori in acelasi timp:
Line 268: Line 268:
 Pentru integrarea cu Unity, se poate folosi pachetul din Asset Store [[https://​assetstore.unity.com/​packages/​tools/​network/​darkrift-networking-2-95309|DarkRift Networking 2]] Pentru integrarea cu Unity, se poate folosi pachetul din Asset Store [[https://​assetstore.unity.com/​packages/​tools/​network/​darkrift-networking-2-95309|DarkRift Networking 2]]
  
 +Folosind un server dedicat trebuie gestionate mai multe elemente:
 +  * conexiunile si lista curenta de clienti conectati
 +  * datele stocate despre player
 +  * mesajele de update
 +
 +DarkRift foloseste un sistem modular, bazat pe plugin-uri C#, pentru implementarea serverului.
 +Astfel, putem defini un plugin in felul urmator:
 +<​code>​
 +public class NetPlugin : Plugin
 +{
 +
 +    Dictionary<​IClient,​ Player> players = new Dictionary<​IClient,​ Player>​();​
 +
 +    public override bool ThreadSafe => false;
 +
 +    public override Version Version => new Version(1, 2, 5);
 +
 +    public NetPlugin(PluginLoadData pluginLoadData) : base(pluginLoadData)
 +    {
 +        ClientManager.ClientConnected += ClientConnected;​
 +        ClientManager.ClientDisconnected += ClientDisconnected;​
 +    }
 +}
 +</​code>​
 +unde clasa Player reprezinta datele stocate despre player. Spre exemplu se pot stoca date legate de pozitie, rotatie sau id de utilizator.
 +<​code>​
 +public struct Player
 +{
 +    public ushort ID;
 +    public float X, Y, Z;
 +    public float rotX, rotY, rotZ;
 +}
 +</​code>​
 +
 +In momentul in care se conecteaza un client, trebuie realizate urmatoarele lucruri:
 +  * instantierea Player-ului in server
 +  * notificarea tuturor celorlalti clienti conectati de conectarea unui nou player
 +  * trimiterea de informatii despre ceilalti clienti, clientului nou conectat
 +  * ascultarea de mesaje de actualizare
 +
 +<code c#>
 +void ClientConnected(object sender, ClientConnectedEventArgs e)
 +    {
 +        //new player instance
 +        Player newPlayer = new Player();
 +        newPlayer.ID = e.Client.ID;​
 +        newPlayer.X = 0;
 +        newPlayer.Y = 3;
 +        newPlayer.Z = 0;
 +        newPlayer.rotZ = 0;
 +        newPlayer.rotY = 0;
 +        newPlayer.rotZ = 0;
 +
 +        using (DarkRiftWriter newPlayerWriter = DarkRiftWriter.Create())
 +        {
 +            newPlayerWriter.Write(newPlayer.ID);​
 +            newPlayerWriter.Write(newPlayer.X);​
 +            newPlayerWriter.Write(newPlayer.Y);​
 +            newPlayerWriter.Write(newPlayer.Z);​
 +            newPlayerWriter.Write(newPlayer.rotX);​
 +            newPlayerWriter.Write(newPlayer.rotY);​
 +            newPlayerWriter.Write(newPlayer.rotZ);​
 +
 +            //notify other clients
 +            using (Message newPlayerMessage = Message.Create(0,​ newPlayerWriter))
 +            {
 +                foreach (IClient client in ClientManager.GetAllClients().Where(x => x != e.Client))
 +                    client.SendMessage(newPlayerMessage,​ SendMode.Reliable);​
 +            }
 +        }
 +
 +        players.Add(e.Client,​ newPlayer);
 +
 +        using (DarkRiftWriter playerWriter = DarkRiftWriter.Create())
 +        {
 +            foreach (Player player in players.Values)
 +            {
 +                playerWriter.Write(player.ID);​
 +                playerWriter.Write(player.X);​
 +                playerWriter.Write(player.Y);​
 +                playerWriter.Write(player.Z);​
 +                playerWriter.Write(player.rotX);​
 +                playerWriter.Write(player.rotY);​
 +                playerWriter.Write(player.rotZ);​
 +            }
 +            ​
 +            //send all other players data to new client
 +            using (Message playerMessage = Message.Create(0,​ playerWriter))
 +                e.Client.SendMessage(playerMessage,​ SendMode.Reliable);​
 +        }
 +
 +        e.Client.MessageReceived += MovementMessageReceived;​
 +    }
 +</​code>​
  
 ==== Steam ==== ==== Steam ====
Line 285: Line 379:
 ... ...
  
-=== Cerinte ===+===== Cerinte ​=====
  
 Realizarea unui joc multiplayer (network) Realizarea unui joc multiplayer (network)
pjv/laboratoare/08.1578495993.txt.gz ยท Last modified: 2020/01/08 17:06 by alexandru.gradinaru
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0