PlayerIO Урок 3 - Создание клиента

Привет. Продолжу серию статей по PlayerIO и в этом уроке мы напишем простой клиент. Дабы не усложнять задачу установкой дополнительного софта, мы напишем клиент как консольное приложение. Все что нам нужно у нас уже есть, и поэтому перейдем к написанию.

Создание и настройка проекта
Как создать проект я писал во втором уроке. Создать нужно лишь с одним изменением — выбрать не Class Library, а Console Application. Имя вводим GameClient. После чего мы увидим такой скрин:

Далее подключаем библиотеку «PlayerIOClient.dll» из папки(папка находится в архиве, который вы распаковали в первом уроке) «Player.IO Client .NET»(раздел «Подготовим проект», п.4). Все, пишем код!

Кодим код
1. Первая операция — подключения пространства имен:

using PlayerIOClient;




2. Ну и начинка, которую я прокомментировал:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PlayerIOClient;

namespace GameClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Connection connection = null;//сылка для подключение
            Console.WriteLine("Подключение...");
            //соединяемся с сервером
            PlayerIO.Connect("myfirstgame-xeqjx57wueuiaxe2uyyw", "public", "player" + new Random().Next(1,int.MaxValue), null, null, 
                //этот делегат вызовится в случае успешного подключения к серверу
                (client) =>
            {
                Console.WriteLine("Подключились к серверу!");
                client.Multiplayer.CreateJoinRoom("TestRoom", "MainRoom", true, null, null, 
                    //этот делегат вызовится в случае успешного подключения/создания комнаты
                    (conn) =>
                {
                    Console.WriteLine("Подключились к комнате!");
                    //начинаем слушать сообщения
                    conn.OnMessage += (o, message) =>
                    {
                        //полученное сообщение обрабатываем
                        switch (message.Type)
                        {
                            case "sendall":
                                var text = message.GetString(0);//читаем строку
                                Console.WriteLine("[MESSAGE]" + text);
                                break;
                        }
                    };

                    connection = conn;
                }, 
                //вызовится в случае ошибки подключения/создания комнаты
                (error) =>
                {
                    Console.WriteLine("JOIN ERROR:" + error.ErrorCode.ToString());
                    Console.ReadKey();
                    Environment.Exit(1);//закрываем приложение
                });
            }, 
            //вызовится в случае ошибки подключения к серверу
            (error) =>
            {
                Console.WriteLine("CONNECT ERROR:" + error.ErrorCode.ToString());
                Console.ReadKey();
                Environment.Exit(1);//закрываем приложение
            });

            //получаем команды с консоли
            string comm = "";
            //если команда "exit" - то приложение завершится
            while ((comm = Console.ReadLine()) != "exit")
            {
                //проверяем подсоединены ли мы к серверу и находимся ли в комнате
                if (connection != null && connection.Connected)
                {
                    //создаем сообщение и отправляем на сервер
                    Message message = Message.Create("sendall");
                    message.Add(comm);
                    connection.Send(message);
                }
                else
                {
                    Console.WriteLine("Ожидание подключения...");
                }
            }
            //конец программы. Завершаем работу с сервером
            if (connection != null)
                connection.Disconnect();
        }
    }
}


Сonsole.WriteLine и Console.ReadLine — это стандартные методы консоли, они не относятся к PlayerIO.

Теперь по порядку, как это работает:
1. Подключаемся к серверу с помощью PlayerIO.Connect.
Первый параметр — это Game ID, который написан в админ-панели на сайте

Второй — соединение, ставим по умолчанию public. По сути эти соединения нужны что настроить права доступа к игре, но нам это не нужно на первых порах.

Третий — идентификатор пользователя. Это может быть число, имя, или пароль+имя. В данном случае я генерирую случайное число и прибавляю в начале «player».

Четверый — это данные для аутентификации пользователя, т.е. данные для проверки достоверности того, что именно этот пользователь владеет этим аккаунтом. Как это реализовать я напишу в будущих статьях. А пока ставим null.

Пятый — номер партнера. Сам еще пока не разобрался, но это нужно для приглашений оО. ставим null.

Шестой — это делегат(функция), который сработает при успешном подключении к серверу

Седьмой — делегат, который сработает при возникновении ошибки подключения

Возможно, для новичков тема делегатов покажется непонятной, но это те же функции, только объявлены сразу, а не отдельно.

нас интересует успешное подключение. Если подключились, то пробуем подключиться(если нет, то создать) к комнате с помощью метода client.Multiplayer.CreateJoinRoom(client — это парамерт делегата). Рассмотрим параметры:
Первый — название комнаты. Наше название — TestRoom

Второй — тип комнаты. Помните, когда писали сервер, мы указывали атрибут [RoomType(«MainRoom»)]? Вот то, что в скобках и есть тип, т.е. MainRoom

Третий — видимость. Если не хотите, чтобы комната была видна в списке комнат, то ставим false. Но мы этого хотим(неявно:)), поэтому ставим True.

Четвертый — RoomData — тут можно хранить данные о комнате, например число мностров, или статистику какую-нибудь. Мы оставим это поле пустым, т.е. null

Пятый — JoinData — в этом параметре можно передавать данные, которые можно вытянуть во время UserJoined на стороне сервера. Т.е. если мы хотим передавать в начале игры имя игрока серверу, то можно включить их в этот список и передать его на сервер. Опять же, пока нам это не нужно и мы пишем null

Шестой и седьмой — делегаты на успешное и не успешное выполнение команды создания/подключения комнаты.

После того, как подключились к комнате, нужно начать прослушивать сообщения от сервера. Для этого мы подключаем к событие OnMessage делегат:

conn.OnMessage += (o, message) =>
                    {
                        //полученное сообщение обрабатываем
                        switch (message.Type)
                        {
                            case "sendall":
                                var text = message.GetString(0);//читаем строку
                                Console.WriteLine("[MESSAGE]" + text);
                                break;
                        }
                    };


Как и на сервере, обрабатываем сообщения.

Чтобы отправить сообщение серверу, нужно сделать следующее:

 //создаем сообщение и отправляем на сервер
                    Message message = Message.Create("sendall");//создать
                    message.Add(comm);//добавить данные
                    connection.Send(message);//отправить

connection — Это переменная, которую мы объявили в начале метода Main, и присвоили когда успешно подключились к комнате:

 connection = conn;


В конце мы принимаем с консоли вводимые строки. Если строка равна exit, то завершаем программу, иначе отправляет ее на сервер.

Запуск
Если вы уже залили сервер(первый урок), то можно запускать клиент. Нажимаем F5 и появляется окно консоли. Ждем пока появится запись «Подключились к комнате!»:

Это говорит о том, что вы не криворукий и сумели написать простенькое клиент-серверное приложение:) Поздравляю вас! Вводим строки, смотрим на результат:)
Для большего эффекта перейдите в папку с проектом, далее bin/Debug и запустите несколько консольных приложений(файл «GameClient.exe»), а затем начните сообщать:


Вроде все просто:)

Естественно, мы коснулись примерно 10% того, что есть в PlayerIO, но уже на базе этого можно создать простенькую игрулю. Впереди еще «База Данных» и еще пару вещей, которые вам понадобятся.

Удачи в освоении, читатель:)!

С уважением, Александр.

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.